Рано или поздно каждый администратор сам закрывает себе доступ к серверу: опечатка в sshd_config; правило файрвола, под запрет которого попал и порт 22; диск, заполнившийся за ночь; строка в fstab, указывающая на том, которого больше нет. Для таких утр и существует режим восстановления (rescue). Он загружает по сети live-систему, не трогая ваш диск, так что вы можете смонтировать его, исправить ту единственную строку, которая всё сломала, и после перезагрузки получить рабочий сервер. Ниже — как им пользоваться и четыре исправления, которые закрывают большинство случаев.
Что делает режим восстановления
На вкладке Питание сервера пункт Загрузить в режим восстановления перезагружает сервер в небольшой образ на базе Debian, загружаемый по сети. Ваши диски при этом не изменяются и не монтируются: система восстановления работает из оперативной памяти. В ней предустановлен SSH с ключами из вашей панели управления, есть привычные инструменты (mount, chroot, fsck, mdadm, cryptsetup, zfs, редакторы) и доступ к сети. Если вы сломали как раз SSH, поможет консоль в панели. Выход из режима восстановления — обычная перезагрузка; пока он активен, в панели отображается баннер, чтобы вы не забыли о нём.
Прежде всего сделайте в панели снапшот, если это ещё возможно. Если нет (сервер уже в режиме восстановления), диск остаётся в сохранности, пока вы ничего на него не записали; действуйте аккуратно.
Монтируем диск
lsblk -f # find the root partition: usually vda2 (VPS) or md0 / nvme0n1p2 (dedicated)
mount /dev/vda2 /mnt
mount /dev/vda1 /mnt/boot # if /boot is separate; on UEFI images: /mnt/boot/efi
for d in dev proc sys run; do mount --rbind /$d /mnt/$d; done
chroot /mnt /bin/bash # you are now "inside" your server, without running it
На выделенном сервере с программным зеркалом сначала выполните mdadm --assemble --scan и смонтируйте /dev/md0; на ZFS всё монтируется за один шаг командой zpool import -f -R /mnt rpool.
Исправление 1: сломанный конфиг sshd
sshd -t -f /mnt/etc/ssh/sshd_config # from outside the chroot: prints the offending line
nano /mnt/etc/ssh/sshd_config.d/10-hardening.conf
Обычные виновники: блок Match, поглотивший все опции ниже него; PasswordAuthentication no до установки ключа; смена порта без правила в файрволе. Исправьте строку, снова проверьте конфиг командой sshd -t и перезагрузите сервер.
Исправление 2: правило файрвола, которое вас подвело
chroot /mnt ufw disable # ufw: turns it off at next boot; re-enable after fixing the rule
nano /mnt/etc/nftables.conf # nftables: remove or fix the rule, keep the file valid
rm /mnt/etc/iptables/rules.v4 # iptables-persistent: drop the saved rules entirely
Перезагрузитесь, войдите, добавьте недостающее правило allow 22/tcp (или для вашего порта) и снова включите файрвол. Если файрвол настраивается через cloud-init или Ansible, исправьте и источник конфигурации, иначе при следующем запуске вы опять потеряете доступ.
Исправление 3: переполненный диск
du -xh --max-depth=2 /mnt | sort -h | tail -20 # where did it go?
journalctl --root=/mnt --vacuum-size=200M # systemd journal, a common offender
rm -rf /mnt/var/lib/docker/tmp/* # or prune from inside after boot
find /mnt/var/log -name '*.gz' -delete # rotated logs are safe to remove
Освободите несколько гигабайт, перезагрузитесь и после этого займитесь причиной: ротацией логов, скриптом резервного копирования, который пишет на тот же диск, базой данных без политики хранения. Диск, дошедший до 100%, переполнится снова уже в следующем месяце, если причина останется.
Исправление 4: неверная строка в fstab
Запись об отсутствующем томе в /etc/fstab без опции nofail останавливает загрузку на аварийной оболочке, до которой вам не добраться. Закомментируйте строку или добавьте к ней nofail,x-systemd.device-timeout=10 и перезагрузитесь. У каждого монтирования, кроме корневого, должна быть опция nofail: это единственная привычка в работе с fstab, которая полностью исключает такой тип блокировок.
Для чего ещё пригодится режим восстановления
- Сброс пароля root:
chroot /mnt passwd. Панель умеет делать это и без режима восстановления, но не в том случае, если вы поменяли расположение SSH-ключей, на которое она опирается. - Запуск fsck на файловой системе, которая не хочет монтироваться: безопасно делать это можно только на размонтированной системе, то есть из режима восстановления.
- Копирование данных с сервера, который вы бросаете:
rsync -a /mnt/srv/ other-server:/srv/по сети системы восстановления. - Пересоздание загрузчика после неудачного обновления пакета ядра: внутри chroot —
update-grubилиgrub-install(BIOS) /update-initramfs -u. - Расследование взлома при неработающей операционной системе: ничто в ней не сможет от вас спрятаться.
Выход из режима восстановления
exit # leave the chroot
umount -R /mnt # or: zpool export rpool
reboot
Если доступа к оболочке уже нет, то же самое делает кнопка Выйти из режима восстановления на вкладке Питание в панели. Сервер снова загружается со своего диска, а в журнале событий остаётся запись о сеансе восстановления с указанием его длительности.
На будущее
Делайте снапшот перед рискованными изменениями: он превращает восстановление в обычный откат. Изменение файрвола проверяйте так: добавьте правило в ufw, пока открыта вторая сессия. Не закрывайте рабочую SSH-сессию, пока не убедитесь, что новая работает. И обязательно держите включённой двухфакторную аутентификацию в панели: режим восстановления — это дверь с полным доступом, а замок на ней — панель.
