
Я использую CentOS 7 и подключил к нему несколько дисков. Я знаю, что моя ОС, ядро, initramfs и т. д. находятся на "/dev/sda", и это загрузочный диск. Но как grub2 это определяет? Проверяет ли он все подключенные диски по одному?
решение1
Технически: Linux не находит загрузочных дисков, потому что к моменту запуска Linux загрузчик уже выполнил свою работу, а именно:
- скопировать Linux из файла в оперативную память куда-нибудь
- скопируйте initramfs из файла в оперативную память
- на некоторых архитектурах, таких как ARM, — скопируйте дополнительные данные, такие как дерево устройств или дескриптор архитектуры, куда-нибудь в оперативную память
- передать управление в первое место в оперативной памяти, куда был скопирован Linux, и теперь загрузчик больше не активен.
Современная прошивка UEFI, а также вещи на платформах, отличных от x86, такие как U-Boot, будут иметь "загрузочные записи", хранящиеся в прошивке - загрузочная запись содержит устройство хранения и имя файла, а прошивка будет идти по порядку и загружать/запускать первый файл, который она найдет. Вы можете изменить порядок, зайдя в настройки UEFI и внеся изменения, или используя утилиту в вашей ОС для изменения настроек UEFI NVRAM.
Дело в том, что UEFI на x86 загружает в оперативную память один двоичный файл, но обычно Linux для загрузки требуется как минимум initramfs (хотя это не является строгим требованием Linux).
Кроме того, исторически x86 имела более примитивную прошивку (BIOS), которая просто загружала первый сектор с запоминающего устройства (порядок определялся настройками BIOS) и даже не пыталась искать/загружать файлы.
Вот почему в большинстве систем Linux то, что UEFI фактически загружает (то есть выполняет последовательность загрузки/поиск загрузочных устройств), это GRUB — это общая платформа загрузчика для Linux (и других операционных систем, если необходимо), которая фактически выполняет множество предзагрузочных действий, которыедолженбыть в прошивке, но по разным причинам этого не происходит, а также предоставляет вам среду для выполнения некоторых действий до загрузки операционной системы.
При установке Linux установщик настроит GRUB, создав файл конфигурации, к которому GRUB может получить доступ, и добавит записи в меню GRUB, которые сообщат GRUB, куда идти для загрузки ядра и initramfs. Возможны и даже распространены множественные записи — например, Debian установит второй пункт меню для спасательного ядра — примерно эквивалентно безопасному режиму Windows. Но все это задается установщиком при установке Linux, и вы получаете доступ к этим параметрам после того, как UEFI сделает свое дело.
(Кстати, мне понравилось в U-Boot то, что он загружает ядро и initramfs напрямую, так что GRUB вообще не нужен. Но это было устройство ARM с настраиваемой прошивкой).
У Windows есть свой собственный "GRUB", winload.exe
который делает то, что нужно Windows, и опционально предоставляет опции меню предзагрузки, перед загрузкой, которую прошивка тоже не делает. Вы используете его bcdedit
для изменения опций меню. Более ранние версии Windows, чем Vista, использовали NTLDR, и все можно было настроить с помощью файла C:\boot.ini IIRC.
Linux не требует GRUB — долгое время использовался более простой загрузчик LILO (Linux Loader), и некоторые дистрибутивы, вероятно, до сих пор его используют.