update-grub или grub-install?

update-grub или grub-install?

Некоторые примеры, найденные в сети, говорят, что 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 и монтирования всех дисков. В простейшем случае эта мини-конфигурация будет состоять всего из трех строк:

  1. Установка корня GRUB для указания на файловую систему, содержащую настоящий файл конфигурации GRUB (для предстоящей configfileкоманды), в современных дистрибутивах обычно с использованием searchкоманды и UUID файловой системы. Самые старые реализации этой схемы могли фактически использовать фиксированную спецификацию раздела GRUB, напримерset root=(hd0,gpt1)
  2. Установка переменной GRUB prefix(для включения автозагрузки модуля GRUB, если Secure Boot не действует). Если файловая система, в которую будет загружена конфигурация, является корневой файловой системой Linux, эта строка будет set prefix=($root)'/boot/grub'; если /bootэто отдельная файловая система, эта строка будетset prefix=($root)'/grub'
  3. Чтение фактического файла конфигурации 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/sdaBIOS ) и хотите, чтобы пункт меню GRUB на этом диске переключился на загрузочное меню , вам нужно использовать что-то вроде:sdahd0/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.

Связанный контент