Восстановление GRUB

Материал из MediaWiki
Перейти к навигации Перейти к поиску

Если после очередного обновления сверхнестабильной ветки используемого дистрибутива, установки вражеской операционной системы на соседний раздел жёсткого диска или случайного выполнения команды head -c 446 /dev/zero > /dev/sda Ваш GNU/Linux перестал загружаться, причём сбой происходит до загрузки ядра (сразу после заставки BIOS POST), загрузчик (в нашем случае GRUB) нужно переустановить.

Вкратце

  1. Загрузиться с LiveCD.
  2. Получить доступ к Shell с правами суперпользователя.
  3. Выполнить команды:

<syntaxhighlight lang="sh"> mount /dev/sdXY /mnt for f in proc sys dev; do mount -o bind /$f /mnt/$f; done chroot /mnt /usr/sbin/grub-install /dev/sdX for f in dev sys proc; do umount /mnt/$f; done umount /mnt reboot </syntaxhighlight>

Как это сделать?

Поскольку загрузчик на жёстком диске уже не работает, нужно запустить систему с другого носителя. Хорошим выбором является SystemRescueCd или Finnix, но подойдёт любой LiveCD, на котором можно запустить Shell, подмонтировать корневой раздел и сделать в него chroot.

Система на LiveCD запущена, что делать дальше?

Получаем Shell (интерактивную командную строку).

В графическом окружении пользователя это делается запуском т. н. «эмулятора терминала». Примеры: xterm, Konsole, GNOME Terminal, lxterminal… Если система ориентирована на работу из консоли, то shell у Вас уже есть. Убедитесь в том, что этот shell не результат сбоя при попытке запустить LiveCD (на экране не должно быть ошибок вида «gave up waiting for root device»).

Получаем права суперпользователя. Тут всё целиком и полностью зависит от используемого LiveCD. Обычно помогают команды:

sudo -i
su

Также права root могут быть уже в наличии — это можно определить по символу # в конце приглашения командной строки:

root@somelivecdname #
#
gentoo #

Поиск корневой файловой системы

Для начала мы определим, где хранится корневая файловая система.

Если она хранится просто на разделе жёсткого диска (частый случай; обычно так и есть, если Вы не знаете, что это ещё может быть), нам помогут утилиты blkid и fdisk.

Типичный вывод blkid:

# blkid
/dev/sda5: UUID="988b9f74-60e0-43fc-a490-47ba1b81190d" TYPE="crypto_LUKS" 
/dev/sda6: UUID="6d085fca-0675-4fd8-bb14-59e1b06022f6" TYPE="crypto_LUKS" 
/dev/sda4: LABEL="root" UUID="6452ebcc-a034-40e6-81a4-148e2ef17a59" TYPE="ext3" 
/dev/mapper/sda5_crypt: UUID="8ddef706-e5af-48e1-b6be-4558d9472026" TYPE="swap" 
/dev/mapper/sda6_crypt: UUID="0ca95dfb-2c59-4d6c-83ae-4497bff0f78c" SEC_TYPE="ext2" TYPE="ext3" 
/dev/sda2: LABEL="USER" UUID="cd613ec2-ae98-4aa9-a15e-be0156a5a43b" TYPE="ext3" SEC_TYPE="ext2" 
/dev/sda1: LABEL="disk" UUID="9f26970e-7638-4925-9ba6-148eea4537e4" TYPE="ext3" SEC_TYPE="ext2" 
/dev/sdb1: LABEL="SAMSUNG" UUID="17F6-2E45" TYPE="vfat" 
/dev/sdc1: LABEL="WD Passport" UUID="1E29-4D6E" TYPE="vfat" 
/dev/sdb3: LABEL="STORAGE" UUID="52202708-6973-4101-8571-51c81acee409" TYPE="ext3" 

Здесь видно кучу разделов на разных дисках и с разными файловыми системами и метками. Здесь нужный раздел можно легко определить по метке root на его файловой системе. В других случаях корневым может быть единственный раздел с POSIX‐совместимой файловой системой (например, ext3, reiserfs, xfs…).

Примечание: blkid определяет файловую систему ext4 как ext3.

Или можно воспользоваться fdisk -l:

# fdisk -l

Disk /dev/sda: 250 GB, 250056737280 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1       14302   114880783    7  HPFS/NTFS
/dev/sda2           14303       26704    99611032    7  HPFS/NTFS
/dev/sda4           26705       28082    11060752   83  Linux
Warning: Partition 4 does not end on cylinder boundary.
/dev/sda3           28083       30402    18627367    5  Extended
Warning: Partition 3 does not end on cylinder boundary.
/dev/sda5           28083       28331     1992060   82  Linux swap
Warning: Partition 5 does not end on cylinder boundary.
/dev/sda6           28332       30402    16627275   83  Linux
Warning: Partition 6 does not end on cylinder boundary.

Disk /dev/sdb: 250 GB, 250056737280 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       12768   102558928    c  FAT32 LBA
/dev/sdb3           12769       30401   141629040   83  Linux
Disk /dev/sdc: 120 GB, 120031511040 bytes
255 heads, 63 sectors/track, 14593 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1       14593   117218241    c  FAT32 LBA

Здесь показаны размеры разделов, а сами разделы рассортированы по жёстким дискам, к которым они принадлежат; также показаны размеры разделов. Исходя из этих данных, мы тоже можем определить, какой из разделов является корневым.

Наконец, мы могли просто запомнить имя корневого раздела (например, /dev/sda4).

# mount /dev/sda4 /mnt

Кроме того, root может быть зашифрованным, находиться на LVM или RAID. Некоторые предназначенные для восстановления системы LiveCD автоматически включают при запуске все эти вещи (тогда возможный корневой раздел можно найти в выводе blkid), но ручная работа также может потребоваться.

Если раздел зашифрован при помощи LUKS (Linux Unified Key Setup), в выводе blkid будет присутствовать TYPE="crypto_LUKS". Такие диски можно открыть следующей командой:

# cryptsetup luksOpen /dev/sdXY root
Enter passphrase: <здесь вводим пароль; пароль при вводе никак не показан>
# mount /dev/mapper/root /mnt

LVM-тома подключаются следующим образом:

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "<...>" using metadata type lvm2
# vgchange -ay
  <...> logical volume(s) in volume group "<...>" now active
# lvscan
  ACTIVE            '/dev/<...>/root' [<размер>] inherit
  ACTIVE            '/dev/<...>/someothername' [<размер>] inherit
# mount /dev/<...>/root /mnt

Естественно, имя volume group и logical volume в Вашем случае может оказаться другим.

Данная статья или раздел ещё не завершены
Кто-то посчитал, что статья или раздел ниже не содержит какой-то важной информации или имеет проблемы с вёрсткой/текстом. Указана причина: работа с soft-RAID/fake-RAID{{#ifeq: {{{1}}} | nopoint | | . }}

{{#if: Доработка | }}


Это всё? Нет.

Поскольку в современных дистрибутивах файлами в /dev управляет udev, на выключенной системе директория /dev пуста. Соответственно, попытка обратиться к /dev/sda (которого нет в /mnt/dev/) закончится неудачно. Кроме того, в редких случаях система может потребовать себе ещё и /proc и /sys. Это мы тоже учтём:

# for f in dev proc sys; do mount -o bind /$f /mnt/$f; done

Более того, в некоторых установках /boot бывает вынесен на отдельный раздел (часто в этом случае монтирование корня тоже затруднено необходимостью выполнять cryptsetup, поднимать LVM или RAID). Соответственно, /boot (на котором и хранится загрузчик) тоже нужно монтировать:

# chroot /mnt mount /boot

Установка загрузчика

Пользователи Debian и производных дистрибутивов (Ubuntu, Mint) могут просто воспользоваться одной командой и переходить к следующему разделу:

# chroot /mnt dpkg-reconfigure grub-pc

Примечание: на большинство вопросов (о параметрах ядра и т. п.) нужно отвечать нажатием клавиши «Enter»; в вопросе о том, куда ставить загрузчик, нужно ставить галочки клавишей «Пробел», а подтверждать свой ответ — «Enter».

В общем же случае действия пользователя будут чуть более сложными:

chroot /mnt
grub-install /dev/sdX
exit

…где sdX — целевой жёсткий диск. Обратите внимание: ставить загрузчик нужно именно на жёсткий диск (в MBR), а не на его раздел. Второй вариант иногда тоже нужен, но тогда читатель сам знает, что ему делать.

Также может быть полезной выполненная в chroot’е (т. е. после chroot и перед exit) команда:

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

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

Завершение работы

Для начала размонтируем те файловые системы, которые были смонтированы внутрь /mnt. Это может быть /boot, если мы его монтировали ранее:

# chroot /mnt umount /boot

Также необходимо размонтировать /proc, /sys и /dev:

for f in sys proc dev; do umount /mnt/$f; done

И, наконец, размонтируем саму корневую файловую систему:

# umount /mnt

Если мы пользовались cryptsetup, шифрованный диск нужно отключить:

# cryptsetup luksClose root

В случае LVM для завершения работы с ним тоже нужна отдельная команда:

# vgchange -an
  0 logical volume(s) in volume group "<...>" now active
Данная статья или раздел ещё не завершены
Кто-то посчитал, что статья или раздел ниже не содержит какой-то важной информации или имеет проблемы с вёрсткой/текстом. Указана причина: завершение работы с RAID{{#ifeq: {{{1}}} | nopoint | | . }}

{{#if: Доработка | }}


Всё! Осталось только перезагрузиться (например, командой reboot) и надеяться, что загрузчик заработает.