Grub: различия между версиями

Материал из ALT Linux Wiki
Строка 63: Строка 63:
* NB: в 2.00+ поведение изменилось, теперь дополнительные ядра для того же корня спрятаны в подменю "Advanced options".
* NB: в 2.00+ поведение изменилось, теперь дополнительные ядра для того же корня спрятаны в подменю "Advanced options".


== Выбрать нужное ядро для загрузки ОС по умолчанию ==
==Как выбрать ядро для загрузки по умолчанию==


Бывает необходимо выбрать ядро, которое будет грузиться при выборе первого пункта меню загрузки GRUB.
Бывает необходимо выбрать ядро, которое будет грузиться при выборе первого пункта меню загрузки GRUB.

Версия от 10:24, 4 сентября 2020

Что такое GRUB?

Wikipedia сообщает "GNU GRUB (англ. GRand Unified Bootloader) — загрузчик операционной системы от проекта GNU. GRUB позволяет пользователю иметь несколько установленных операционных систем и при включении компьютера выбирать одну из них для загрузки." GRUB 2

Зачем нужен GRUB, если есть LILO/ELILO?

  • Поддержка модулей Raid, LVM файловых систем вкупе с интерактивным интерфейсом позволяют выбрать, что загружать откуда угодно в процессе загрузки (а не установки загрузчика).
  • Возможность multiboot (для загрузки, к примеру, XEN)

Как установить GRUB?

Установить дистрибутив с GRUB либо мигрировать загрузчик вручную.

apt-get install grub
grub-install /dev/sda # заменить /dev/sda на то устройство, куда хочется установить GRUB
grub-mkconfig -o /boot/grub/grub.cfg

Последний пункт выполняет генерацию конфига GRUB на основе шаблонов/скриптов в /etc/grub.d/. Редактировать полученный конфиг руками не рекомендуется т.к. он будет уничтожен следующей автогенерацией (выполняемой, к примеру, installkernel-ом).

Проверьте содержимое /etc/sysconfig/grub2: если там нет раскомментированной переменной GRUB_AUTOUPDATE_DEVICE (при смене загрузчика вручную не будет, т.к. она добавляется только alterator-grub), добавьте устройство или их список; если root/boot на md raid1, следует задать список дисков, на которых он размещён -- например, не '/dev/md0 ', а '/dev/sdb /dev/sda '. После этого стоит выполнить grub-autoupdate.

Как передать свои параметры загрузки ядра?

Для однократного изменения таковых при загрузке GRUB следует:

  1. нажать "e" при курсоре на цели загрузки, соответствующей используемому экземпляру ALT;
  2. в открывшемся редакторе отыскать строку, начинающуюся с linux /boot/vmlinuz;
  3. в её конец дописать требуемые параметры, отделив пробелом;
  4. нажать F10.

Если нужно, чтобы эти параметры ядра передавались ядру при каждой загрузке, надо прописать их в /etc/sysconfig/grub2 и дать команду update-grub; подробнее см. следующий пункт.

Где отредактировать параметры ядра?

Для постоянного применения иных параметров загрузки следует изменить конфигурацию загрузчика.

  • Параметры ядра содержатся в /etc/sysconfig/grub2
  • После редактирования этого файла нужно вызвать grub-mkconfig -o /boot/grub/grub.cfg

В /etc/sysconfig/grub2 поддерживаются следующие опции:

GRUB_AUTOUPDATE_CFG=true/false

обновлять ли конфиг файл из файлтриггера установки/удаления ядер (по умолчанию true)

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ваш_пукт1 ваш_пункт2"

опции загрузки ядра

GRUB_AUTOUPDATE_CFGNAME=/boot/grub/grub.cfg

имя автообновляемого конфигфайла. (по умолчанию /boot/grub/grub.cfg)

GRUB_VMLINUZ_SYMLINKS=true/false/default

добавлять ли симлинки в меню (добавлять, не добавлять, добавлять только /boot/vmlinuz [по умолчанию])

GRUB_VMLINUZ_FAILSAFE=true/false/default

добавлять ли failsafe-пункты (добавлять, не добавлять, добавлять только для /boot/vmlinuz [по умолчанию])

Как дописать свои собственные пункты меню?

  • Теоретически вам не должно хотеться этого делать. Расскажите (в рассылке sisyphus@, к примеру) зачем вам этого захотелось - возможно, придумается какой-то новый общий случай.
  • Если вам всё же хочется - допишите то, что считаете нужным в /etc/grub.d/40_custom
    • После редактирования этого файла нужно вызвать grub-mkconfig -o /boot/grub/grub.cfg

Как выбрать то, что будет загружаться автоматом?

на самом деле этот пункт очень похож на следующий, но на этот пункт есть ссылки

  • Выберите нужный вам пункт один раз при загрузке. savedefault должен сохранять ваш выбор на будущее.
  • Не нравится такое поведение? Отключите GRUB_SAVEDEFAULT в /etc/sysconfig/grub2
  • NB: в 2.00+ поведение изменилось, теперь дополнительные ядра для того же корня спрятаны в подменю "Advanced options".

Как выбрать ядро для загрузки по умолчанию

Бывает необходимо выбрать ядро, которое будет грузиться при выборе первого пункта меню загрузки GRUB. Пользуемся командой installkernel.

  • Пример
installkernel 5.7.19-un-def-alt1

Внесено предложение по добавлению к утилите update-kernel опции -d, --default — установка ядра по умолчанию. Будет ли оно реализовано — неизвестно.

Как отучить GRUB2 запоминать последний выбранный пункт?

Поведение Grub в плане запоминания пунктов зависит от переменных GRUB_DEFAULT и GRUB_SAVEDEFAULT в файле /etc/sysconfig/grub2. GRUB_DEFAULT может содержать пункт меню для загрузки, либо служебное слово 'saved'. В случае, если GRUB_DEFAULT='saved' (в ALT по-умолчанию), загрузка определяется содержимым файла /boot/grub/grubenv: утилита grub-set-default задаёт значение переменной saved_entry, утилита grub-reboot значение переменной next_entry (используется однократно при следующей загрузке, потом очищается). Утилита grub-entries (altbug #36048) выводит список существующих вариантов (правда неполный с точки зрения допустимых вариантов написания: не выводятся смешанные варианты выбора и выбор на основе ID пунктов меню). В случае, если GRUB_SAVEDEFAULT=true (в ALT по-умолчанию), в пункты меню Grub добавляется команда savedefault, вызывающая изменение переменной saved_entry в файле /boot/grub/grubenv.

Способ 1

В файле /etc/sysconfig/grub2 изменить значение GRUB_SAVEDEFAULT на false, перегенерировать конфиг grub:

grub-mkconfig -o /boot/grub/grub.cfg

посмотреть имеющийся список вариантов загрузки утилитой grub-entries:

grub-entries

например

0       ALT p8 starter kit
1>0     Advanced options for ALT p8 starter kit>ALT p8 starter kit, vmlinuz
1>1     Advanced options for ALT p8 starter kit>ALT p8 starter kit, vmlinuz (recovery mode)
1>2     Advanced options for ALT p8 starter kit>ALT p8 starter kit, 4.14.97-un-def-alt0.M80P.1
1>3     Advanced options for ALT p8 starter kit>ALT p8 starter kit, 4.9.154-std-def-alt0.M80P.1
2       Memtest86+-5.01

задать нужный вариант загрузки:

grub-set-default "Advanced options for ALT p8 starter kit>ALT p8 starter kit, 4.14.97-un-def-alt0.M80P.1"

или

grub-set-default "1>2"

цифровой вариант лучше не использовать, так как номера строк изменяются при удалении и добавлении ядер, но его вполне можно использовать для указания варианта на следующую перезагрузку утилитой grub-reboot.

Внимание! Обнаружилась возможность внезапного изменения и буквенного названия altbug #37379


Способ 2

В файле /etc/sysconfig/grub2 изменить строку

 GRUB_DEFAULT='saved'

на

 GRUB_DEFAULT=n

где n номер пункта меню, либо на

 GRUB_DEFAULT='точное название пункта меню'

Вариант с названием предпочтительнее, поскольку после обновления ядра количество пунктов в меню увеличится и нумерация некоторых пунктов изменится. Внимание! Нумерация пунктов начинается с 0. Список пунктов можно получить по команде

grep menuentry /boot/grub/grub.cfg | nl -v0

Например, пусть мы имеем следующие пункты меню (этот пример не учитывает текущее состояние с подменю; оставлено в качестве примера, удобнее использовать grub-entries, как в первом варианте):

# grep menuentry /boot/grub/grub.cfg | nl -v0
0	menuentry "ALT Linux 6.0.1 KDesktop" --class gnu-linux --class gnu --class os {
1	menuentry "ALT Linux 6.0.1 KDesktop (failsafe mode)" --class gnu-linux --class gnu --class os {
2	menuentry "ALT Linux 6.0.1 KDesktop, 3.0.8-std-def-alt0.M60P.1" --class gnu-linux --class gnu --class os {
3	menuentry "Windows Vista (loader) (on /dev/sda1)" --class windows --class os {
4	menuentry "Memtest86+-4.20" {
# 

и хотим, чтобы по умолчанию грузился Windows. Тогда в /etc/sysconfig/grub2 пишем

 GRUB_DEFAULT='Windows Vista (loader) (on /dev/sda1)'

Потом в терминале от пользователя root:

grub-mkconfig -o /boot/grub/grub.cfg

Перезагрузка. Так как в GRUB_DEFAULT задано конкретное значение, а не 'saved', переменная GRUB_SAVEDEFAULT значения не имеет.

Как однократно выполнить загрузку произвольного пункта меню?

Иногда бывает удобно загрузиться с произвольным пунктом меню, но не менять текущий вариант. Это удобно, например, для тестирования нового ядра, когда надо иметь возможность вернуть старое ядро простой перезагрузкой. Для этого надо настроить Grub в соответствии со способом 1 предыдущего пункта, после чего можно задать пункт меню для следующей загрузки командой grub-reboot и запустить команду reboot. В момент начала загрузки конфигурация Grub автоматически вернётся в исходное состояние, и следующая загрузка компьютера произойдёт по-старому. Это аналогично использованию опции -R загрузчика Lilo.

Как загрузить Xen?

Xen грузится с помощью multiboot:

  • проверить, что вы используете grub2 >= 1.98-alt11
  • apt-get install xen xen-libs xen-runtime xen-hypervisor
  • запустить grub-mkconfig -o /boot/grub/grub.cfg
  • выбрать соответствующий пункт при загрузке (savedefault запомнит выбор на будущее)

Как включить работу с последовательным портом?

Примерно такими строчками в /etc/sysconfig/grub2:

GRUB_TERMINAL='console serial'
GRUB_SERIAL_COMMAND='serial --unit=0 --speed=115200'

(см. также). Не забываем про grub-mkconfig.

Загрузка Linux и Windows c разных жестких дисков

Grub грузится с основного диска на котором Linux, Windows установлен на дополнительный жесткий диск. В 40_custom добавляем:

menuentry "Windows XP" {
drivemap -s (hd1) ${root}
set root='(hd1)'
chainloader +1
}

Если жестких дисков больше двух, играемся с hdX.

Как установить пароль на редактирование параметров ядра?

По умолчанию при загрузке любой пользователь может добавить/изменить параметры. Этого можно избежать, если установить пароль. Проще всего сделать это в центре управления системой. Для этого потребуется пакет alterator-grub и выполнить следующие действия:

  • Зайдите в ЦУС (acc), перейдите в режим эксперта, и в разделе "Система" откройте "Загрузчик GRUB".
  • Установите флажок "Установить или сбросить пароль" и введите необходимый пароль.

После нажатия на кнопку "Установить" (переконфигурация GRUB происходит автоматически) при запуске системы и попытке либо изменить параметры загрузки (клавиша Е), либо выбрать другой пункт загрузочного меню, будет требоваться логин/пароль. Логин по умолчанию сейчас boot (altbug #33098)

Примечание: Логин/пароль (последний в хэшированном виде) записываются в файл /etc/grub.d/50_password:
#!/bin/sh
cat << EOF
set superusers="boot"
password_pbkdf2 boot grub.pbkdf2.sha512.10000.<hash>
EOF


Также для ограничения загрузки (как с изменением параметров, так и без) можно добавить в файл /etc/grub.d/40_custom строки:

set superusers="user"
password user password
Внимание! В этом случае не забудьте запретить чтение данного файла обычным пользователям (см. altbug #33099). А лучше всего используйте хэшированные пароли. Для этого следует воспользоваться password_pbkdf2 и командой grub-mkpasswd-pbkdf2.


В случае дистрибутивов серии 6.0 отключить графику в /etc/sysconfig/grub2 (см. altbug #26198):

GRUB_TERMINAL_OUTPUT='console'

Для защиты паролем возможности загрузки именно с изменёнными параметрами придётся добавить в переменную CLASS в скрипте /etc/grub.d/10_linux опцию --unrestricted (внимание: этот скрипт по состоянию на версию 2.00-alt20 входит в пакет grub-common и не помечен как %config, поэтому будет перезаписан при обновлении!).

После подобных операций следует перегенерировать конфигурацию командой grub-mkconfig -o /boot/grub/grub.cfg (либо grub-mkconfig, в зависимости от дистрибутива). В случае использования alterator-grub - это не требуется.

Как переустановить GRUB?

После обновления до grub2-pc-2.00-alt1 операционная система может не загрузиться. В таком случае, необходимо иметь под рукой любой live disk. Далее:

mount-system
chroot /mnt/system1
  • Если в используемом LiveCD нет mount-system, делаем самостоятельно (предполагая/зная, что корень на /dev/sda2):
mount /dev/sda2 /mnt 
mount -o bind /dev /mnt/dev
mount -o bind /proc /mnt/proc
mount -o bind /run /mnt/run
mount -o bind /sys /mnt/sys
chroot /mnt/ /bin/bash
  • Скачиваем предыдущую версию пакета:

http://ftp.altlinux.org/pub/distributions/archive/Sisyphus/2012/10/30/

  • Устанавливаем rpm
rpm -Uvh --oldpackage /home/andy/grub2-pc-1.99-alt9.i586.rpm
  • Переконфигурируем меню grub
grub-mkconfig -o /boot/grub/grub.cfg

После описанного выше, у меня загрузилась операционная система.

По мотивам: http://edoceo.com/notabene/grub-probe-error-cannot-find-device-for-root

Как установить/восстановить загрузочную запись grub ?

Аналогично предыдущему пункту (см. также Восстановление_загрузочной_записи#grub:

mount-system
chroot /mnt/system1
  • Если в используемом LiveCD нет mount-system, делаем самостоятельно (предполагая/зная, что корень на /dev/sda2):
mount /dev/sda2 /mnt 
mount -o bind /dev /mnt/dev
mount -o bind /proc /mnt/proc
mount -o bind /run /mnt/run
mount -o bind /sys /mnt/sys
chroot /mnt/ /bin/bash

После того как проведены подготовительные действия и сделан сhroot, необходимо выполнить

grub-mkconfig -o /boot/grub/grub.cfg
grub-install /dev/sda # заменить /dev/sda на то устройство, куда хочется установить GRUB

если же используется EFI-режим, может потребоваться восстановить загрузчик в ESP-разделе (EFI System Partition), который монтируется в /boot/efi:

mount -a # достаточно смонтировать точку монтирования /boot/efi
grub-efi-autoupdate

Что за жалобы про BIOS Boot Partition?

При загрузке под PC BIOS используется MBR и небольшая свободная область диска после него (31 килобайт до 63-го сектора) — соответственно первая стадия и core.img; при использовании UEFI ожидается GPT-разбивка загрузочного диска, при которой нет ни MBR, ни этой области. Отсюда возникает необходимость встроить вторую стадию загрузчика куда-то ещё. Таким местом и решили взять определённый в GPT тип раздела BIOS Boot Partition.

Инструмент разбивки дисков в составе инсталятора ALT Linux сделает такой раздел автоматически под UEFI, если разбиваете вручную или большой диск для BIOS — может потребоваться создать раздел минимального объёма (RED Hat рекомендует 1 мегабайт) с типом «bios boot partition» в терминологии alterator-vm либо меткой «bios_grub» в терминологии parted.

См. тж. архивную статью.

Во время загрузки Windows искажена картинка, что делать?

Если при загрузке, например, Windows 7 часть экрана содержит "шум", возможно, отдалённо напоминающий картинку заставки GRUB -- попробуйте выровнять используемые видеорежимы VESA:

  • в файле /etc/sysconfig/grub2 поменяйте GRUB_GFXMODE='800x600' на GRUB_GFXMODE='640x480'[1];
  • выполните команду update-grub или grub-mkconfig -o /boot/grub/grub.cfg

Вы можете сделать заставку текстовой, указав GRUB_GFXMODE='console'.

Где почитать ещё?

А также в операционной системе:

info grub
info -f grub -n 'Simple configuration'

Примечания

  1. возможно, понадобится подобрать разрешение, например, 1024x768 -- см. тж. здесь и здесь