Сервер упал после обновления: как я научился обновляться без паники
Среда, 07 января 2026 12:33

Сервер упал после обновления: как я научился обновляться без паники

Автор
Оцените материал
(0 голосов)

Последнее обновление чуть не стоило мне работы. Я выполнил стандартную команду sudo apt update && sudo apt upgrade -y, перезагрузил сервер и... он не поднялся. BIOS прошел, но система не загружалась дальше initramfs. На экране мигало: "ALERT! /dev/sda1 does not exist. Dropping to shell!"

Холодный пот покатился по спине. Это был продакшн-сервер с сайтом, который приносил компании деньги каждый час простоя. Я подключился через KVM, оказался в emergency shell initramfs. Стандартные команды не работали, файловая система не смонтирована.

Первым делом проверил доступные диски: ls /dev/sd*. Вместо ожидаемого /dev/sda там был /dev/nvme0n1. Ага! Проблема в том, что после обновления initramfs изменил способ именования дисков. Раньше был SATA-диск как /dev/sda, а теперь система видит NVMe-диск как /dev/nvme0n1.

Я вручную смонтировал файловую систему:

mount /dev/nvme0n1p1 /mnt  # предполагая, что корневая файловая система на первом разделе

Потом проверил /etc/fstab — там действительно были ссылки на /dev/sda1. Это и была причина. Обновление ядра изменило правила именования, а fstab не обновился автоматически. 

Чтобы восстановить сервер, я:

  1. Смонтировал все разделы вручную
  2. Смонтировал /proc, /sys, /dev в chroot-окружение
  3. Пересобрал initramfs с правильными модулями
  4. Обновил grub 

Конкретные команды:

mount /dev/nvme0n1p2 /mnt # корневая файловая система
mount /dev/nvme0n1p1 /mnt/boot
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
mount -a # проверить fstab
nano /etc/fstab # заменить /dev/sda на UUID или правильные имена
update-initramfs -u -k all
update-grub
exit
reboot

Сервер загрузился. Но я понял, что делал все неправильно. Теперь я никогда не обновляю серверы без:

  1. Резервной копии перед обновлением
  2. Проверки свободного места в /boot (часто проблемы из-за нехватки места)
  3. Обновления только одного сервиса за раз
  4. Тестирования обновлений на staging-сервере с такой же конфигурацией 

Самый важный урок: всегда используй UUID вместо имен дисков в /etc/fstab. Команда blkid покажет UUID каждого раздела. Это спасет тебя от многих проблем после аппаратных изменений или обновлений ядра.

Прочитано 187 раз