5.8к
0
0
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
Назад

GRUB2: разговариваем с загрузчиком на языке загрузчика

Время чтения 7 минут
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
5.8к
0
0
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники

Привет, вАЙТИ. Меня зовут Егор Орлов, я более 24 лет в ИТ, преподаю в СПбПУ.

В этой статье мы рассмотрим, как загрузчик операционной системы узнает, что загружать. Что делать, если текущие настройки загрузчика не соответствуют размещению загружаемой системы на жестком диске?

GRUB2: разговариваем с загрузчиком на языке загрузчика

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

Комментарии0
Тоже интересно
Комментировать
Поделиться
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники