GRUB2 — что это такое
GRUB (GRand Unified Bootloader) — загрузчик операционной системы из проекта GNU. В текущий момент актуальной является его вторая версия (поколение), то есть GRUB2. Поддерживает несколько аппаратных платформ и позволяет загружать различные операционные системы, но чаще всего используется для загрузки с магнитных и твердотельных дисков операционных систем на основе ядра Linux на аппаратных платформах x86/x86-64. Именно такое сочетание программных и аппаратных средств возьмем за основу и рассмотрим ситуацию, когда текущие настройки загрузчика не соответствуют размещению загружаемой операционной системы на дисках.
Погружаемся в процесс настройки GRUB2
Загрузчик операционной системы работает с дисками и файловыми системами своими средствами. Его задача — загрузить ядро операционной системы, то есть в процессе его работы ядро еще не загружено, и, таким образом, воспользоваться присутствующей в ядре полноценной поддержкой файловых систем загрузчик не может. Файлы, используемые загрузчиком, и, в частности, файл с его конфигурацией должны размещаться на файловой системе специальным образом. Поэтому рабочая конфигурация загрузчика GRUB2
/boot/grub/grub.cfg
готовится и записывается на диск специальной программой grub-mkconfig (update-grub) на основании системы скриптов в каталоге:
/etc/grub.d
и редактируемой конфигурации GRUB2 в файле:
/etc/default/grub
Указанная система скриптов
# ls /etc/grub.d
00_header 10_linux 30_os-prober 35_fwupd 40_custom README
05_altlinux_theme 20_linux_xen 30_uefi-firmware 39_memtest 41_custom
позволяет сформировать корректную рабочую конфигурацию загрузчика с учетом размещения системы на разделах дисков, имеющихся ядер Linux, наличия на разделах других операционных систем и тому подобного.
Разбираемся, что делать, если нарушился штатный процесс загрузки
Проблемы с процессом загрузки могут возникнуть, когда наличие и нумерация разделов, а также прочие особенности размещения операционной системы на дисках были изменены, а рабочая конфигурация загрузчика не была адаптирована для соответствия этим изменениям. Загрузчик в этой ситуации не находит прописанные в его конфигурации разделы и пути к файлу ядра и не может, таким образом, выполнить свою задачу.
В более сложной ситуации загрузчик, который должен занимать специальные области на диске, оказывается поврежден.
С этой проблемы мы и начнем. Вот какие задачи мы рассмотрим:
- Получить загрузчик и запустить его.
- Найти из загрузчика, где и как размещена операционная система, дать ему корректные инструкции загрузки ОС.
- И уже из загруженной системы, если надо, корректно установить загрузчик и сформировать его корректную рабочую конфигурацию.
Работаем с восстановительным диском с загрузчиком
В наборе утилит, поставляемых вместе с загрузчиком GRUB2, есть специальная команда grub-mkrescue, предназначенная для создания загрузочного образа, содержащего работоспособный загрузчик.
# grub-mkrescue -o rescue.iso
Кроме собственно загрузчика в созданный образ можно добавить ядро операционной системы и конфигурацию загрузчика, которая будет автоматически подхватывать это ядро, но для нашей ситуации это избыточно. Будем предполагать, что ядро Linux, как и остальная часть системы, находится на диске, и всё, что нам надо, — это указать загрузчику на размещение этой системы, выполнить загрузку и получить возможность уже в рамках загруженной системы привести в порядок рабочую конфигурацию загрузчика.
Загружаем систему с полученного ISO-образа и получаем приглашение командной строки GRUB2:
Такое приглашение появляется автоматически, если загрузчик GRUB2 не смог найти свой файл конфигурации. Если конфигурация с загрузочным меню у GRUB2 есть, он отображает пункты загрузочного меню. Для попадания в интерфейс командной строки необходимо при отображении меню нажать клавишу c.
Командная строка GRUB2 хоть и уступает типовым возможностям командного интерпретатора, тем не менее содержит в себе достаточно большое количество команд, позволяющее решить большинство задач при восстановлении работоспособности процесса загрузки системы. Чтобы видеть перечень доступных команд, можно в приглашении нажать клавишу TAB.
Исследуем системы из загрузчика
Чтобы сказать загрузчику, как следует загрузить систему, надо понимать, где эта система находится и как загрузчик ее видит. GRUB2 предоставляет для этого удобные интерактивные инструменты.
В первую очередь необходимо понять, какие разделы есть у нас на диске. Понять это можно, выполнив команду ls без параметров:
В данном случае мы видим кроме cd c rescue.iso, с которого мы загрузились, один накопитель hd0 с двумя разделами: msdos1 и msdos5. Перед нами собственная схема нумерации разделов GRUB.
Накопители имеют префикс hd и идентифицируются начиная с 0. Разделы нумеруются начиная с 1 и имеют префикс msdos при использовании MBR-разбиения диска и префикс gpt при разбиении диска по схеме GPT. Таким образом, второй раздел первого накопителя в системе будет называться либо hd0,msdos2, либо hd0,gpt2.
Далее необходимо найти раздел, содержащий корень файловой системы, а также, если каталог /boot вынесен на отдельный раздел, то и его тоже. Используем ту же команду ls, только относительно разделов дисков.
Видно, что раздел содержит и корневую файловую систему, и каталог /boot. То есть это то, что нам надо.
Выполняем загрузку операционной системы
После того как мы исследовали из загрузчика расположение системы на диске, мы должны задать ему ряд параметров и дать команду загрузки системы:
В листинге выше видно, что интерактивная консоль GRUB2 поддерживает автопостановку символов при нажатии клавиши TAB, что значительно упрощает ввод конструкций. Разберем введенные команды.
Устанавливаем рабочий для GRUB2 раздел — тот раздел, где мы нашли корневую файловую систему:
grub> set root=’hd0,msdos1’
Указываем расположение загружаемого ядра и передаем ему в качестве параметра корневую файловую систему в «классическом» написании. Чтобы узнать точные имена файлов, удобно использовать либо автоподстановку имен, либо команду ls.
grub> linux /boot/vmlinuz-5.10.0-10-amd64 root=/dev/sda1
Указываем расположение образа initrd:
grub> initrd /boot/initrd-5.10.0-10-amd64
Наконец, мы подготовили все параметры для загрузки и можем приступать к самой загрузке командой boot.
Восстанавливаем/настраиваем загрузчик
Если на предыдущем этапе удалось корректно ввести все параметры и успешно загрузить систему, то нам остается только зафиксировать успех, а именно записать загрузчик на диск и сгенерировать для него рабочую конфигурацию.
Установка загрузчика происходит командой grub-install. Для BIOS-системы команда простая, загрузку записываем в MBR-запись диска:
# grub-install /dev/sda
Для UEFI-системы ситуация несколько сложнее, так как загрузчик ставится не в главную загрузочную запись диска, а в специальный системный загрузочный раздел EFI. В случае если такой раздел уже есть и он смонтирован в предполагаемый для него каталог /boot/efi, то для корректной установки загрузчика будет достаточно выполнить команду:
# grub-install
После того как мы обеспечили правильное расположение загрузчика в системе, нам необходимо сформировать для него корректную рабочую конфигурацию, чтобы при следующей загрузке не пришлось снова вбивать команды загрузки вручную. В этом нам помогут структуры скриптов каталога /etc/grub.d, которые найдут всё, что нужно, в каталоге /boot, подставят правильные идентификаторы разделов и тому подобное, то есть сформируют корректные пункты меню загрузчика с работающими в данной системе командами загрузки. Достаточно выполнить команду:
# grub-mkconfig -o /boot/grub/grub.cfg
Подводим итоги
Итак, мы разобрали задачу восстановления работы загрузчика GRUB2 в случае, когда его конфигурация перестала соответствовать тому, как развернута система, научившись общаться с ним на языке его консоли. Даже если эти знания не понадобятся непосредственно для восстановления работы системы, они будут полезны для его более тонкой настройки и адаптации загрузочного меню под собственные нужды. Впрочем, это уже тема для другой статьи.