На экране grub rescue, сервер не грузится. Разбираем, что сломалось, чиним через chroot и грузим систему вручную. Команды и выводы сняты на стенде.

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

Коротко. По приглашению видно, что именно сломано. grub rescue> чаще всего значит, что потеряна папка с модулями /boot/grub. grub> без слова rescue значит, что не хватает только файла настроек grub.cfg. В первом случае загрузитесь в режим восстановления, смонтируйте диск, зайдите в него через chroot и выполните grub-install на диск целиком, а затем update-grub. Во втором систему можно запустить вручную прямо из строки grub>. Описанный порядок для загрузки BIOS мы воспроизвели на виртуальной машине с Ubuntu 24.04 (загрузка BIOS, GRUB 2.12).

Что такое GRUB и что в нём ломается

GRUB — загрузчик: программа, которая стартует до самой системы, находит на диске ядро Linux и передаёт ему управление. На виртуальной машине с загрузкой BIOS и разметкой MBR, как в нашем стенде, он состоит из трёх частей, и сломаться может любая. На диске с GPT имена и расположение загрузочного образа другие (например, gpt1 вместо msdos1); это мы не проверяли.

  • Загрузочный сектор диска (MBR) — первые 512 байт. Там крошечный код, который умеет одно: запустить следующую часть.
  • Образ загрузчика (core.img) — лежит в свободном зазоре между MBR и началом первого раздела. Он умеет читать файловые системы и знает, где искать папку /boot/grub.
  • Папка /boot/grub на вашем разделе — модули (поддержка файловых систем, команды, меню) и файл настроек grub.cfg со списком ядер.

Отсюда вся логика лечения. Нет папки /boot/grub — переустанавливаем загрузчик командой grub-install. Нет только grub.cfg — пересоздаём настройки командой update-grub. Эти две команды постоянно путают, и зря: первая кладёт загрузчик на диск, вторая пишет для него меню.

Что на экране и что это значит

Что видите

Что сломано

Что делать

error: file '/boot/grub/i386-pc/normal.mod' not found и приглашение grub rescue>

GRUB не нашёл свои модули: папка /boot/grub удалена или повреждена

Чинить через chroot, раздел ниже. Воспроизведено на стенде

Приглашение grub> без слова rescue, меню нет

Нет или повреждён grub.cfg

Загрузить систему вручную, затем update-grub. Воспроизведено на стенде

Меню GRUB есть, а дальше паника ядра или VFS: Unable to mount root fs

Загрузчик цел, проблема в ядре, образе initramfs или параметре root=

Другая тема. Для начала выберите старое ядро в пункте «Advanced options for Ubuntu»

Чёрный экран после «Booting from Hard Disk...» или «No bootable device»

Пустой загрузочный сектор или BIOS смотрит не на тот диск

Проверить порядок загрузки, затем grub-install. Этот случай мы не воспроизводили

Как это выглядит: ломаем и смотрим

Стенд: виртуальная машина с минимальной Ubuntu 24.04, один диск, один раздел, загрузка BIOS, GRUB 2.12. Папку /boot/grub мы удалили командой rm -rf. Так бывает, когда «чистят /boot от старых ядер» слишком широкой маской. Вот что показал экран при следующей загрузке (текст с консоли виртуальной машины, переписан без изменений):

Первая строка с ошибкой говорит: загрузчик из загрузочного сектора запустился, но модулей, чтобы идти дальше, на диске нет. Команда ls показывает диск (hd0), его раздел (hd0,msdos1) и дисковод (fd0). Вторая команда ls показывает, что ядра и образы initrd лежат на месте, а каталога grub среди них нет. insmod normal пытается подгрузить модуль меню и получает ту же ошибку.

Данные при этом целы. Это главное, что нужно запомнить: всё для загрузки лежит на диске, не хватает только загрузчика. Значит, достаточно поставить его заново.

Восстановление GRUB через chroot: шаг за шагом

Идея такая: загрузиться с другой системы, подключить свой диск, «зайти» в него и поставить загрузчик так, будто вы сидите на самом сервере. Другая система — это режим восстановления (или загрузочный ISO, если хостинг его даёт). На странице услуги в кабинете my.weasel.cloud есть кнопки Console, Boot log и Rescue mode. Как именно ведёт себя Rescue mode на вашем тарифе, проверьте у себя: мы в этой статье его не нажимали, всё ниже сняли на виртуальной машине, где вторая система загружена рядом с повреждённым диском.

Шаг 1. Найти свой диск

Как виден диск в режиме восстановления, зависит от хостинга; у нас на стенде это было второе устройство. Узнаём, как он называется, и смотрим размер и метку:

lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINTS

Строки с vda и vdb — это диски, строки с vda1 и vdb1 — разделы на них. На стенде vda — система восстановления (на ней смонтирован /), а vdb — наш повреждённый диск. У вас буквы могут быть другими: /dev/sdb, /dev/vda. Ориентируйтесь на размер и метку, а не на букву. Ошибка здесь дорогая: загрузчик запишется на тот диск, который вы укажете.

Шаг 2. Подключить раздел и убедиться, что это он

Монтируем раздел с вашей системой в папку /mnt и смотрим, что внутри boot:

mount /dev/vdb1 /mnt
ls /mnt/boot

Если видите файлы vmlinuz-... и initrd.img-..., это корень нужной системы. Если /boot у вас вынесен в отдельный маленький раздел (его покажет lsblk), смонтируйте и его командой mount /dev/vdb2 /mnt/boot, подставив свой номер. Вот что вышло на стенде:

Папки grub в списке нет, как и ожидали. Ядра на месте.

Шаг 3. Подключить системные папки и зайти в chroot

chroot делает указанную папку корнем: программы внутри видят /mnt как /. Но одного chroot мало. На неработающем диске папки /dev, /proc и /sys пусты: их наполняет работающее ядро, а ядро у вас сейчас другое. Если запустить установку сразу, получится вот что:

chroot /mnt grub-install /dev/vdb

Ответ: grub-install: error: cannot find a device for /boot/grub (is /dev mounted?). Подсказка в скобках верная. Подключим системные папки из текущей системы:

for d in dev proc sys; do mount --bind /$d /mnt/$d; done

mount --bind показывает уже существующую папку ещё и в другом месте. Теперь внутри /mnt видны те же устройства, что и снаружи. Если корень на LVM, подключите заодно /run; на нашем стенде без LVM хватило трёх папок.

Шаг 4. Поставить загрузчик и собрать меню

Устанавливаем загрузчик на диск целиком (vdb, не vdb1), а потом пересоздаём настройки:

chroot /mnt grub-install /dev/vdb
chroot /mnt update-grub

Первая команда пишет код в загрузочный сектор, кладёт образ в зазор после него и заново создаёт /boot/grub с модулями. Вторая находит установленные ядра и собирает grub.cfg. На стенде это выглядело так:

Строка «Adding boot menu entry for UEFI Firmware Settings» появилась и на машине с BIOS, пугаться её не нужно. Важны две вещи: Installation finished. No error reported. и то, что папка /boot/grub снова существует и в ней лежит grub.cfg. Последняя команда, umount -R /mnt, отключает всё, что мы подключали.

То же самое можно сделать «изнутри»: chroot /mnt /bin/bash, затем те же команды без приставки chroot /mnt, а в конце exit. Результат одинаковый, выбирайте что удобнее.

Шаг 5. Перезагрузить

Выйдите из режима восстановления тем способом, который предлагает кабинет, и перезагрузите сервер. На стенде сразу появилось меню GRUB с двумя пунктами, ядро стартовало само, а через минуту консоль показала Ubuntu 24.04 LTS grublab tty1 и приглашение входа. Загрузка вернулась.

Если ваш сервер грузится по UEFI (проверить можно в системе восстановления командой ls /sys/firmware/efi: папка есть — это UEFI), порядок другой: нужен раздел EFI и другой вызов grub-install. Мы его не проверяли, поэтому подробностей не даём.

Загрузить систему вручную из строки grub>

Если пропал только grub.cfg, GRUB загружает все модули и пускает вас в полную командную строку grub>. Оттуда систему можно запустить руками. Мы удалили grub.cfg и посмотрели, что видно на экране. Заодно ошиблись с путём, и эта ошибка показательна:

В Ubuntu по умолчанию /boot — не отдельный раздел, а папка на корневом. Поэтому ядро лежит по пути (hd0,msdos1)/boot/vmlinuz, а не (hd0,msdos1)/vmlinuz. Вторая ошибка — просто следствие первой: ядро не загрузилось, и образ initrd цеплять не к чему. Правильные команды такие:

linux (hd0,msdos1)/boot/vmlinuz root=/dev/sda1
initrd (hd0,msdos1)/boot/initrd.img

boot

linux загружает ядро и сообщает ему параметром root=, где лежит корневая файловая система. initrd подцепляет начальный образ с драйверами, нужными для старта. boot запускает всё это. При успехе первые две команды молчат. После boot побежит лента сообщений ядра, а через минуту на нашей ВМ появился вход. Имя /dev/sda1 — с нашей виртуальной машины; на VPS корневой раздел чаще называется /dev/vda1, смотрите по ls и lsblk.

Когда войдёте в систему, выполните sudo update-grub, чтобы не загружаться руками при каждом включении. Если ломался не только grub.cfg, добавьте sudo grub-install /dev/vda с именем вашего диска.

Чего делать не стоит

  • Указывать раздел вместо диска. На grub-install /dev/vdb1 GRUB отвечает grub-install: warning: File system `ext2' doesn't support embedding. и заканчивает grub-install: error: will not proceed with blocklists. Это отказ, и он правильный: вы указали раздел, а нужен диск. Не обходите его ключом --force: он ставит загрузчик, несмотря на проблему, на «списки блоков», а их сам GRUB в предупреждении называет ненадёжными (UNRELIABLE).
  • Путать две команды. update-grub не лечит grub rescue>: она пишет меню, а потерян загрузчик.
  • Чистить /boot вручную. Старые ядра убирает sudo apt autoremove --purge, она же обновляет меню. Ручное удаление вроде rm -rf /boot/grub — ровно то, что привело к нашему экрану.
  • Ставить загрузчик, не посмотрев на диски. Перед grub-install всегда проверьте lsblk и убедитесь, что вписанное имя — тот диск.

Как не попасть сюда снова

  • Перед обновлением ядра смотрите свободное место: df -h /. Если оно кончится посреди установки, обновление может оборваться на полпути.
  • Не правьте /etc/default/grub и /boot/grub/grub.cfg без копии. После правки /etc/default/grub запускайте sudo update-grub, а сам grub.cfg руками не редактируйте: он пересоздаётся.
  • Когда сервер снова поднялся, причину ищите в журнале прошлой загрузки: journalctl -b -1 (если журнал хранится между перезагрузками). Как читать журнал, описано в статье про journalctl. Версию системы, от которой зависит выбор команд, подскажет статья о том, как узнать версию Ubuntu или Debian, а остальные частые поломки собраны в разделе о проблемах Linux-сервера.

FAQ

Что такое grub rescue и как из него выйти?

Это аварийная командная строка, в которую GRUB попадает, когда не находит свои модули. Выйти из неё одной командой нельзя: нужно, чтобы папка /boot/grub с модулями снова появилась. Обычно это значит загрузиться в режим восстановления и выполнить grub-install через chroot.

Чем grub-install отличается от update-grub?

grub-install записывает сам загрузчик: код в загрузочный сектор и модули в /boot/grub. update-grub создаёт файл grub.cfg с меню: перечисляет найденные ядра. Потерян загрузчик — нужна первая команда, потеряно меню — достаточно второй.

Потеряю ли я данные при восстановлении GRUB?

Обе команды не трогают ваши файлы. Они пишут в загрузочный сектор и в папку /boot/grub. Риск только один: указать grub-install не тот диск. Поэтому перед запуском сверяйте имя по lsblk и, если на диске есть важное, копируйте его заранее.

Нужна ли консоль, чтобы это починить?

Да: без экрана вы не увидите ни приглашение GRUB, ни сообщение об ошибке. В кабинете my.weasel.cloud на странице услуги есть кнопки Console и Boot log. Сам процесс починки идёт в режиме восстановления или с загрузочного диска.

А если сервер грузится по UEFI?

Тогда вместо загрузочного сектора используется отдельный раздел EFI, и команда grub-install вызывается по-другому. Проверьте режим командой ls /sys/firmware/efi: если папка есть, это UEFI. Описанный здесь порядок мы проверили только для BIOS.

Коротко

  • Приглашение grub rescue> чаще всего значит, что потеряны модули в /boot/grub; grub> без rescue значит, что нет grub.cfg.
  • Данные при этом целы: нужно вернуть загрузчик, а не систему.
  • Порядок: режим восстановления, lsblk, mount, подключить dev proc sys, chroot /mnt grub-install на диск, затем update-grub.
  • Без подключённого /dev grub-install в chroot даёт ошибку cannot find a device.
  • Из строки grub> систему можно загрузить вручную: linux, initrd, boot, с путём вместе с /boot.
  • Устанавливайте GRUB на диск, не на раздел, и сверяйте имя диска по lsblk.

🎁 -40% на первый месяц нового VPS. Промокод GUIDE40
Нужен сервер под ваши задачи? Первый месяц со скидкой.
Введите GUIDE40 при оформлении заказа. Работает один раз на клиента.
Выбрать VPS и забрать скидку →