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