VPS не загружается после обновления ядра: что делать
Сервер не отвечает после обновления ядра? Узнайте, как восстановить доступ через консоль провайдера, выбрать старую версию в GRUB и исправить ошибки initramfs или LVM.
Первые действия, если VPS не загружается после обновления ядра
Если VPS не загружается после обновления ядра, проблему обычно можно устранить за несколько минут, так как обновление не удаляет ядро, работавшее ранее. Ubuntu устанавливает новое ядро параллельно со старым и меняет только запись, которую GRUB запускает по умолчанию. Поэтому первым шагом не является восстановление системы. Выберите предыдущее ядро в меню загрузки, получите доступ к приглашению входа в систему, а затем выполните диагностику из работающей ОС.
Исправление этой проблемы на сервере отличается от исправления на ноутбуке, так как к нему не подключена клавиатура и нет монитора, на котором отобразился бы Kernel Panic. SSH также не ответит, поскольку машина не дошла до этапа запуска sshd. Все действия ниже выполняются через консоль вашего провайдера.
Перед внесением любых изменений прочитайте содержимое консоли. Текст на экране определяет тип сбоя, и два сервера, которые «не загружаются», могут требовать противоположных действий для исправления.
Как получить доступ к консоли, если SSH недоступен?
Откройте панель управления вашего провайдера и найдите раздел консоли. Обычно она называется VNC console, web console, noVNC или serial console. Если доступны оба варианта, выбирайте serial console: она предоставляет полноценный текстовый вывод, который можно прокручивать и копировать, в то время как VNC — это лишь графическое изображение экрана. Найдите этот инструмент сейчас, пока сервер исправен, и убедитесь, что он работает. Поиск консоли во время аварии лишает вас спокойствия, необходимого для устранения неполадок. Эту проверку следует выполнять в первые десять минут работы с новым VPS, наряду с настройкой правил firewall и ключей SSH.
Большинство панелей также предлагают режим rescue или образ восстановления. Он загружает минимальную систему из сети провайдера и подключает ваш диск как дополнительное устройство, поэтому данные на диске не запускаются. Режим rescue — это крайняя мера, если повреждён сам GRUB, а также способ скопировать данные с сервера, который вы решили не восстанавливать.
Обычно для доступа к меню загрузки требуется hard reset через панель управления, так как вы не можете выполнить sudo reboot на машине, к которой нет доступа. Hard reset равносилен отключению питания. Файловые системы завершают работу некорректно, поэтому при следующей загрузке ожидайте автоматическую проверку файловой системы.
Как выбрать старую версию ядра в меню GRUB?
Следите за консолью с момента нажатия кнопки сброса. Нажимайте Esc несколько раз в течение первых секунд или удерживайте Shift на машине, которая загружается в режиме legacy BIOS. Окно загрузки короткое, а консоль часто подключается с задержкой, поэтому начинайте нажимать клавишу заранее и продолжайте до появления меню.
Когда появится меню, выберите "Advanced options for Ubuntu". В этом подменю перечислены все установленные ядра, начиная с самого нового, с пунктом recovery mode для каждого из них. Выберите вторую обычную запись — это ядро, предшествующее самому новому, и нажмите Enter. Режим recovery mode — это другое: он загружает минимальную систему для одного пользователя и предназначен для ремонтных работ, а не для восстановления работы ваших сервисов.
Если старое ядро загрузилось, сервер снова в рабочем состоянии. Проверьте текущую версию и запишите её номер.
uname -r
dpkg -l 'linux-image-*' | grep '^ii'Вывод команды dpkg — это список установленных ядер. Если в нём только одна строка, у вас нет резервного варианта, и это первое, что нужно исправить.
Меню GRUB не появляется. Что делать?
Облачные образы поставляются с конфигурацией, которая скрывает меню. В образах Ubuntu время ожидания часто установлено в 0 в файле /etc/default/grub.d/, поэтому система сразу загружает последнее ядро, и у вас нет возможности нажать клавишу.
Бывает и обратная ситуация: меню отображается на экране и ожидает действий, из-за чего кажется, что система зависла. GRUB фиксирует неудачную загрузку, и при следующем запуске может удерживать меню открытым до нажатия клавиши. На сервере без клавиатуры это ожидание длится бесконечно. Если консоль показывает меню и процесс не идет, значит, произошло именно это. Выберите пункт меню, чтобы продолжить загрузку.
Исправьте обе проблемы, пока система работает. Отредактируйте /etc/default/grub:
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10
GRUB_RECORDFAIL_TIMEOUT=10
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200"
GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0,115200"Затем примените изменения и убедитесь, что они сохранились, так как файлы в /etc/default/grub.d/ считываются после /etc/default/grub и могут переопределить ваши настройки.
sudo update-grub
grep -rE 'TIMEOUT|TERMINAL' /etc/default/grub /etc/default/grub.d/GRUB_TERMINAL="console serial" выводит меню как в графическую консоль, так и в последовательный порт, поэтому оно будет доступно в любом средстве просмотра, которое предоставляет ваша панель управления. Аргументы ядра console= делают то же самое для последующих сообщений загрузки. 10 секунд задержки при каждой загрузке — небольшая цена за возможность получить доступ к меню в 2 часа ночи.
К какому классу относится сбой?
Прочитайте последние двадцать строк перед тем, как вывод на консоли остановится. Четыре шаблона охватывают большинство ситуаций, возникающих после обновления ядра.
GRUB не может найти свои файлы. Вы видите приглашение grub rescue> или ошибку о несуществующем разделе или файле, при этом сообщения ядра не появляются. Ядро еще не задействовано. Это происходит после изменения диска или раздела, либо если загрузчик был записан не на то устройство, а не из-за самого пакета ядра.
Ядро запускается, но не может смонтировать корневую файловую систему. Сообщения ядра прокручиваются, после чего вы попадаете в оболочку busybox с приглашением (initramfs), либо загрузка завершается паникой из-за невозможности смонтировать корень. Ядро загрузилось. Initramfs — небольшая временная корневая система, которая находит и монтирует ваш реальный корень — не нашла диск. В Ubuntu перед этой оболочкой обычно выводится сообщение об ожидании корневого устройства с указанием UUID, который система не смогла найти. Скопируйте этот UUID и позже сравните его с выводом blkid.
Логический том не появляется. Это частный случай предыдущей ошибки с конкретной причиной. В приглашении (initramfs) выполните ls /dev/mapper. Если в списке только control, значит, ни один том LVM (logical volume manager) не был активирован, поэтому корневое устройство еще не существует. Активируйте группы томов вручную:
lvm vgchange -ay
ls /dev/mapper
exitexit возвращает управление скрипту initramfs, который повторяет попытку монтирования. Если после этого система загружается, значит, в новом initramfs отсутствуют компоненты LVM. В этом случае нужно пересобрать образ, а не менять ядро.
Никаких признаков Linux. На консоли отображается текст прошивки, оболочка UEFI (unified extensible firmware interface), пустой экран без вывода ядра или происходит циклическая перезагрузка. Сбой происходит до запуска Linux. Проверьте, в каком режиме работает ваш сервер после восстановления, так как многие VPS загружаются в режиме legacy BIOS и не используют путь EFI:
[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS
mountpoint /boot/efi
sudo efibootmgr -vОтсутствие смонтированного /boot/efi во время обновления — частая причина на машинах с UEFI, так как пакеты, отвечающие за системный раздел EFI, в этом случае записывают данные в обычную пустую директорию. Прошивка продолжает запускать старую загрузочную запись, пока она не перестанет соответствовать содержимому диска.
Еще один шаблон вообще не является сбоем загрузки. Если вы попадаете в корневую оболочку с сообщением о переходе системы в аварийный режим (emergency mode), значит, ядро загрузилось, но пользовательское пространство остановилось. Обычно это означает наличие ошибочной строки в /etc/fstab или сбой проверки файловой системы. Выполните journalctl -xb в этой оболочке и прочитайте имя юнита, который вызвал ошибку.
Поврежден пакет ядра или initramfs?
С консоли эти проблемы выглядят одинаково, но требуют разных методов исправления. Загрузитесь с предыдущей версии ядра, а затем сравните файлы.
ls -l /boot/vmlinuz-* /boot/initrd.img-*
df -h /bootДля каждой установленной версии у вас должен быть один vmlinuz- и соответствующий ему initrd.img-, причем оба файла должны иметь адекватный размер. Отсутствие initrd или его размер, значительно меньший, чем у соседних файлов, означает, что генерация initramfs завершилась ошибкой. Чаще всего это происходит из-за переполнения /boot, а доказательства этого находятся в логах пакетов:
sudo grep -iE 'no space|update-initramfs' /var/log/apt/term.log
sudo tail -n 40 /var/log/apt/history.loghistory.log также позволяет точно определить, какие пакеты и когда были установлены в ходе последних операций, что снимает любые вопросы о том, что именно изменилось.
Если раздел /boot переполнен, сначала освободите место, затем пересоберите образ для нужной версии и обновите меню загрузчика. Используйте строку версии из вывода вашего ls, так как приведенный ниже пример является лишь шаблоном:
KVER=6.8.0-XX-generic
sudo update-initramfs -c -k "$KVER"
sudo update-grub
ls -l /boot/initrd.img-$KVERПоследняя команда ls выполняет проверку. Файл нормального размера означает, что образ успешно создан. Если же поврежден сам образ ядра или dpkg -l показывает состояние пакета, отличное от ii, переустановите пакет:
sudo apt install --reinstall linux-image-$KVER
sudo dpkg --configure -aВосстановление из режима rescue, если ядро не загружается
Если ни один пункт меню не работает, загрузите образ rescue от провайдера и восстановите диск извне. Ваш диск будет представлен как несмонтированное устройство, поэтому никакие процессы на нем не запущены и не будут препятствовать работе.
Полная последовательность восстановления через chroot
Сначала выполните lsblk -f и определите реальные имена устройств на вашей машине. /dev/vda часто встречается в KVM, а при установке Ubuntu server корневой раздел часто размещается на LVM как /dev/ubuntu-vg/ubuntu-lv.
sudo lsblk -f
sudo vgchange -ay
sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt
sudo mount /dev/vda2 /mnt/boot
sudo mount /dev/vda1 /mnt/boot/efiПропустите строки, которые к вам не относятся. Во многих образах нет отдельного раздела /boot и EFI-раздела. Затем примонтируйте интерфейсы ядра и войдите в систему:
for d in dev proc sys run; do sudo mount --rbind /$d /mnt/$d; done
sudo chroot /mnt /bin/bashВнутри chroot вы работаете с поврежденной системой, в то время как под ней функционирует исправное ядро. Выполните восстановление:
df -h /boot
update-initramfs -u -k all
update-grub
grub-install /dev/vda
exitgrub-install занимает весь диск в BIOS-системах, а не отдельный раздел. В UEFI-системах используйте grub-install --target=x86_64-efi --efi-directory=/boot/efi и убедитесь, что каталог смонтирован, прежде чем запускать команду. Выйдите с помощью exit, размонтируйте все разделы командой sudo umount -R /mnt, затем переключите панель управления обратно в режим обычной загрузки и перезагрузитесь.
Тестирование нового ядра без риска для следующей загрузки
GRUB позволяет запустить выбранный пункт меню один раз, после чего вернуться к стандартному варианту загрузки. Установите в качестве стандартного ядра то, в котором вы уверены, а затем запустите новое ядро только для одной сессии. Если система не загрузится, аппаратная перезагрузка через панель управления вернет вас к рабочему ядру без необходимости успеть нажать клавишу в консоли.
Установите GRUB_DEFAULT=saved в /etc/default/grub, выполните sudo update-grub, а затем выведите список названий пунктов меню, чтобы точно указать нужный:
grep -E "(menuentry|submenu) " /boot/grub/grub.cfg | cut -d"'" -f2
sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-XX-generic"
sudo grub-editenv list
sudo grub-reboot 0
sudo rebootgrub-editenv list должен вывести выбранное вами название как saved_entry. Этот вывод подтверждает работоспособность механизма, так как для сохранения изменений требуется возможность записи в /boot/grub/grubenv, что на некоторых конфигурациях файловой системы может не работать без уведомлений. Пункт 0 — это верхняя строка меню, соответствующая самому новому ядру. Использовать названия безопаснее, чем порядковые номера, так как номера меняются при каждой установке или удалении ядра.
Почему команда autoremove опасна на сервере без монитора
APT хранит список пакетов ядер, которые запрещено удалять автоматически. Проверьте свой список:
cat /etc/apt/apt.conf.d/01autoremove-kernels
dpkg -l 'linux-image-*' | grep -c '^ii'Этот файл пересоздаётся при каждом изменении пакетов ядра и защищает текущее ядро, а также самые свежие версии. Проблема заключается в таймингах. Если запустить sudo apt autoremove --purge сразу после перезагрузки в новое ядро, защищённый список уже обновится, и старое ядро, на которое вы рассчитывали, перестанет быть защищённым. На компьютере с подключённой клавиатурой это просто неудобство. На headless-сервере это разница между выбором пункта в меню загрузки и монтированием диска из образа восстановления.
Держите минимум два ядра, а если позволяет место — три, как рекомендует /boot. Удаляйте старые ядра по имени после проверки через uname -r, чтобы гарантированно не удалить то, которое используется в данный момент:
uname -r
sudo apt purge linux-image-6.8.0-XX-generic
dpkg -l 'linux-image-*' | grep '^ii'После этого снова выполните последнюю команду. Если количество ядер уменьшилось с трёх до двух — это штатная очистка. Если до одного — это риск сбоя при следующей перезагрузке.
Создание снимка перед обновлением
Снимок, сделанный перед apt upgrade, является единственным способом восстановления, не требующим загрузки системы. Его восстановление возвращает диск в состояние, при котором старое ядро было основным, что позволяет повторить обновление при уже открытой консоли. Снимки работающей машины являются crash-consistent: они фиксируют состояние диска так, будто питание было внезапно отключено. Поэтому, если ваш провайдер поддерживает создание снимков в выключенном состоянии, сначала завершите работу сервера. Снимок не является резервной копией, так как обычно он хранится на той же инфраструктуре, что и копируемый том. Понимание разницы между снимками VPS и полноценными резервными копиями определяет, какой метод спасет вас в случае сбоя, масштаб которого превышает проблемы с ядром.
Это особенно важно при обновлении релиза, когда за один проход меняются ядро, инструменты initramfs, загрузчик и конфигурация GRUB. Создавайте снимок непосредственно перед началом обновления Ubuntu 24.04 до 26.04, а не накануне, чтобы точка восстановления соответствовала состоянию машины, которую вы собираетесь изменить.
Как unattended-upgrades обрабатывает пакеты ядра
Пакет unattended-upgrades в Ubuntu устанавливает обновления безопасности без запроса подтверждения, и пакеты ядра поступают через репозиторий security так же, как и любые другие обновления. Это влечет за собой два последствия.
Во-первых, новое ядро устанавливается, но не запускается. Ядро вступает в силу только после загрузки системы. Появляется файл /var/run/reboot-required, а в /var/run/reboot-required.pkgs указано, что именно потребовало перезагрузки, но система не перезапустится автоматически, если вы не включили Unattended-Upgrade::Automatic-Reboot в /etc/apt/apt.conf.d/50unattended-upgrades.
cat /var/run/reboot-required.pkgs
grep -E 'Automatic-Reboot|Blacklist' /etc/apt/apt.conf.d/50unattended-upgradesВо-вторых, этот временной разрыв скрывает истинную причину проблем. Сервер может установить ядро в марте, а перезагрузиться в июне по совершенно другой причине, после чего не запуститься. Изменение, которое нарушило загрузку, было внесено три месяца назад, поэтому текущие действия администратора не объясняют сбой. В /var/log/apt/history.log можно найти запись о сеансе, в ходе которого было установлено ядро, вызывающее текущую ошибку.
Выполняйте перезагрузку намеренно, в выбранный вами день, с открытым окном консоли. Эта привычка превращает загадочный сбой в двухминутную процедуру выбора в меню. Если вы хотите использовать автоматизацию без сюрпризов, оставьте автоматическую установку включенной, а автоматическую перезагрузку — выключенной. См. настройку unattended-upgrades в Ubuntu для получения точных параметров. Удержание пакетов ядра с помощью sudo apt-mark hold linux-image-generic полностью останавливает их обновление, но одновременно прекращает получение исправлений безопасности для ядра, поэтому рассматривайте это как осознанный компромисс, а не как меру безопасности.
FAQ
Как загрузить старое ядро на VPS без клавиатуры?
Откройте консоль провайдера (VNC или последовательный порт) и выполните принудительную перезагрузку через панель управления, так как штатно завершить работу не удастся. Во время запуска системы нажимайте Esc или удерживайте Shift (для систем с BIOS), чтобы остановить загрузку в меню GRUB. Выберите «Advanced options for Ubuntu» и укажите версию ядра, предшествующую текущей. После появления приглашения входа в систему выполните uname -r, чтобы подтвердить текущую версию ядра, и dpkg -l 'linux-image-*', чтобы просмотреть список установленных ядер. Диагностику проводите только после того, как система успешно загрузилась.
Почему на моем VPS не отображается меню GRUB?
В облачных образах таймаут GRUB часто установлен в 0 в файле из каталога /etc/default/grub.d/, поэтому система загружает последнее ядро без возможности вмешательства. Установите GRUB_TIMEOUT=10 и GRUB_TIMEOUT_STYLE=menu в файле /etc/default/grub, добавьте GRUB_TERMINAL="console serial" для вывода меню в последовательную консоль, а затем выполните sudo update-grub. Проверьте настройки с помощью grep -r TIMEOUT /etc/default/grub /etc/default/grub.d/, так как файлы в этом каталоге считываются после основного файла конфигурации и могут переопределять ваши изменения.
Нужно ли удалять старые ядра для освобождения места в /boot?
Удаляйте только самые старые, оставляя как минимум два. Переполнение /boot само по себе является критической ошибкой, так как генерация initramfs завершится неудачей, и вы останетесь с ядром без рабочего образа. Удаляйте пакеты по точному имени после проверки uname -r, чтобы исключить текущее ядро из списка кандидатов на удаление. Избегайте массового использования sudo apt autoremove --purge на удаленных серверах, так как список защищенных ядер пересоздается при каждом обновлении, и неудачный запуск может оставить вас с единственным ядром без резервного варианта в меню загрузки.
Может ли unattended-upgrades нарушить загрузку системы?
Этот инструмент может установить ядро, которое впоследствии не загрузится, но он не перезагружает систему, если параметр Unattended-Upgrade::Automatic-Reboot не установлен в значение true в файле /etc/apt/apt.conf.d/50unattended-upgrades. Обычно проблема проявляется с задержкой: ядро устанавливается во время автоматического обновления, появляется /var/run/reboot-required, а ошибка обнаруживается только при следующей перезагрузке спустя несколько недель. Выполняйте перезагрузку осознанно при открытой консоли и просматривайте /var/log/apt/history.log, чтобы определить, какой сеанс обновления установил ядро, с которым возникли проблемы.