На экране 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. Эти две команды постоянно путают, и зря: первая кладёт загрузчик на диск, вторая пишет для него меню.
Что на экране и что это значит
Что видите | Что сломано | Что делать |
|---|---|---|
| GRUB не нашёл свои модули: папка | Чинить через |
Приглашение | Нет или повреждён | Загрузить систему вручную, затем |
Меню GRUB есть, а дальше паника ядра или | Загрузчик цел, проблема в ядре, образе initramfs или параметре | Другая тема. Для начала выберите старое ядро в пункте «Advanced options for Ubuntu» |
Чёрный экран после «Booting from Hard Disk...» или «No bootable device» | Пустой загрузочный сектор или BIOS смотрит не на тот диск | Проверить порядок загрузки, затем |
Как это выглядит: ломаем и смотрим
Стенд: виртуальная машина с минимальной 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 /mntls /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; donemount --bind показывает уже существующую папку ещё и в другом месте. Теперь внутри /mnt видны те же устройства, что и снаружи. Если корень на LVM, подключите заодно /run; на нашем стенде без LVM хватило трёх папок.
Шаг 4. Поставить загрузчик и собрать меню
Устанавливаем загрузчик на диск целиком (vdb, не vdb1), а потом пересоздаём настройки:
chroot /mnt grub-install /dev/vdbchroot /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/sda1initrd (hd0,msdos1)/boot/initrd.imgboot
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/vdb1GRUB отвечает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. - Без подключённого
/devgrub-installвchrootдаёт ошибкуcannot find a device. - Из строки
grub>систему можно загрузить вручную:linux,initrd,boot, с путём вместе с/boot. - Устанавливайте GRUB на диск, не на раздел, и сверяйте имя диска по
lsblk.
🎁 -40% на первый месяц нового VPS. Промокод GUIDE40
Нужен сервер под ваши задачи? Первый месяц со скидкой.
ВведитеGUIDE40при оформлении заказа. Работает один раз на клиента.
Выбрать VPS и забрать скидку →
