grub2 - основной загрузчик, используемый в ОС Linux

 

Здесь хранится конфиг загрузчика, который формируется скриптом 'grub-mkconfig'. Править этот файл бессмысленно, так как при обновлении системы, он перезапишется. 

/boot/grub/grub.cfg

Если что-то случилось с файлом grub.cfg, сформировать его можно следующей командой:

#grub-mkconfig > /boot/grub/grub.cfg
или
#update-grub

 

Параметры для загрузчика находятся здесь: /etc/default/grub

GRUB_DEFAULT - указывает какой пункт нужно загружать по умолчанию. Может быть указан номер, или полное название или же строка saved, которая значит, что нужно загрузить пункт, указанный с помощью grub-reboot;
GRUB_SAVEDEFAULT - загружать последнюю использованную запись по умолчанию;
GRUB_HIDDEN_TIMEOUT - сколько секунд ждать перед тем, как вывести меню;
GRUB_HIDDEN_TIMEOUT_QUIET - если установлено true, то меню не будет показано;
GRUB_TIMEOUT - сколько секунд будет показано меню;
GRUB_CMDLINE_LINUX - добавить опции ядра для всех ядер, как обычных, так и режима восстановления;
GRUB_CMDLINE_LINUX_DEFAULT - добавить опции ядра только для обычных ядер;
GRUB_CMDLINE_LINUX_RECOVERY - опции ядра, только для режима восстановления;
GRUB_BADRAM - указать адреса оперативной памяти, которые не нужно использовать;
GRUB_TERMINAL - модуль терминала для Grub. Можно использовать console, только для текстового режима или gfxterm с поддержкой графики;
GRUB_GFXMODE - разрешение экрана в Grub, лучшие использовать auto, чтобы система выбрала сама то что ей нужно.
GRUB_DISABLE_RECOVERY - не включать в меню пункты восстановления;
GRUB_DISABLE_OS_PROBER - не искать другие операционные системы;
GRUB_BACKGROUND - адрес картинки для фона, должна находиться в той же папке что и файлы grub;
GRUB_THEME - устанавливает тему Grub.

 

Конфиги grub для запуска разных ОС

ALT Workstation 9.1

menuentry "ALT Workstation 9.1" --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-simple-9c5d6f61-65bc-4757-b785-84d998e99e9c' {
savedefault
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos3'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3 9c5d6f61-65bc-4757-b785-84d998e99e9c
else
search --no-floppy --fs-uuid --set=root 9c5d6f61-65bc-4757-b785-84d998e99e9c
fi
echo 'Загружается Linux vmlinuz …'
linux16 /boot/vmlinuz root=UUID=9c5d6f61-65bc-4757-b785-84d998e99e9c ro quiet panic=30 splash
echo 'Загружается начальный виртуальный диск …'
initrd16 /boot/initrd.img
}


Android x86 9.0

menuentry "Android x86"{
set root='(hd0,5)'
linux /android-9.0-r2/kernel quiet root=/dev/ram0 SRC=/android-9.0-r2
initrd /android-9.0-r2/initrd.img
}


Windows 10

menuentry "Windows 10 (на /dev/sda1)" --class windows --class os $menuentry_id_option 'osprober-chain-9E24B1BE24B19A2B' {
savedefault
insmod part_msdos
insmod ntfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 9E24B1BE24B19A2B
else
search --no-floppy --fs-uuid --set=root 9E24B1BE24B19A2B
fi
parttool ${root} hidden-
drivemap -s (hd0) ${root}
chainloader +1
}

 

 

При формировании файла 'grub.cfg', утилита grub-mkconfig собирает данные из нескольких файлов в папке /etc/grub.d/. Два основных из них: «10_linux» и «30_os-prober» отвечают за поиск Linux ядер и остальных ОС на других разделах соответственно. Файл «40_custom» позволяет добавлять свои пункты загрузки.


 Восстановление grub

 

Загружаемся с LiveCD/USB и открываем терминал

 

Необходимо узнать нашу таблицу разделов. Используем команду:

#fdisk -l

На экран должна быть выведена примерно такая таблица:

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 29304782 29302735 14G 83 Linux
dev/sda2   29304832 1953523711 1924218880 917,6G 83 Linux

Из таблицы видим, что Linux (загрузочный /-корень отмечен звёздочкой) стоит, в нашем случае, на разделе /dev/sda1.

 

Вариант восстановления №1

1. Монтируем этот раздел в /mnt следующей командой:

#mount /dev/sda1 /mnt

2. Записываем grub в MBR:

#grub-install --root-directory=/mnt /dev/sda

 

В случае, если нужно только восстановить MBR диска (например, после переустановки Windows), то этого достаточно, закрываем терминал и перезагружаем.

Если нужно обновить и меню grub (например, после установки Windows), то нужно сделать:

#update-grub --output=/mnt/boot/grub/grub.cfg

 

Вариант восстановления с помощью chroot

1. Монтируем Linux раздел (в нашем примее это sda1) и еще несколько важных директорий:

#mount /dev/sda1 /mnt

#mount --bind /dev /mnt/dev

#mount --bind /proc /mnt/proc

#mount --bind /sys /mnt/sys

Если раздел /boot или /var находится отдельно, то Вам необходимо примонтировать их в /mnt/boot и /mnt/var

 

2. Меняем корень через chroot и обновляем переменные профиля:

#chroot /mnt /bin/bash

#env-update

#source /etc/profile

 

3. Устанавливаем GRUB и создаем новый конфиг файл:

#grub-install /dev/sda

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

 

Если Вы получили сообщение об ошибке, то пробуем:

#grub-install --recheck /dev/sda
или
#grub-install --recheck --no-floppy /dev/sda

4. Если все прошло успешно, выходим из chroot и отмонтируем разделы:

#exit

#umount /mnt/dev

#umount /mnt/proc

#umount /mnt/sys

#umount /mnt

 

 

При отсутствии загрузочного диска, можно восстановить Grub из его консоли.
Восстановление происходит следующим образом: сначала нужно подгрузить все модули, чтобы стала доступна вся функциональность Grub, а затем уже запуститься с нужного раздела.
Как известно, Grub состоит из двух частей. Первая часть записана в MBR диска. Она содержит базовую функциональность, то есть в ней есть консоль в rescue mode и ничего больше. Вначале нужно определить, на каком разделе находится вторая часть груба (она лежит в каталоге /boot/grub), подгрузить недостающие модули. И только потом можно будет дать команду запуска с нужного раздела.

 

В rescue mode доступно всего четыре команды:

ls

set

unset

insmod

 

Вначале следует дать команду:

ls

В ответ она выведет, например, следующее:

(hd0) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1) (hd1) (hd1,msdos2) (hd1,msdos1)

Иногда Grub может неправильно опеределить, какие файловые системы находятся на разделах дисков. В данном случае определяет их как msdos. Нам нужно постараться угадать, какие диски мы видим. В данном случае видно два диска. Диск с индексом 0 содержит три раздела, диск с индексом 1 содержит два раздела. Зная структуру своих дисков несложно определить нужный диск.

Grub называет разделы в обратном порядке. И становится непонятно, что имеется в виду под (hd0,msdos3) - первый раздел или третий? Тут можно выкрутиться, использовав синтаксис (hd0,1). Нужно помнить, что в Grub счет дисков начинается с 0, а счет разделов - с 1. Предположим, что Линукс установлен на первый диск в первый раздел, то есть (hd0,1).

Даем команду:

set prefix=(hd0,1)/boot/grub

set root=(hd0,1)

Этими командами мы указываем использовать диск (hd0,1) для дальнейших команд. После чего нужно проверить, действительно ли на этом разделе есть то, что нам нужно.

ls /boot/grub

если в ответ получаем список всех файлов в этой директории, то диск и раздел выбраны правильно.

 

Подгружаем необходимые модули:

insmod ext2

insmod normal

normal

Проверьте правильность написания первой команды для файловых систем ext3 и ext4

 

Если ОС расположена на разделе, отформатированном в btrfs, то выполняем следующие команды:

set prefix=(hd0,1)/@/boot/grub

set root=(hd0,1)

 

и подгружаем модули:

insmod btrfs

insmod normal

и запускаем GRUB:

normal

 

После чего Grub перейдёт в полнофункциональный режим. Он автоматически найдет все операционки, которые можно подгружать, и покажет своё Grub-меню.

Дальнейшее восстановление сводится к тому, чтобы загрузить нужный нам Linux, и в нем от рута дать команду:

#grub-install /dev/sdX

Где sdX, диск, на который нужно установить Grub.

 

 

Запуск ОС из командной строки grub

1. Запуск ОС Linux.

Предположим, команда ls выводит следующие разделы: (hd0) (hd0,msdos2) (hd0,msdos1). Посмотрев разделы, мы выяснили, что корень ОС находится в (hd0,msdos2), а загрузчик (раздел boot) в (hd0,msdos1). Пытаемся запустить ОС:

set root=(hd0,msdos1)

linux /boot/vmlinuz-2.6... root=/dev/sda2

initrd /boot/initrd.img-2.6...

boot

Что сделали:

set root - монтируем раздел, в котором находится загрузчик и ядро

linux /boot... - путь к ядру, root= - указываем, где находится корень ОС.

initrd /boot... - начальный RAM диск для загрузки Linux

boot - запуск загрузки ОС

 

1. RHEL 7.8 с дисками LVM

Пример: ОС RHEL, диски LVM. Вывод команды ls (hd0) (hd0,msdos1) (lvm/rhel-root) (lvm/rhel-swap). Раздел boot и корень ОС на одном диске.

// подгрузка модуля lvm

insmod lvm

// монтируем корень ОС и все необходимое для запуска

set root=(lvm/rhel-root)

// смотрим в cat /etc/fstab, кто у нас корень и видим /dev/mapper/rhel-root, записываем 

linux16 /boot/vmlinuz-3.10.0.... root=/dev/mapper/rhel-root

initrd16 /boot/initframfs-3.10.0.....

// стартуем ОС

boot

 

2. RHEL 7.8 EFI LVM

ОС RHEL 7.8 с разметкой GPT с EFI и LVM дисками.

Вывод команды ls показывает следующее: (hd0) (hd0,gpt2) (hd0,gpt1) (hd1) (lvm/rhel-root) (lvm/rhel-swap).

В данном примере ядро vmlinuz и initrd у меня находятся в корне раздела (hd0,gpt2), а корень ОС в (lvm/rhel-root), если посмотреть в fstab он же /dev/mapper/rhel-root

Загрузка:

insmod gzio

insmod lvm

insmod ext2

set root=(hd0,gpt2)

linux /vmlinuz-4.18.... root=/dev/mapper/rhel-root

initrd /initramfs-4.18....

boot

 

3. AltLinux по UUID диска

ОС AltLinux на разделах ext4, корень диска будем указывать в виде UUID диска.

Ищем в grub через ls корень нашего диска. Предположим что это (hd0,msdos1). Далее смотрим UUID корневого диска в fstab: cat (hd0,msdos1)/etc/fstab

Предоположим UUID=111-222-333-444-555. Пытаемся стартануть ОС:

insmod gzio

insmod part_msdos

insmod ext2

set root=(hd0,msdos1)

linux16 /boot/vmlinuz root=UUID=111-222-333-444-555

initrd16 /boot/initrd.img

boot

 

4. Android 9.0

Android установлен в (hd0,msdos2). Запуск выглядит так:

set root=(hd0,msdos2)

linux /android-9.0-r2/kernel quiet root=/dev/ram0 SRC=/android-9.0-r2

initrd /android-9.0-r2/initrd.img

boot

 

2. Запуск ОС Windows

Предположим, команда ls выводит следующие разделы:; (hd0) (hd0,msdos2) (hd0,msdos1). Для запуска ОС, надо выяснить, где находится загрузчик Windows. Как правило, это доп раздел, который создается при установке ОС и обычно не виден в системе, т.е. это не тот раздел, где находятся папки Windows, Program Files и т.п. Предположим, что этот раздел у нас находится на (hd0,msdos1). Пытаемся запустить ОС:

set root=(hd0,1)

chainloader +1

boot

Здесь:

set root - наш boot раздел Windows

chainloader - передает загрузку загрузчику Windows

boot - старт ОС

 

1. Если знаем, где лежит конфиг файл grub, можно попробовать запустить grub следующим образом

// Смотрим, какие диски и разделы доступны командой ls. Например, доступны (hd0) (hd0,msdos2) (hd0,msdos1). Ищем дирректорию grub или boot, просматривая корень каждого раздела

#ls (hd0,msdos1)/

 

// Предположим, нашли grub.cfg здесь (hd0,msdos1)/boot/grub/grub.cfg. Пробуем запустить grub

#configfile (hd0,msdos1)/boot/grub/grub.cfg

 

Еще в этой категории: Время и дата »