
Некоторые примеры, найденные в сети, говорят, что update-grub следует запускать ПОСЛЕ grub-install. Другие делают наоборот. Какой из них правильный?
Если у меня есть две установки Linux (одна на sda и одна на sdb), если я запускаю update-grub на установке sda, он поместит установку sda в верхнюю часть меню загрузки. Если я запускаю update-grub на установке sdb, он поместит установку sdb в верхнюю часть меню.
Если предположить, что DEFAULT=0, это должно, теоретически, позволить мне выбрать ОС, выбрав загрузочное устройство в BIOS. Изменяет ли "grub-install /dev/sda" загрузочное меню sda, чтобы оно соответствовало последнему "update-grub", независимо от того, было ли оно запущено из версии Linux sda или sdb?
решение1
update-grub
, по крайней мере в Debian и его родственниках, таких как Ubuntu, по сути, просто обертка вокруг grub-mkconfig
. Так что он создает/обновляет/регенерирует GRUBконфигурация, а не сам загрузчик.
Что grub-install
именно делает, зависит от того, какую версию GRUB вы используете: традиционный BIOS GRUB или UEFI GRUB?
С традиционным BIOS GRUB grub-install
(пере)пишет часть GRUB, встроенную в Master Boot Record, и закодирует в ней номера блоков физического диска, откуда читать следующую часть GRUB. Он также определит, с какого раздела /boot/grub/grub.cfg
будет считываться фактический файл конфигурации GRUB ( ). Важным фактором здесь является файл /boot/grub/device.map
, который сообщает GRUB, как нумерация устройств BIOS (и, следовательно, GRUB) сопоставляется с дисковыми устройствами Linux.
С UEFI GRUB основная часть загрузчика GRUB будет расположена в виде файла в системном разделе EFI, обычно как /boot/efi/EFI/<name of distribution>/grubx64.efi
или похоже. Это имя пути загрузчика хранится в системном NVRAM (= месте, где хранятся настройки BIOS) в переменных загрузки UEFI. Основная часть GRUB может быть полностью автономной (и должна быть таковой, если используется Secure Boot!) или может загружать дополнительную функциональность в виде модулей GRUB, обычно из каталога /boot/grub
дистрибутива Linux, частью которого он является.
Переменные загрузки UEFI идентифицируют диск, который система должна использовать для поиска системного раздела EFI и файла загрузчика внутри него. Вы можете просмотреть эти переменные самостоятельно, используя efibootmgr -v
команду. grub-install
Команда обновит эти переменные, если вы не используете --no-nvram
опцию, чтобы указать иное.
После запуска GRUB необходимо определить следующее: откуда он должен считывать свой файл конфигурации?
grub-install
имеет возможность вставить желаемое значение prefix
переменной GRUB непосредственно в основную часть GRUB. Этовстроенный префиксможно либо полностью указать путь, либо оставить некоторые части без определения во время выполнения, используя значения по умолчанию, специфичные для архитектуры.
При использовании традиционного BIOS GRUB встроенный префикс обычно не содержит фактический спецификатор диска, поэтому будет использоваться тот же диск, с которого был загружен GRUB. В этом случае сохраненный префикс будет, например, (,msdos1)/grub
когда
/boot
это первый первичный раздел на диске, на который установлен GRUB.
В случае UEFI GRUB встроенный префикс обычно указывает только каталог, а затем ссылается на каталог дистрибутива на системном разделе EFI (ESP). Поэтому типичный встроенный префикс будет /EFI/debian
или /EFI/redhat
или похожим. Значение по умолчанию для диска и раздела будет "тот же раздел, из которого был загружен двоичный файл UEFI GRUB".
Некоторые дистрибутивы, такие как RHEL, просто помещают фактическую конфигурацию для UEFI GRUB непосредственно в ESP. Debian и родственные дистрибутивы обычно делают еще одну небольшую косвенную операцию: мини- grub.cfg
файл на ESP будет содержать всего несколько строк, которые сообщат GRUB, что нужно считать реальный файл конфигурации из того, что будет /boot/grub/grub.cfg
после загрузки Linux и монтирования всех дисков. В простейшем случае эта мини-конфигурация будет состоять всего из трех строк:
- Установка корня GRUB для указания на файловую систему, содержащую настоящий файл конфигурации GRUB (для предстоящей
configfile
команды), в современных дистрибутивах обычно с использованиемsearch
команды и UUID файловой системы. Самые старые реализации этой схемы могли фактически использовать фиксированную спецификацию раздела GRUB, напримерset root=(hd0,gpt1)
- Установка переменной GRUB
prefix
(для включения автозагрузки модуля GRUB, если Secure Boot не действует). Если файловая система, в которую будет загружена конфигурация, является корневой файловой системой Linux, эта строка будетset prefix=($root)'/boot/grub'
; если/boot
это отдельная файловая система, эта строка будетset prefix=($root)'/grub'
- Чтение фактического файла конфигурации GRUB с помощью
configfile $prefix/grub.cfg
.
Если файловая система, содержащая конфигурацию GRUB, находится на логическом томе LVM, зашифрованном томе или программном RAID-наборе, то первая строка будет более сложной или при необходимости могут быть даже дополнительные строки.
В результате, как в традиционном BIOS, так и в UEFI, запуск grub-install
может обновить ваш загрузчик для чтения совершенно другого файла конфигурации GRUB на совершенно другом диске — хотя детали этого процесса будут совершенно другими.
С UEFI вы фактически можете изменить выбор загрузочного устройства из ОС с помощью efibootmgr
или grub-install
. Но grub-install
это слишком большое излишество: если обе ваши установки являются UEFI и имеют свои собственные разделы ESP, у них будут свои собственные переменные загрузки UEFI, и выбор между ними можно легко сделать с помощью efibootmgr
или в настройках UEFI BIOS.
С традиционным BIOS все немного сложнее: вам нужно убедиться, что каждая установка /boot/grub/device.map
идентифицирует диск этой конкретной установки как hd0
, а другая как hd1
. Затем используйте grub-install
для записи загрузчика только на собственный диск каждой установки; никогда на «противоположный» диск. Таким образом, оба диска будут полностью автономными и загрузочными, даже если другой диск будет полностью удален. Вы можете добавить пункт меню в файлы конфигурации каждого GRUB, который позволит вам загрузить «противоположную» установку, если хотите. Или вы можете просто использовать BIOS для выбора диска для загрузки.
Необходимо знать, что селектор порядка загрузки традиционных BIOS обычно работает так, что диск, выбранный для загрузки, становится «первым» диском для функций BIOS, и поэтому GRUB hd0
всегда будет ссылаться на «диск, который в данный момент выбран для загрузки в BIOS».
Итак, если вы в данный момент загружаетесь с (так говорит /dev/sda
BIOS ) и хотите, чтобы пункт меню GRUB на этом диске переключился на загрузочное меню , вам нужно использовать что-то вроде:sda
hd0
/dev/sdb
menuentry "Switch to /dev/sdb"
{
# flip the disk mappings and reload configuration
drivemap -s (hd0) (hd1)
set root=<the identifier for sdb's partition that contains grub.cfg>
configfile /boot/grub/grub.cfg # or just /grub/grub.cfg is /boot is a separate partition
}
... и то же самое касается конфигурации GRUB на /dev/sdb.