Обновил сервер с 22.04 до Ubuntu 24.04
Дотянул-таки до обновления домашнего сервера с Ubuntu 22.04 LTS на 24.04. Откладывал, потому что система работала и трогать не хотелось, но поддержка 22.04 не вечная, да и хотелось свежее ядро. Записываю, как прошло и что насторожило.
Сначала подготовка, потому что обновление мажорной версии — это всегда чуть-чуть лотерея. Сделал полный бэкап важных папок (/app, /etc, домашний каталог) через restic. Отдельно — снапшот всей машины на уровне гипервизора, чтобы в случае чего откатиться за минуту целиком, а не восстанавливать по кусочкам. Затем привёл текущую систему в порядок:
sudo apt update && sudo apt full-upgrade
sudo apt autoremove
sudo reboot
Чистый старт без висящих обновлений — чтобы апгрейд не споткнулся о наполовину применённые пакеты.
Сам процесс запускается так:
sudo apt install update-manager-core
sudo do-release-upgrade
Дальше — то, что насторожило по ходу.
needrestart стал интерактивным. В 24.04 он по умолчанию во время апгрейда спрашивает, какие сервисы перезапустить. Посреди длинной установки это неожиданно: думаешь, что процесс идёт сам, а он встал и ждёт ввода. Если хочется тишины, можно заранее перевести его в автоматический режим, поправив /etc/needrestart/needrestart.conf ($nrconf{restart} = 'a';). Я оставил вручную, но имейте в виду — отойти и забыть не получится.
Вопросы про изменённые конфиги. Несколько раз спросило, оставить мою версию конфига или взять версию мейнтейнера (тот самый диалог про *.dpkg-dist). По умолчанию надо оставлять своё, но я каждый раз смотрел дифф через предложенную опцию D, чтобы не пропустить важных изменений в дефолтах.
Сторонние репозитории отключаются. do-release-upgrade закомментировал PPA и внешние списки в sources.list.d. Это нормально и правильно, но после апгрейда их надо осознанно вернуть, поправив на новый кодовое имя релиза (noble), а не вслепую раскомментировать.
После перезагрузки первым делом проверил версию и что вообще живо:
lsb_release -a
uname -r
И главное для меня — контейнеры. Docker пережил обновление нормально, но я всё равно прошёлся по стекам:
docker ps -a
docker compose -f /app/forgejo/compose.yml up -d
Пара контейнеров не поднялась автоматически с первого раза — помогло docker compose up -d по каждому стеку вручную, дальше restart: unless-stopped подхватил. Никаких потерь данных, тома на месте.
Из реально сломанного — практически ничего, что приятно удивило. Один мой самописный скрипт ругнулся на изменившееся поведение системного Python (в 24.04 он строже относится к установке пакетов мимо venv — привет externally-managed-environment), завернул его в нормальный venv и забыл. В остальном — гладко. Снапшот так и не пригодился, но без него я бы нервничал заметно сильнее.