Введение
Как правило, дополнительная настройка GRUB не требуется, все необходимые файлы устанавливаются на компьютер самостоятельно во время инсталляции ОС Linux. Нет необходимости заново устанавливать загрузчик, если, например, пользователю нужно провести конфигурацию, так как в этом случае следует только редактировать содержимое /boot/grub/ menu.lst.
Как произвести правильную установку и настройку — в статье ниже
Установка GRUB целесообразна в том случае, если его физически не существует на устройстве, иными словами, он может быть стёрт после инсталляции другой системы (чаще всего Windows). Иногда случается и такое, что копии загрузчика не функционируют должным образом или GRUB, по желанию владельца ПК, заменяется другим типовым загрузчиком. Какими бы ни были причины, установка GRUB, в любом случае, должна производиться исключительно с «живой» системы (Knoppix, например). Дело в том, что без функционирующего загрузчика, запустить на ПК дистрибутив Linux, который располагается на жёстком диске, попросту не выйдет. В статье рассмотрим способы установки и настройки загрузчика GRUB.
Загрузчик позволяет выбрать, какую запустить операционную систему
Определение разделов
Теперь нужно определить раздел диска, на котором был установлен GRUB.
Выведем список разделов, для этого выполняем команду (в конце команды стоит строчная буква L):
Вывод fdisk для BIOS
Пример вывода команды:
В моем случае мы видим 2 диска: /dev/sda (SSD диск) и /dev/sdb (флешка, с которой сейчас загружена Live-система).
Нас интересует диск /dev/sda. На диске /dev/sda создано несколько разделов. В моем случае /dev/sda4, на котором установлен Windows, а также 4 раздела с пометкой Linux (см. последний столбец таблицы). У вас скорее всего может быть один раздел Linux (корневой раздел) или два раздела (корневой и home). На одном из этих разделов установлен GRUB.
То есть из таблицы вы должны определить какой раздел является корневым, на нем скорее всего у вас установлен GRUB. В моем случае GRUB установлен в раздел /dev/sda2. Далее по тексту я буду его использовать (вы должны будете указывать свой раздел).
Иногда бывает, что для загрузчика GRUB выделен отдельный раздел (он называется boot-раздел). Если это так, то на следующем шаге вам нужно будет примонтировать корневой раздел и раздел с загрузчиком.
Вывод fdisk для UEFI
Для новых компьютеров с UEFI вывод команды fdisk -l может быть примерно следующим:
Нам нужно определить, на каком разделе установлен Linux (корневой раздел), а также определить EFI-раздел. В моем случае это разделы: /dev/nvme0n1p5 и /dev/nvme0n1p1, которые расположены на диске /dev/nvme0n1.
Устранение проблем
Чтобы получить больше информации по устранению ошибок в GRUB2, пожалуйста, проверьте статью Troubleshooting.
Большую часть проблем можно устранить, проверив правильность таблицы разделов. Убедитесь, что перед первым разделом диска достаточно свободного места или убедитесь, что загрузочный раздел BIOS доступен. Также убедитесь в том, что файл /boot/grub/grub.cfg был правильно сгенерирован командой grub-mkconfig, или сгенерируйте его с индивидуальным пунктом меню.
os-prober not running
When running the grub-mkconfig command, os-prober is not running as expected, even though it is installed:
Generating grub configuration file ... Found linux image: /boot/vmlinuz-5.11.14-gentoo-x86_64 Found initrd image: /boot/amd-uc.img /boot/initramfs-5.11.14-gentoo-x86_64.img Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry. Adding boot menu entry for UEFI Firmware Settings ... done
This can be corrected by setting the GRUB_DISABLE_OS_PROBER variable to in /etc/default/grub file.
Файл
GRUB_DISABLE_OS_PROBER=false
Upon the next run, grub-mkconfig should find additional bootable partitions:
Generating grub configuration file ... Found linux image: /boot/vmlinuz-5.11.14-gentoo-x86_64 Found initrd image: /boot/amd-uc.img /boot/initramfs-5.11.14-gentoo-x86_64.img Warning: os-prober will be executed to detect other bootable partitions. It's output will be used to detect bootable binaries on them and create new boot entries. Found Windows Boot Manager on /dev/nvme0n1p2@/efi/Microsoft/Boot/bootmgfw.efi Adding boot menu entry for UEFI Firmware Settings ... done
Прошивка материнской платы не находит файл .EFI
Некоторые производители материнских плат поддерживают только одно расположение файла .EFI, в системном разделе EFI (ESP). Если это ваш случай, просто переместите файл GRUB по умолчанию в /efi/boot/. Сначала убедитесь, что ESP примонтирован. Предполагая, что ESP примонтирован в /boot/efi (как предлагается в Handbook), запустите:
You can also use the removable parameter with grub-install command to generate this file automatically:
Installation finished. No error reported.
Это должно помочь прошивке материнской платы загрузить исполняемые файлы GRUB. Перезагрузите систему чтобы убедиться, что прошивка запускает GRUB корректно.
os-prober и UEFI в chroot
Запустите эти команды в окружении реального хоста, чтобы предоставить необходимые файлы (пример подразумевает, что Gentoo смонтирована в /mnt/gentoo как это было в Handbook):
Через командную строку при частичном доступе к файловой системе
Иногда загрузчик Grub повреждён не настолько сильно, что не может загрузиться вся система. Например, загрузочный раздел остаётся целым, но сама утилита не имеет к нему доступа. В таком случае открывается программная оболочка, чем-то похожая на командную строку, и выводится сообщение следующего содержания: Minimal BASH like line editing is supported. Вот с помощью этой командной строки можно попробовать выполнить загрузку Ubuntu.
От вас ожидается, что вы точно уверены и знаете, на каком из винчестеров помещена система и ядро. Имеющихся команд всего четыре, их нужно применять последовательно:
- Чтобы система отсканировала диски и разделы, задайте команду ls. В качестве ответа вы получите список жёстких дисков (например, hd1, hd2), а также тип файловой системы на них (например, msdos1, msdos2). К примеру, будем считать, что загрузочный раздел расположен в /dev/sda1.
- Далее нужно выбрать тот раздел, с которым вы желаете работать. В нашем случае команда будет записываться следующим образом: set root=(hd1,1).
- Загрузите обычную оболочку Grub: insmod ext2, insmod normal, normal.
- Запустите ядро Linux: linux /boot/vmlinuz.
- Загрузите систему: boot.
- После запуска Ubuntu в обычном режиме откройте терминал и закончите процедуру восстановления загрузчика следующими командами:
- Перезагрузитесь и радуйтесь нормальной работе.
Способ 1
Что делать в случае ошибки unknown filesystem grub-rescue? Перед вами окно, в котором можно использовать только 4 команды, их вполне достаточно, чтобы исправить все проблемы и успешно загрузиться:
- ls — позволяет вывести всё содержимое;
- set — применяется для установки переменных;
- unset — очищает переменную;
- insmod — необходима для загрузки модулей.
Также можно сделать доступным ряд других команд. Сделать их доступными можно, загрузив модуль «normal». Для этого пропишите:
После этого станут доступны:
- dump — для очистки памяти;
- exit — команда выхода из загрузчика;
- chainloader — необходима, чтобы указать последующей команде boot передать управление цепочечному загрузчику;
- kfreebsd — несколько команд, позволяющих загрузить ядро FreeBSD, его модули;
- rmmod — позволяет выгрузить указанный модуль ядра;
- multiboot.
Первым делом нужно отыскать модули, чтобы загрузить их. Для этого введите:
Результатом выполнения команды будет следующее:
Из этого можно сделать вывод, что загрузчик не может определить файловые системы дисков, поэтому определяет их как msdos. Теперь необходимо угадать видимые диски. В конкретном примере перед вами два диска: hd0 (с тремя разделами) и hd1 (с двумя разделами). Допустим, вы знаете, что Linux инсталлирован на диск, который имеет три раздела. В таком случае вам нужен диск с индексом «0».
GRUB даёт названия разделам в обратном порядке. В связи с этим, неясно как трактовать запись: «(hd0,msdos3)». Ведь можно посчитать это как первым разделом, так и третьим. К счастью, из этой ситуации можно выйти при помощи такого синтаксиса команды: «(hd0,1)»
Обратите внимание, что в программе-загрузчике GRUB отсчёт дисков идёт с 0, а разделов с 1
Допустим, что Линукс хранится в первом разделе, тогда он будет обозначаться (hd0,1). В этом случае команда, которую необходимо прописать, будет иметь вид:
Теперь модули могут быть загружены. Использовать их можно только после загрузки.
После того как вы выбрали нужный диск, проверьте содержится ли там то, что нужно. Для этого пропишите:
В результате выполнения на экране появится список md файлов.
Далее, пропишите:
После этого загрузчик будет переведён в режим полной функциональности. Затем автоматически будут найдены разделы с операционной системой, и откроется меню программы.
Теперь остаётся загрузить Linux. Делается это при помощи команды:
Действия оператора (только при ручной загрузке)
Если систему нужно запустить в однопользовательском режиме, оператор устанавливает в командной строке специальный флаг (слово “”), а ядро передает эту информацию демону . Последний, в свою очередь, передает управление команде — специальной версии команды , — которая выдает приглашение ввести пароль пользователя root. Если он введен правильно, запускается интерпретатор команд с правами суперпользователя. Можно не задавать пароль, а просто нажать <>, после чего загрузка продолжится в многопользовательском режиме.
В однопользовательском режиме команды выполняются почти так же, как и в полностью загруженной системе. Однако в SUSE, Debian и Ubuntu обычно монтируется только корневой раздел. Чтобы можно было использовать программы, находящиеся вне каталогов , или , необходимо вручную смонтировать остальные файловые системы.
Во многих однопользовательских средах корневой каталог файловой системы монтируется в режиме только для чтения. Если является частью корневой файловой системы, выполнение множества команд, которые используют временные файлы (таких как ), будет невозможно. Чтобы выйти из положения, придется начать однопользовательский сеанс с повторного монтирования каталога в режиме чтения/записи. Нужное действие выполняет команда:
Команда , которая проверяет и восстанавливает поврежденные файловые системы, обычно выполняется в ходе автоматической загрузки. Если система запускается в однопользовательском режиме, команду придется вводить вручную.
Когда интерпретатор команд однопользовательского режима завершит свою работу, система продолжит загрузку в многопользовательском режиме.
Выполнение сценариев запуска системы
В тот момент, когда система сможет выполнять сценарии запуска, ее уже можно назвать Linux. Это еще не полностью загруженная система, но “загадочных” этапов процесса загрузки больше не осталось. Файлы сценариев представляют собой обычные командные файлы, которые выбираются и запускаются демоном init по сложному, но, в общем-то, понятному алгоритму.
Точное местонахождение, содержимое и организация сценариев запуска заслуживают отдельного изучения.
Работа в многопользовательском режиме
После выполнения сценариев запуска система полностью готова к работе, за одним исключением: никто не может в нее войти. Для того чтобы с конкретного терминала (включая системную консоль) можно было зарегистрироваться в системе, должен быть запущен процесс , ожидающий поступления запросов от этого терминала. Демон порождает все необходимые процессы , заканчивая этап начальной загрузки. Если система сконфигурирована для работы в графическом режиме, демон init также порождает соответствующие регистрационные процессы, такие как xdm или gdm.
Не забывайте о том, что демон продолжает играть важную роль даже по завершении начальной загрузки. У него есть один однопользовательский и несколько многопользовательских “уровней выполнения”, определяющих, какие ресурсы системы будут доступны пользователю.
Первые шаги
При первом сравнении GRUB со старым GRUB Legacy самым весомым различием оказывается измененная структура файлов конфигурации.
Настройка GRUB производится теперь принципиально иным способом — основным файлом конфигурации является «/boot/grub/grub.cfg«. Однако же, не торопитесь править его так, как привыкли это делать с «menu.lst» в GRUB Legacy. При внимательном прочтении мы видим в начале файла «grub.cfg» такие строки:
# # DO NOT EDIT THIS FILE # # It is automatically generated by /usr/sbin/grub-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub #
И об этом нас предупреждают не просто так. Ведь «grub.cfg» генерируется автоматически с использованием нескольких скриптов. Поэтому после следующего обновления GRUB ваш «grub.cfg» будет создан заново, и все ваши правки будут утрачены.
Кроме файла «grub.cfg», отвечающего за загрузочное меню, имеются файл «/etc/default/grub» и папка «/etc/grub.d«. Рассмотрим их подробнее.
Способ 2
Всё сильно упрощается, если использовать Live CD – загрузочный диск с системой Linux
Он может быть записан на флешке, на внешнем винчестере или на обычном диске – это неважно, главное, чтобы с него можно было загрузить компьютер
После загрузки Linux стандартным способом устанавливается бесплатная утилита Boot Repair. Она предназначена именно для устранения ошибок загрузки с помощью загрузчика Grub и очень проста в использовании – достаточно кликнуть по кнопке.
Заметим, что иметь Live CD для линуксоида всегда полезно и даже необходимо. Это зачастую избавляет от множества проблем, так как позволяет загрузить полноценную систему с внешнего носителя и использовать весь её инструментарий. Скачать такой диск с любой версией Linux не представляет сложностей, в комплекте обычно идёт инструкция по записи его на флешку.
Установка Grub на флешку
Если вы устанавливаете на фшелку дистрибутив, то у вас не возникнет никаких проблем с установкой загрузчика. Он устанавливается так же, как и при установке на жесткий диск. Вам достаточно перейти в chroot окружение новой системы, подключить все ее разделы, а затем просто установить загрузчик командой:
И создать конфигурационный файл:
Но если вам нужен загрузчик без операционной системы, то дело немного усложняется. Вы не можете использовать просто grub-install, а конфигурация вообще не будет создана, так как утилита не понимает где находятся файлы загрузчика и файлы конфигурации для него. Но есть решение.
Важно заметить, что при любом способе установки загрузчика, желательно, чтобы на флешке использовалась таблица разделов MBR. Конечно, я не встречал флешек с GPT, но вы сами можете ее создать при желании, а тогда с установкой загрузчика возникнут проблемы
Второе, что важно заметить, фшелку желательно отформатировать в файловую систему fat32. Это важно, чтобы там можно было разместить файлы Grub. Потому что если флешка будет форматирована в NTFS, то ничего не выйдет, а в ext4 — то вы не сможете подключить ее в Windows и использовать для обмена файлами.
Далее подключите флешку в какую-нибудь папку, например, mnt:
Имя устройства /dev/sdb1 — это адрес первого раздела на вашей флешке. Обычно там есть только один раздел, так и должно быть. Если больше, то берите первый. А имя флешки может отличаться — sdb, sdc, sdd или другие. Смотрите как флешка называется у вас с помощью fdisk:
Когда устройство подключено мы можем перейти к установке загрузчика:
Здесь мы указываем параметр —root-directory, это та папка, которая будет считаться корнем системы, и откуда будут браться файлы загрузчика при старте. Установщик автоматически скопирует их туда. Устройство /dev/sdc — ваша флешка. После того, как установка будет завершена, можно перейти к настройке пунктов меню. Забегая наперед, если эта команда не работает, используйте опцию —boot-directory вместе с —root-directory, разные версии Grub работают по разному:
Теперь нужно создать конфигурационный файл. Если вы используете grub-mkconfig, то получите такое же меню, как в вашей основной системе. Меня это вполне устраивает, только укажите правильное расположение файла, в папке /mnt:
Теперь нам осталось протестировать как все работает. Для этого лучше использовать qemu:
Если возникли ошибки вы можете их быстро исправить не перезагружая компьютер. В дальнейшем, когда вам понадобятся новые пункты меню, вы можете добавить их вручную. Этот конфигурационный файл не будет стерт при обновлении системы, поскольку он на флешке.
2. OpenRC
OpenRC — это система инициализации Linux и Unix подобных операционных систем совместимая с Sys V Init и поддерживающая систему зависимостей во время запуска. Она приносит некоторые улучшения в SysV, и как и другие системы инициализации Linux, совместима с ней, но вы должны иметь в виду, что OpenRC не заменяет полностью файл /sbin/init. Эта система инициализации используется в Gentoo и дистрибутивах BSD.
Кроме стандартных возможностей SysV, здесь поддерживается также:
- Поддержка зависимостей служб;
- Поддержка параллельного запуска служб;
- Поддерживает настройку в одном отдельном файле;
- Работает как демон;
По сравнению с SysV тут появилось много новых возможностей, но все еще не все те, что нужны для оптимальной работы системы.
Установка нового ядра
Каждый раз после установки нового ядра, необходимо переконфигурировать GRUB2, чтобы он увидел его. Это можно сделать с помощью команды grub-mkconfig, как это было показано выше, или это можно .
ЗаметкаПеред выполнением следующей команды убедитесь, что раздел /boot смонтирован.
Generating grub.cfg ... Found linux image: /boot/kernel-3.3.8-gentoo Found initrd image: /boot/initramfs-genkernel-x86_64-3.3.8-gentoo Found linux image: /boot/kernel-3.2.12-gentoo Found initrd image: /boot/initramfs-genkernel-x86_64-3.2.12-gentoo done
Обратите внимание, что GRUB2 необходимо только переконфигурировать, а не переустановливать в Master Boot Record (MBR) загрузочного диска. С другой стороны, когда обновляется сам GRUB2, его необходимо переустановить на загрузочный диск, но, как правило, его не нужно переконфигурировать.
Установка загрузчика Grub в MBR для BIOS
Начнем с самого просто и привычного. Данная инструкция как установить загрузчик Grub подойдет для любого дистрибутива, поскольку команды везде почти одинаковые. Здесь не нужно устанавливать никаких дополнительных пакетов или создавать разделов. Установка Grub на жесткий диск выполняется командой:
Или:
Или:
Готово. По поводу двойки здесь такое же замечание. Если вы хотите установить Grub на флешку в MBR, то тут тоже нет проблем просто примонтируйте флешку и выполните такую команду:
Здесь /mnt/USB — папка, куда была смотирована ваша флешка, а /seb/sdb — сама флешка. Только здесь есть одна проблема, конфигурационный файл придется делать вручную.
Установка Grub Customizer в Ubuntu
Установить Grub Customizer в Ubuntu не составит труда, в Ubuntu 19.04 это можно сделать с помощью менеджера приложений (в предыдущих версиях Ubuntu возможно потребуется устанавливать PPA репозиторий).
Сначала запускаем менеджер приложений, и для того чтобы найти нужный пакет в поиск, вводим grub сustomizer.
Шаг 2 – Запускаем установку Grub Customizer
Затем щелкаем по найденному пункту. После того как откроется окно с описанием программы, нажимаем «Установить».
Далее потребуется ввести пароль, так как процесс установки программ в Ubuntu требует дополнительных привилегий.
Шаг 3 – Запускаем программу Grub Customizer
Когда появится кнопка «Запустить», установка будет завершена. Мы можем нажать на данную кнопку, чтобы сразу запустить Grub Customizer. Также программу можно запустить и из меню приложений.
Для запуска программы снова потребуется ввести пароль, так как изменение порядка загрузки операционных систем в GRUB также требует дополнительных прав.
После запуска программы у Вас отобразится интерфейс Grub Customizer.
Как удалить загрузчик Grub и восстановить Windows
Если на вашем компьютере установлено две операционные системы, Windows и Linux, и вы хотите стереть Linux и его загрузчик, восстановив загрузчик Widows, и у вас используется таблица MBR, то это сделать очень просто.
В сети часто советуют способ: взять установочный диск Windows, загрузиться с него в режиме восстановления и выполнить команды:
Это действительно ответ на вопрос «как удалить Grub и восстановить загрузчик Windows?», и он работает. Но есть способ намного проще. Вам даже не придётся перезагружать компьютер. Утилита Bootice позволяет восстановить загрузчик Windows и удалить Grub с жёсткого диска в несколько кликов.
Затем Windows NT 5.x / 6.x MBR:
И нажмите кнопку Config / Install:
Дальше остаётся только выбрать нужную версию MBR, в нашем случае Windows 7,8,10 — Windows NT 6.x:
И готово: вы смогли успешно полностью удалить загрузчик Grub. Можете перезагружаться и проверять.
1.7 SMP Загрузка на x86
В случае SMP (многопроцессорной системы), первичный процессор
проходит обычную последовательность — bootsector, setup и т.д.,
пока не встретится вызов функции , в
которой стоит вызов функции , откуда
вызывается .
Функция в цикле (от 0 до
) вызывает для
каждого apicid. Функция создает (т.е.
) фоновую задачу для указанного CPU и
записывает, согласно спецификации Intel MP (в 0x467/0x469)
трамплин-код, содержащийся в . Затем
генерирует STARTUP IPI, заставляя вторичный процессор выполнить код
из .
Ведущий процессор создает трамплин-код для каждого процессора в
нижней памяти. Ведомый процессор, при исполнении
«трамплина», записывает «магическое число»,
чтобы известить ведущий процессор, что код исполнен. Требование, по
размещению трамплин-кода в нижней памяти, обусловлено спецификацией
Intel MP.
Трамплин-код просто записывает 1 в %bx, переводит процессор в
защищенный режим и передает управление на метку startup_32, которая
является точкой входа в .
При исполнении кода , ведомый CPU
обнаруживает, что он не является ведущим, перепрыгивает через
очистку BSS и входит в которая
переходит в фоновую задачу для данного CPU — минуя вызов
, поскольку она уже была
проинициирована ведущим процессором при исполнении
.
Характерно, что код init_task может использоваться совместно, но
каждая фоновая задача должна иметь свой собственный TSS. Именно
поэтому является массивом.
Планировщик процессов
Задачей планировщика процессов процессов является извлечение процессов, готовых на выполнение, в соответствии с некоторыми правилами. Планировщик старается распределить процессорные ресурсы так, чтобы ни один из процессов не простаивал длительное время, и чтобы процессы, считающиеся приоритетными, получали процессорное время в первую очередь. В многопроцессорных системах желательно, чтобы в последовательных квантах времени процесс запускался на одном и том же процессоре, чтобы максимально использовать процессорный кэш. При этом сам планировщик должен выполнять выбор как можно быстрее.
Простейшая реализация очереди в виде FIFO очень быстра, но не поддерживает приоритеты и многопроцессорность. В Linux 2.6 воспользовались простотой FIFO, добавив к ней несколько усовершенствований:
- Было определено 140 приоритетов (100 реального времени + 40 назначаемых динамически), каждый из которых получил свою очередь FIFO. На запуск выбирается первый процесс в самой приоритетной очереди.
- В многопроцессорных системах для каждого ядра был сформирован свой набор из 140 очередей. Раз в 0,2 секунды просматриваются размеры очередей процессоров и, при необходимости балансировки, часть процессов переносится с загруженных ядер на менее загруженные
- Динамический приоритет назначается процессу в зависимости от отношении времени ожидания ресурсов к времени пребывания в состоянии выполнения. Чем дольше процесс ожидал ресурс, тем выше его приоритет. Таким образом, диалоговые задачи, которые 99% времени ожидают пользовательского ввода, всегда имеют наивысший приоритет.
Прикладной программист может дополнительно понизить приоритет процесса функцией (в Linux — интерфейс к вызову ). Большее значение означает меньший приоритет. В командной строке используется «запускалка» с таким же именем:
Включение устройства
В момент запуска компьютера, в первую очередь начинает запускаться непосредственно сам BIOS. В этот момент происходит считывание данных, хранящихся в MBR первого диска. Спустя несколько секунд, содержимое «идёт» к оперативной памяти, где происходит проверка на наличие в последних байтах шестнадцатеричных кодов 55 АА. Такая проверка заключается в необходимости идентифицировать носители для их последующей загрузки. Небольшая программка, хранящаяся в MBR, необходима при совпадении представленных кодов. Первая программа «цепляет» следующую, расположенную в загрузочном секторе активного раздела, чтобы впоследствии активировать её, и, как следствие, запустить ОС Windows.
В случае наличия не одного жёсткого диска, пользователь может настроить в BIOS порядок, согласно которому будет производиться запуск конкретных жёстких дисков в момент загрузки системы. Благодаря этой особенности, новые ПК имеют возможность загружать систему как с внешнего диска, так и с USB-накопителя. Естественно, изменив порядок загрузки в BIOS, юзер может загружать систему посредством CD и DVD-дисков.
С помощью BIOS вы можете отрегулировать порядок загрузки носителей
Чтобы в будущем не приходилось разбираться с загрузчиками и думать о том, каким образом должна осуществляться настройка GRUB, пользователь должен знать, как установить две операционные системы от разных производителей таким образом, чтобы они не конфликтовали между собой. Как показывает практика, разумнее всего установить изначально загрузчик системы Linux, чтобы впоследствии иметь возможность выбора относительно запускаемой системы.
Однако, если на устройстве стоит одна из последних версий ОС от компании Microsoft (позднее 9х/ME), то в загрузчике системы можно сделать так, чтобы он самостоятельно «беспокоился» о GRUB. Огромным преимуществом такой возможности является отсутствие необходимости лишний раз разбираться с особенностями MBR. Правда, далеко не каждый современный юзер сможет самостоятельно произвести такую манипуляцию, так как процесс этот достаточно сложный. Всё придётся делать вручную.
Среди прочих способов, настроить нормальную работоспособность двух систем, можно прибегнув к дополнительной установке GRUB. Загрузчик необходимо расположить непосредственно в загрузочном секторе главного раздела и впоследствии отметить его в качестве активного. Этот метод также исключает необходимость использовать MBR, однако он может сработать только с основными разделами и файловыми системами, не влияющими на загрузочный сектор раздела.
загрузочный загрузчик
Ядро, которое для запуска использует uboot, — это uImage. Это ядро состоит из двух частей, одна из которых является заголовком, а другая — настоящим ядром. Таким образом вы можете выразить uImage = uboot header + zImage. Определение заголовка:
Нам нужно заботиться о том, чтобы:
ih_load — это адрес загрузки ядра, то есть там, где должно быть ядро до его запуска, ih_ep — это адрес входа в ядро, адрес входа и адрес загрузки могут совпадать.
Процесс загрузки ядра с помощью Uboot состоит в том, чтобы определить, как запустить ядро, прочитав bootcmd в переменной среды env. Например, uboot хочет прочитать раздел ядра с флэш-памяти nand по адресу памяти 0x30007FC0 и запустить ядро. Вы можете использовать следующую команду: bootcmd = nand read.jffs2 ядро 0x30007FC0, bootm 0x30007FC0. Ключом к запуску ядра является команда bootm. Реализация команды bootm находится в функции do_bootm () в uboot: Исходный файл: cmd_bootm.c
Сначала определите, следует ли за адресом загрузки команда bootm.Если параметр адреса загрузки не указан, адрес загрузки по умолчанию назначается для addr, в противном случае адрес, присоединенный к команде bootm, будет использоваться в качестве адреса загрузки. Затем ключ должен прочитать заголовок uboot с адреса загрузки и проанализировать его. Исходя из приведенной выше логики кода, мы видим, что он будет судить, согласован ли адрес загрузки, передаваемый ih_load и bootm в ubootheader, и, таким образом, различать два случая:
- (1) Если оно отличается, ядро (zImage) с удаленным заголовком (64Byte) будет скопировано по адресу, указанному в ih_load, и ядро будет запущено из ih_ep. Следовательно, в этом случае ih_load и ih_ep должны быть одинаковыми.
- (2) Если это то же самое, пусть он будет размещен там в целости и запускает ядро (zImage) из ih_ep. Следовательно, в этом случае существует разница заголовка uboot между адресом функции входа выполнения и адресом загрузки. Поэтому ih_ep = ih_load + 64Byte.
С учетом вышеизложенного знания, как нам установить адрес в заголовке uboot, фактически этот шаг заключается в использовании инструмента mkimage для указания адреса загрузки и рабочего адреса при создании uImage.
Есть две ситуации для создания зеркальных головок и загрузки адресов: Первое:
Адрес загрузки совпадает с адресом входа, а адреса, стоящие за tftp и bootm, являются произвольными адресами (за исключением адреса, указанного -a).
В этом случае uboot переместит ядро.Zimage, который не включает заголовок uboot, перемещается, поэтому адрес загрузки и адрес входа должны быть установлены одинаково. Что произойдет, если адрес за tftp и bootm также будет 0x30008000? Как видно из приведенного выше кода, если он один и тот же, он не будет выполнять действие транспорта, только печатать сообщение, а затем переходить к адресу записи для выполнения. В настоящее время адресом входа является заголовок uboot, который не является исполняемым zImage, поэтому Сообщит об ошибке. Второй тип:
Адрес записи составляет 64 байта после адреса загрузки, а адреса после tftp и bootm должны быть по адресу загрузки, указанному -a.
Как правило, мы привыкли использовать второй метод и загружать его по адресу, указанному -a, чтобы вам не приходилось беспокоиться об обработке загрузок, что экономит время запуска.
В приведенном выше do_bootm мы получили информацию, относящуюся к образу ядра, проанализировав заголовок uboot, который включает адрес входа в ядро, и на последнем этапе загрузки он перейдет к ядру для выполнения. Этот шаг реализован в функции do_bootm_linux (). Перейдите через указатель на функцию thekernel () с тремя параметрами к точке входа ядра (zImage) и начните выполнение. На этом этапе задача u-boot завершена, и управление полностью передано ядру (zImage).
do_bootm_linux (), определенный в arch \ arm \ lib \ bootm.c, потому что мы уже знаем адрес записи, поэтому просто перейдите к адресу записи, чтобы запустить ядро linux.
hdr-> ih_ep —- Адрес точки входа, точка входа в ядро, указанная в uImage, помните ih_ep? Второй параметр — это идентификатор машины, машинный код, установленный ядром, и машинный код, установленный uboot, должен быть согласован для запуска ядра, а третий параметр — это первый адрес, который u-boot передает параметрам ядра, хранящимся в памяти.
Установка GRUB UEFI GPT
Если же такого раздела нет, мы можем его создать с помощью gparted. Для этого создаем раздел с такими параметрами:
Размер 100 Мегабайт, имя раздела ESP, файловая система fat32. Дальше примените изменения и установите для раздела флаг ESP:
То же самое вы можете сделать в Gdisk, только на этот раз нужно устанавливать HEX Code раздела ef00. После того как раздел был создан, подключаем его к нашей файловой системе:
Здесь /dev/sda2 — это наш EFI раздел. Далее необходимо установить нужные пакеты, если они еще не установлены. В Ubuntu это будет выглядеть вот так:
Дальше останется только установка grub efi. Система сама определит нужный раздел и скопирует туда все файлы:
Установка Grub efi на MBR все выглядит точно так же, только тут есть несколько ограничений. Раздел ESP нужно создавать только в начале диска. В режиме EFI тоже можно установить GRUB на флешку, и это не очень сложно. Для этого используется команда:
Рассмотрим опции: —boot-directory — задает папку с файлами загрузчика на флешке, —efi-directory — папка куда смонтирован раздел efi, —target — архитектура целевой системы и —removable говорит, что это установка на съемный носитель. С UEFI все. После перезагрузки и выбора в меню EFI пункта связанного с Grub, вы получите доступ к привычному меню grub и сможете выбрать нужный параметр.