Система не загружается после do-release-upgrade: прерванная настройка пакетов и как довести обновление до конца из режима восстановления

Что было. Обновление с 22.04.5 на 24.04 прервалось (по данным автора, из-за проблем с сетью в процессе), после перезагрузки система висит на заставке, затем [FAILED] Failed to start GNOME Display Manager. Половина пакетов новой версии, половина старой, dpkg не завершил настройку.

Как автор восстановил (подтверждено).

  1. В GRUB выбрать Advanced options → recovery mode → root shell (или добавить systemd.unit=rescue.target к параметрам ядра).
  2. mount -o remount,rw /.
  3. Поднять сеть вручную, поскольку DHCP-клиент не запустился: ip link set ens3 up, ip addr add 192.0.2.10/24 dev ens3, ip route add default via 192.0.2.1, echo nameserver 192.0.2.53 > /etc/resolv.conf (на сервере со статикой достаточно netplan apply).
  4. dpkg --configure -a (завершить настройку распакованных пакетов), затем apt --fix-broken install, apt update && apt full-upgrade.
  5. Перезагрузка. Система поднялась как 24.04.

Что важно на сервере.

  • Признак прерванного обновления: apt при любом действии пишет «dpkg was interrupted, you must manually run ‘dpkg --configure -a’». Это не страшно: обновление доводится теми же командами.
  • Если вопрос про замену конфигов (sshd_config, nginx.conf) остался без ответа при обрыве, dpkg --configure -a задаст его снова; отвечать «оставить свою версию» и потом сверять с *.dpkg-dist.
  • Пока не доведено до конца, не запускать do-release-upgrade повторно: он откажется работать на полуобновлённой системе.
  • Ошибка вида «display manager» на сервере означает, что там зачем-то стоит рабочий стол; сервер без графики после того же сбоя просто загрузился бы в консоль с частично настроенными пакетами, что легче лечить.

Почему обновление прерывается. Обрыв SSH-сессии, в которой шёл процесс (поэтому только tmux/консоль), закончившееся место на диске (проверять df -h до старта: нужны гигабайты), нехватка памяти на маленькой машине, отключение сети посередине.

Если в rescue не пускает. Rescue-система поставщика: смонтировать корень в /mnt, mount --bind /dev /mnt/dev и аналогично для /proc, /sys, /run, скопировать /etc/resolv.conf, chroot /mnt, и те же команды dpkg --configure -a и apt.

Снимок перед обновлением остаётся самым дешёвым способом не разбирать всё это: откат занимает минуту.

Обновление выпуска описано в документации Ubuntu Server.