grub2 - основной загрузчик, используемый в ОС Linux
Здесь хранится конфиг загрузчика, который формируется скриптом 'grub-mkconfig'. Править этот файл бессмысленно, так как при обновлении системы, он перезапишется.
Если что-то случилось с файлом grub.cfg, сформировать его можно следующей командой:
или
#update-grub
Параметры для загрузчика находятся здесь: /etc/default/grub
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