UMGUM.COM 

Восстановление GRUB2 в Debian ( Восстановление GRUB2 в "Linux Debian Lenny/Squeeze/Wheezy" с помощью инсталляционного дистрибутивного диска. )

30 августа 2013  (обновлено 20 сентября 2018)

OS: "Linux Debian Lenny/Squeeze/Wheezy".
Application: "GRUB2 (Grand Unified Bootloader v2)".

Задача: восстановить работоспособность загрузчика операционной системы при широком спектре сбоев такового.


На практике я сталкивался с тремя причинами потери загрузчиком работоспособности: перезапись MBR (фрагмент первого сектора системного диска, в котором записан исполняемый код, запускающий загрузчик) в процессе установки операционной системы не распознающей альтернативные загрузчики (вроде MS Windows, например), невозможность получить доступ к файлам загрузчика в результате изменения принципа монтирования разделов (часто в результате попыток воздействовать на дисковую подсистему путём ручного изменения конфигурации) и сбой автоматического конфигурирования при кардинальном обновлении операционной системы и её подсистем (таким одно время грешил Debian Wheezy в комбинации MDADM+LVM+GRUB2, пока не вышел из тестового статуса). Для каждого из перечисленных сбоев есть свой упрощённый способ решения проблемы, из одного-двух этапов (в "интернетах" их часто путают), но в целях унификации методик, да и вообще, чтобы не забивать себе голову лишней информацией, я всегда восстанавливаю загрузчик одним и тем же проверенным и гарантирующим результат способом, который далее и опишу.

Во всех, без исключения, встретившихся мне руководствах по восстановлению загрузчика GRUB2 рекомендуют делать это с помощью так называемого LiveCD. Применительно для "Linux Debian" я, напротив, советую для восстановления GRUB2 использовать установочный дистрибутивный диск: например образ "netinstall" - он маленький, не более 250MB и не обременён излишествами, обладая в тоже время набором утилит достаточным для полноценной работы с файловой системой в рамках решения поставленной задачи. К тому же не всегда есть возможность срочно скачать и записать на загрузочный носитель (CD, DVD или Flash) образ LiveCD, тогда как инсталляционный образ практически всегда уже имеется.

Итак, мы оказались перед терминалом с сообщением о невозможности осуществить загрузку ОС "Linux Debian" по причине той или иной ошибки. Не будет здесь о причинах: главное, что мы приняли решение восстановить все компоненты загрузчика GRUB2 в основном сохранив его изначальную конфигурацию.


Загружаемся с инсталляционного образа "Linux Debian". Проходим этапы предварительной настройки установщика (пример здесь: Инсталляция "Linux Debian Squeeze"):

обязательно выбираем установку в экспертном режиме,
выбираем английский язык установки, раскладку en_US.UTF-8,
проходим этап сканирования доступных компонентов и их загрузки,
пропускаем этап настройки сети,
пропускаем этап настройки параметров пользователей,
проходим самый важный этап сканирования доступных дисковых устройств (здесь установщик загрузит необходимые для дальнейшей работы модули RAID, LVM и драйверы файловых систем).

Далее инсталлятор более не используем! Всё остальное делаем в командной строке. Переходим в командную строку используя соответствующий пункт установщика "Execute a shell" или элементарно уходим в соседний виртуальный терминал с помощью комбинаций клавиш "Alt+F2".

Суть дальнейших процедур заключается в том, что мы воссоздаём для утилит восстановления окружение файловой системы идентичное (в ограниченном смысле, в рамках решения поставленной задачи, разумеется) тому, что бывает в операционной системе запущенной обычным порядком и после отдаём указание переустановить компоненты загрузчика и перезаписать воссозданную конфигурацию подсистемы загрузки (как это бывает в случае обновления ядра операционной системы и перегенерации образа "initramfs", например).

Первым делом создаём точку монтирования, в которую в дальнейшем будем собирать требуемые нам разделы файловой системы:

# mkdir /mnt/chroot

Основа всего - корневая файловая система. Если точно неизвестно, на каком она разделе расположена, то следует воспользоваться утилитами просмотра списка доступных файловых ресурсов.

Для простых файловых систем может оказаться достаточным утилиты "fdisk":

# fdisk -u -l

Для более современной GPT-разметки файловых систем может понадобится утилита "gdisk":

# gdisk -l

Для файловых систем на LVM (Logical Volume Manager) следует посмотреть в сторону "blkid":

# vgscan; vgchange -ay; blkid

После того, как найдено блочное устройство, на котором расположена корневая файловая система, монтируем её в нашу точку сборки (далее будем работать с LVM):

# mount -v /dev/vg0/lvroot /mnt/chroot

Естественно, что группа томов не обязательно будет называться "vg0", а логический том корневой файловой системы не обязательно будет называться "lvroot".

Чтобы предоставить утилитам восстановления информацию о реальном аппаратном и программном окружении, необходимо показать им содержимое динамически создаваемых директорий "/dev", "/proc" и "/sys":

# mount --bind /dev /mnt/chroot/dev
# mount --bind /proc /mnt/chroot/proc
# mount --bind /sys /mnt/chroot/sys

Если директория "/boot" исполняемых и конфигурационных файлов загрузчика GRUB2 вынесена на отдельный раздел, то таковую также следует смонтировать в точку сборки.

Для простых файловых систем:

# mount -v /dev/cciss/c0d0p1 /mnt/chroot/boot

Для файловых систем на LVM:

# mount -v /dev/vg0/lvboot /mnt/chroot/boot

Если загрузочная система UEFI (пришла на смену MBR, совместно с GPT-разметкой), до дополнительно подмонтировать и её раздел (пример для LVM):

# mount -v /dev/vg0/lvbootefi /mnt/chroot/boot/efi

После того, как все необходимые для восстановления загрузчика файловые системы оказались успешно смонтированы в точку сборки, изменяем для процессов текущего терминале (в котором мы в данный момент работаем) высшую точку корневой файловой системы, смещая её в заранее созданную точку сборки "/mnt/chroot". Тем самым мы изолируем запускаемые в дальнейшем процессы в своего рода "песочнице", заставляя воздействовать таковые на предоставленные им ресурсы, симулируя запущенную обычным образом операционную систему:

# chroot /mnt/chroot

Уже в "песочнице" отдаём команду на установку GRUB2 (размещение исполняемых компонентов в MBR и директории "/boot", а также конфигурирование таковых):

# grub-install --no-floppy /dev/cciss/c0d0

В качестве завершающего штриха рекомендую запустить повторное сканирование и обновление конфигурации загрузчика, проверяя насколько успешно прошли все предыдущие процедуры. Это полезно для того, чтобы быть уверенным, что последующие обновление ядра операционной системы или установка драйверов, вызывающие перегенерацию образа "initramfs" и переконфигурацию загрузчика не приведут к неработоспособности GRUB2 по причине обнаружения какого-нибудь конфликта в файлах настройки:

# update-grub

После успешного завершения проверки очищаем дисковые "кэши" и перезапускаемся:

# sync; sync; reboot -f

Восстановление загрузчика GRUB2 можно считать завершённым.

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


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )