Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

GRUB 2: исцеление системного загрузчика

Оригинал: GRUB 2: Heal your bootloader
Автор: Mayank Sharma
Дата публикации: 10 сентября 2015 г.
Перевод: А. Панин
Дата перевода: 16 декабря 2015 г.

Существует не так много вещей, которые могут раздражать настолько сильно, насколько раздражает неработоспособность системного загрузчика. Именно поэтому мы будем учиться использовать по максимуму все возможности системного загрузчика GRUB 2, поддерживая его в рабочем состоянии.

Для чего это нужно?

  • GRUB 2 является самым популярным системным загрузчиком, используемым практически в каждом дистрибутиве Linux.
  • Системный загрузчик является важным программным компонентом, который, тем не менее, может работать некорректно в ряде случаев.
  • GRUB 2 является расширяемым и гибким системным загрузчиком, поддерживающим множество параметров конфигурации.

Системный загрузчик Linux под названием GRUB 2 является качественным и гибким программным компонентом. Хотя данный системный загрузчик не является единственным поддерживающим Linux системным загрузчиком, он является наиболее популярным и используется практически во всех широко известных дистрибутивах. Процесс функционирования системного загрузчика GRUB 2 может быть разделен на две фазы. Во-первых, он выводит меню с названиями всех установленных на компьютере операционных систем и позволяет вам выбрать одну из них. Во-вторых, он загружает ядро Linux в случае выбора операционной системы на основе соответствующего ядра с помощью меню загрузки.

Очевидно, что при использовании операционной системы на основе ядра Linux вы просто не сможете обойтись без системного загрузчика. При этом системный загрузчик является чуть ли не самым загадочным компонентом дистрибутива Linux. В рамках данного руководства мы познакомим вас с некоторыми из возможностей данного системного загрузчика и научим решать проблемы, связанные с его некорректным функционированием.

Наиболее важным компонентом системного загрузчика GRUB 2 является набор из текстовых файлов а также нескольких сценариев командной оболочки. Первый компонент данного набора, с которым стоит познакомиться, расположен в директории /etc/default/grub. Это текстовый файл, с помощью которого вы можете устанавливать значения переменных конфигурации и других параметров меню GRUB 2 (обратитесь к разделу "Пользовательские параметры меню загрузки").

Другой важной директорией, связанной с GRUB 2, является директория /etc/grub.d. В данной директории расположены все сценарии, формирующие описание каждого из элементов меню. Имена этих сценариев должны иметь префиксы, состоящие из двух цифр. Эти префиксы предназначены для установления порядка, в котором сценарии будут исполняться, а также порядка расположения соответствующих элементов в меню GRUB 2. В первую очередь осуществляется чтение файла 00_header, после чего происходит разбор файла конфигурации /etc/default/grub. После этого осуществляется формирование элементов меню для ядер Linux текущей системы с помощью сценария 10_linux. Данный сценарий создает один обычный элемент меню для загрузки для ядра Linux и один элемент меню для восстановления системы для этого же ядра Linux из раздела /boot.

Далее исполняются сценарии для поиска других операционных систем, такие, как 30_os-prober и 40_custom. Сценарий os-prober создает элементы меню для других ядер и других операционных систем, которые обнаруживаются на других разделах жестких дисков. Он способен распознать установленные системы Linux, Windows, BSD и Mac OS X. Если вы используете слишком экзотическую для сценария os-prober конфигурацию разделов вашего жесткого диска, препятствующую распознаванию установленного дистрибутива, вы можете добавить описание данного дистрибутива в сценарий 40_custom (обратитесь к разделу "Пользовательские элементы меню загрузки").

GRUB 2 не требует ручного редактирования файлов конфигурации для изменения параметров загрузки системы: вместо этого он позволяет генерировать файл конфигурации /boot/grub/grub.cfg с помощью утилиты grub2-mkconfig. Данная утилита позволяет осуществлять разбор сценариев из директории /etc/grub.d, а также файла конфигурации /etc/default/grub для автоматического формирования описания параметров загрузки системы.

Восстановление работоспособности системного загрузчика в графическом режиме

Подавляющее большинство проблем, связанных с системным загрузчиком GRUB 2, может быть просто решено путем нажатия единственной кнопки приложения Boot Repair. Это изящное, простое приложение имеет интуитивный пользовательский интерфейс и позволяет сканировать и распознавать различные типы дисков и схем дисковых разделов, а также может выяснять расположение и корректно идентифицировать установленные в рамках этих разделов операционные системы. Утилита может работать как на обычных компьютерах с основными загрузочными записями (Master Boot Record, MBR), так и на новых компьютерах с UEFI и таблицами разделов GUID (GUID Partition Table, GPT).

Простейший способ использования утилиты Boot Repair заключается в ее установке в рамках Live-сессии дистрибутива Ubuntu. Запустите live-версию дистрибутива Ubuntu на машине с неработоспособным системным загрузчиком и установите приложение Boot Repair, в первую очередь добавив соответствующий репозиторий PPA с помощью команды:

sudo add-apt-repository ppa:yannubuntu/Boot Repair

После этого обновите список репозиториев с помощью команды:

sudo apt-get update

Наконец, вы можете установить приложение с помощью команды:

sudo apt-get install -y Boot Repair

После окончания процесса установки вы сможете запустить приложение. Оно просканирует ваш жесткий диск перед отображением пользовательского интерфейса, который состоит из нескольких кнопок. Для выполнения предложенных приложением действий вы можете просто нажать на кнопку "Recommended Repair", которая позволит исправить большинство проблем, связанных с системным загрузчиком. После восстановления вашего системного загрузчика утилита выведет ссылку, которую следует запомнить. При переходе по этой ссылке вы сможете ознакомиться с детальной информацией о ваших дисках, включая их разделы, а также с содержимым важных файлов конфигурации GRUB 2, таких, как файлы из директории /etc/default/grub и файл /boot/grub/grub.cfg. Если приложению не удастся восстановить ваш системный загрузчик, вы сможете разместить данную ссылку на форуме вашего дистрибутива для того, чтобы посетители смогли ознакомится со схемой разделов вашего жесткого диска и дать полезные советы.

Приложение Boot Repair позволяет изменять параметры системного загрузчика

Приложение Boot Repair позволяет изменять параметры системного загрузчика

Восстановление системного загрузчика

Проблемы, связанные с системным загрузчиком GRUB 2, могут привести систему в различные состояния. Текст, выводимый на экран вместо меню системного загрузчика, указывает на текущее состояние системы. В том случае, если система перестала загружаться с выводом приглашения grub>, можно сделать вывод о том, что были загружены модули GRUB 2, но не удалось загрузить файл конфигурации grub.cfg. Данное приглашение выводится в полнофункциональной командной оболочке системного загрузчика, с помощью которой вы можете выполнить достаточно много действий, направленных на загрузку системы. Если вы видите приглашение grub rescue>, то несложно сделать вывод о том, что системный загрузчик не может обнаружить свои модули, а также файлы с описанием параметров загрузки системы. Однако, в том случае, если на экране вашего компьютера выводится лишь слово 'GRUB', можно сделать неутешительный вывод о том, что системному загрузчику не удалось обнаружить даже базовую информацию, которая обычно хранится в основной загрузочной записи.

Вы можете исправить данные неполадки GRUB 2, воспользовавшись либо Live CD любого дистрибутива, либо командной оболочкой GRUB 2. Если вам повезет, и ваш системный загрузчик выведет приветствие grub>, вы сможете использовать всю мощь встроенной командной оболочки GRUB 2 для исправления любых ошибок.

Системный загрузчик GRUB 2 позволяет использовать режим командной строки, который может быть активирован путем нажатия клавиши C в меню загрузки

Системный загрузчик GRUB 2 позволяет использовать режим командной строки, который может быть активирован путем нажатия клавиши C в меню загрузки

Следующие команды будут работать как в случае вывода приглашения grub>, так и в случае вывода приглашения grub rescue>. Команда set pager=1 позволяет задействовать механизм прокрутки текста для предотвращения его автоматической прокрутки. Также вы можете использовать команду ls, которая позволяет вывести список всех видимых GRUB 2 разделов жесткого диска аналогичным образом:

grub> ls
(hd0) (hd0,msdos5) (hd0,msdos6) (hd1,msdos1)

Как вы видите, данная команда позволяет вывести информацию о схеме таблицы разделов жесткого диска наряду с информацией о самих разделах.

Кроме того, вы можете использовать команду ls по отношению к каждому разделу жесткого диска для поиска раздела с вашей корневой файловой системой:

grub> ls (hd0,5)/
lost+found/  var/  etc/  media/  bin/  initrd.gz   
boot/  dev/  home/  selinux/  srv/  tmp/ vmlinuz

Вы можете отбросить идентификатор типа раздела msdos при записи имени раздела. Также в том случае, если вы пропустите слэш в конце имени раздела и выполните, к примеру, такую команду, как ls (hd0,5) вы получите информацию о разделе, включающую данные о типе файловой системы, ее общем размере и времени последней модификации. Если на вашем жестком диске создано несколько корневых разделов, вы можете прочитать содержимое файла /etc/issue с помощью команды cat с целью идентификации дистрибутива аналогичным образом: cat (hd0,5)/etc/issue.

Если предположить, что вы нашли нужную корневую файловую систему в разделе (hd0,5), вы должны убедиться в том, что данная файловая система содержит директорию /boot/grub и образ ядра Linux с именем, аналогичным vmlinuz-3.13.0-24-generic, который вы желаете загрузить. Теперь для загрузки системы вам остается ввести следующие команды:

grub> set root=(hd0,5)
grub> linux /boot/vmlinuz-3.13.0-24-generic root=/dev/sda5
grub> initrd /boot/initrd.img-3.13.0-24-generic

Первая команда передает системному загрузчику GRUB 2 информацию о разделе жесткого диска, на котором располагаются файлы дистрибутива для загрузки. Вторая команда передает ему же информацию о расположении файла образа ядра в рамках указанного раздела жесткого диска, а также информацию о расположении корневой файловой системы. Последняя строка позволяет указать расположение файла начального образа диска, содержимое которого хранится в памяти и используется в процессе загрузки ядра. Вы можете использовать функцию автозавершения, которая позволит сохранить достаточно вашего времени и сил при вводе имен файлов ядра и начального образа диска.

Ввод данных строк должен завершаться вводом после следующего приветствия grub> команды boot, инициирующей загрузку указанной операционной системы силами GRUB 2.

Вши действия должны немного отличаться в том случае, если вы столкнетесь с приветствием grub rescue>. Так как системный загрузчик не смог обнаружить и загрузить любой из необходимых модулей, вам придется загрузить их вручную:

grub rescue> set root=(hd0,5)
grub rescue> insmod (hd0,5)/boot/grub/normal.mod
grub rescue> normal
grub> insmod linux

Очевидно, что как и раньше после результативного использования команды ls для поиска корневого раздела Linux, вам придется отметить этот раздел с помощью команды set. Далее нужно загрузить модуль normal, после чего будет осуществлен возврат в стандартный режим с приветствием grub>. Следующая команда позволяет загрузить модуль linux в том случае, если он не был загружен автоматически. После загрузки данного модуля вы можете преступить к передаче системному загрузчику информации о расположении файлов образа ядра и начального образа диска и инициировать загрузку дистрибутива с помощью команды boot.

После успешной загрузки дистрибутива не стоит забывать о необходимости повторной генерации файла конфигурации GRUB 2 с помощью команды:

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

Вам также придется установить копию системного загрузчика в основную загрузочную запись с помощью команды:

sudo grub2-install /dev/sda

GRUB 2 и UEFI

Машины с прошивками UEFI (т.е., практически все машины, продающиеся в течение нескольких последних лет) добавили новый уровень сложности в процесс диагностики проблем системного загрузчика GRUB 2. Несмотря на то, что процедура восстановления работоспособности системного загрузчика GRUB 2, установленного на машине с прошивкой UEFI, не значительно отличается от процедуры восстановления работоспособности этого же загрузчика на машине без прошивки UEFI, в новые версии прошивок вносятся различные изменения, которые являются причиной различных результатов процесса восстановления работоспособности системного загрузчика.

В системах на основе UEFI вам не придется устанавливать что-либо в основную загрузочную запись. Вместо этого вы должны будете установить загрузчик Linux с поддержкой EFI в системный раздел EFI (EFI System Partition, ESP) и выбрать данный загрузчик в качестве используемого по умолчанию с помощью такого инструмента, как efibootmgr в Linux или bcdedit в Windows.

На данный момент системный загрузчик GRUB 2 должен корректно устанавливаться в процессе установки любого из популярных дистрибутивов Linux, что позволяет последнему успешно сосуществовать с ОС Windows 8. Однако, в том случае, если вы получите в результате неработоспособный системный загрузчик, вы сможете восстановить работоспособность системы с помощью live-образа дистрибутива Linux. В процессе загрузки live-образа дистрибутива вам следует убедиться в том, что вы осуществляете загрузку в режиме UEFI. Меню загрузки компьютера должно содержать по два элемента для каждого из съемных носителей - для загрузки в обычном режиме и в режиме UEFI. Используйте последний режим для организации доступа к переменным EFI посредством файлов из директории /sys/firmware/efi/.

Из live-окружения следует смонтировать корневую файловую систему неудачно установленного дистрибутива таким образом, как описано в данном руководстве. Вам также придется смонтировать системный раздел EFI (ESP). Если предположить, что данному разделу соответствует файл устройства /dev/sda1, то вы можете смонтировать данный раздел с помощью следующей команды:

sudo mount /dev/sda1 /mnt/boot/efi

После этого необходимо загрузить модуль ядра efivars с помощью команды modprobe efivars перед созданием окружения chroot с корневой файловой системой неудачно установленного дистрибутива таким образом, как описано в данном руководстве.

Теперь в том случае, если вы используете дистрибутив Fedora, вы можете переустановить системный загрузчик с помощью следующей команды:

yum reinstall grub2-efi shim

После нее следует выполнить команду для генерации нового файла конфигурации системного загрузчика:

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

Пользователи дистрибутива Ubuntu могут выполнить эту же операцию с помощью команды:

apt-get install --reinstall grub-efi-amd64

После восстановления системного загрузчика следует выйти из окружения chroot, отмонтировать все смонтированные разделы жесткого диска и перезагрузить компьютер, перейдя в меню GRUB 2.

Для деактивации сценария из директории /etc/grub.d вам нужно всего лишь убрать бит исполнения, с помощью команды, аналогичной команде chmod -x /etc/grub.d/20_memtest86+, которая позволяет убрать строку Memory Test из меню загрузки

Для деактивации сценария из директории /etc/grub.d вам нужно всего лишь убрать бит исполнения, с помощью команды, аналогичной команде chmod -x /etc/grub.d/20_memtest86+, которая позволяет убрать строку "Memory Test" из меню загрузки

Дружище, где мой GRUB?

Положительной чертой системного загрузчика GRUB 2 является возможность его переустановки при каждой необходимости. Таким образом, в том случае, если вы потеряете системный загрузчик GRUB 2, к примеру, после того, как ОС Windows заменит его на свой собственный загрузчик, вы сможете восстановить GRUB 2, выполнив несколько операций в live-окружении. Если предположить, что вы установили дистрибутив в раздел жесткого диска, представленный файлом устройства /dev/sda5, вы можете переустановить системный загрузчик GRUB 2, в первую очередь создав директорию для монтирования корневой файловой системы дистрибутива с помощью команды:

sudo mkdir -p /mnt/distro

После этого следует смонтировать файловую систему из этого раздела с помощью команды:

mount /dev/sda5 /mnt/distro

После этого вы сможете переустановить системный загрузчик GRUB 2 с помощью команды:

grub2-install --root-directory=/mnt/distro /dev/sda

Данная команда позволит перезаписать информацию в области основной загрузочной записи устройства /dev/sda, содержащего файловую систему установленного дистрибутива Linux, а также такие файлы системного загрузчика GRUB 2, как grubenv и device.map.

Существует еще одна проблема, часто возникающая при эксплуатации компьютеров с несколькими установленными дистрибутивами. При установке нового дистрибутива Linux его системный загрузчик должен извлекать информацию об уже установленных дистрибутивах. В том случае, если он не извлекает подобной информации, вы можете просто загрузить последний установленный дистрибутив и выполнить команду:

grub2-mkconfig

Перед выполнением данной команды следует убедиться в том, что разделы с корневыми файловыми системами установленных дистрибутивов, которые не представлены в меню загрузки, смонтированы. Если дистрибутив, который вы желаете добавить в меню загрузки, работает с файловыми системы /root и /home, расположенными на отдельных разделах жесткого диска, перед исполнением команды grub2-mkconfig следует смонтировать лишь файловую систему /root.

Хотя системный загрузчик GRUB 2 и может определять большинство дистрибутивов, попытка добавления в меню системного загрузчика записи для дистрибутива Fedora при работе с дистрибутивом Ubuntu требует одного дополнительного шага. Если вы использовали стандартные настройки в процессе установки дистрибутива Fedora, силами его установщика будут созданы разделы LVM. В этом случае перед вызовом сценария os-prober из комплекта поставки системного загрузчика GRUB 2 для добавления дистрибутива Fedora в меню загрузки вам в первую очередь придется установить драйвер lvm2 с помощью системы управления пакетами программного обеспечения дистрибутива, воспользовавшись аналогичной командой:

sudo apt-get install lvm2

Быстрое исправление

Если исполнение команды grub2-install не приводит к каким-либо положительным изменениям и вы не можете загрузить дистрибутив Linux, вам придется полностью переустановить и перенастроить системный загрузчик. Для выполнения этой задачи можно воспользоваться полезной утилитой chroot, которая позволяет временно заменить корневую директорию live-окружения на корневую директорию установленной системы Linux, работоспособность которой необходимо восстановить. Вы можете использовать для этой цели Live CD любого дистрибутива Linux, на котором присутствует утилита chroot. Однако, вам следует убедиться в том, что вы используете Live CD для той же архитектуры центрального процессора, что и установленный на жестком диске дистрибутив. Таким образом, если вы желаете использовать утилиту chroot для восстановления работоспособности 64-битной установленной системы, вам понадобится Live CD для 64-битных систем.

После загрузки Live-окружения в первую очередь следует проверить разделы жесткого диска машины. Используйте команду fdisk -l для вывода списка всех разделов жесткого диска и выясните номер раздела, на котором установлен системный загрузчик GRUB 2, работоспособность которого вы желаете восстановить.

Давайте предположим, что вам нужно восстановить работоспособность системного загрузчика дистрибутива, установленного на разделе жесткого диска, который представлен файлом устройства /dev/sda5. Откройте эмулятор терминала и смонтируйте этот раздел:

sudo mount /dev/sda5 /mnt

Теперь вам придется смонтировать директории, которые должны быть доступны системному загрузчику GRUB 2 для корректного выявления других установленных на компьютере операционных систем:

$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /dev/pts /mnt/dev/pts
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys

Теперь вы можете покинуть live-окружение и перейти в окружение установленного на разделе, представленном файлом устройства /dev/sda5, дистрибутива с помощью утилиты chroot:

$ sudo chroot /mnt /bin/bash

Все готово для установки, проверки и обновления системного загрузчика GRUB 2. Как и ранее, для переустановки системного загрузчика следует использовать команду:

sudo grub2-install /dev/sda

Ввиду того, что команда grub2-install не затрагивает файл конфигурации grub.cfg, вам придется создать его вручную с помощью следующей команды:

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

Эта последовательность команд должна помочь исправить проблемы системного загрузчика. Теперь на вашей машине будет установлена новая копия системного загрузчика GRUB 2 со списком всех установленных на ней операционных систем и дистрибутивов. Перед тем, как перезагрузить компьютер, следует покинуть окружение chroot и отмонтировать все использованные файловые системы в следующем порядке:

$ exit
$ sudo umount /mnt/sys 
$ sudo umount /mnt/proc
$ sudo umount /mnt/dev/pts
$ sudo umount /mnt/dev 
$ sudo umount /mnt

После этого вы можете безопасно перезагрузить машину, которая должна вновь вернуться под контроль системного загрузчика GRUB 2, находящегося под вашим полным контролем!

Пользовательские параметры меню загрузки

Системный загрузчик GRUB 2 использует большое количество конфигурационных переменных. В данном разделе описаны некоторые из этих переменных, которые вы скорее всего захотите модифицировать в процессе рассмотрения содержимого файла конфигурации /etc/default/grub. Переменная GRUB_DEFAULT позволяет указать элемент меню загрузки, который будет выбран по умолчанию. в качестве ее значений могут использоваться числа, такие, как число 0, соответствующее первому элементу меню, а также строка "saved" позволяющая автоматически выбирать элемент меню, использованный в процессе прошлой загрузки компьютера. Переменная GRUB_TIMEOUT позволяет задать длительность периода ожидания перед загрузкой с использованием выбранного по умолчанию элемента меню, а переменная GRUB_CMDLINE_LINUX позволяет задать список параметров, который будет передаваться каждому из ядер Linux при использовании соответствующих элементов меню загрузки.

В том случае, если переменная GRUB_DISABLE_RECOVERY имеет значение true, элементы меню загрузки для восстановления системы не будут генерироваться. Эти элементы позволяют загружать дистрибутивы в однопользовательском режиме, в котором вы можете использовать любые доступные инструменты с интерфейсом командной строки для восстановления системы. Еще одной полезной переменной является переменная GRUB_GFXMODE, позволяющая задать разрешение экрана, которое будет установлено при показе меню загрузки. В качестве значения данной переменной может использоваться любое описание разрешения, поддерживаемого вашей графической картой.

Пользовательские элементы меню загрузки

Если вы желаете добавить элемент в меню вашего системного загрузчика, вы должны добавить соответствующий станс в сценарий с именем 40_custom. Вы можете использовать данный элемент меню загрузки, к примеру, для загрузки дистрибутива Linux, установленного на съемном диске с интерфейсом USB. Если предположить, что раздел с дистрибутивом на вашем съемном диске с интерфейсом USB представлен файлом устройства /dev/sdb1, а файл образа ядра vmlinuz и файл initrd находятся в поддиректории корневой директории (/), вам придется добавить следующий станс в файл сценария 40_custom:

menuentry "Linux on USB" { 
set root=(hd1,1) 
linux /vmlinuz root=/dev/sdb1 ro quiet splash 
initrd /initrd.img 
}

Для лучшей совместимости вы можете использовать идентификатор UUID раздела жесткого диска вместо идентификаторов устройства и раздела следующим образом:

set root=UUID=54f22dd7-eabe

Воспользуйтесь командой sudo blkid для получения всех идентификаторов UUID присоединенных к системе жестких дисков и их разделов. Аналогичным образом вы можете добавить в меню загрузки записи, соответствующие любым идентифицированым сценарием os-prober, но установленным на жестком диске дистрибутивам, конечно же, если вы знаете о том, на каком диске установлен каждый из дистрибутивов и по какому пути находятся его файлы образа ядра и образа начальной файловой системы.