apt update и apt upgrade: безопасный апгрейд Ubuntu без сюрпризов
`apt update` обновляет список пакетов, `apt upgrade` ставит свежие версии — но между ними легко уронить рабочий сервер. Разбираем разницу с `apt-get`, dist-upgrade vs full-upgrade, чек-лист перед апгрейдом прода, автоматику через `unattended-upgrades` и план Б, если что-то сломалось. Всё на Ubuntu 24.04 LTS.
apt update и apt upgrade: правильный порядок и как не сломать прод
apt update обновляет список пакетов, apt upgrade ставит свежие версии — но между ними легко уронить рабочий сервер. Разбираем разницу с apt-get, dist-upgrade vs full-upgrade, чек-лист перед апгрейдом прода, автоматику через unattended-upgrades и план Б, если что-то сломалось. Всё на Ubuntu 24.04 LTS.
Различаем команды apt
Беда в том, что у apt много похожих команд, и каждая делает своё:
apt update— обновляет список доступных пакетов, опрашивая репозитории из/etc/apt/sources.listи/etc/apt/sources.list.d/*. Ничего на диск не ставит.apt upgrade— ставит более свежие версии уже установленных пакетов. Не удаляет ничего, не ставит новых пакетов даже если они нужны как зависимость.apt full-upgrade(он жеapt-get dist-upgrade) — то же самое, но при необходимости удалит один пакет, чтобы поставить другой, и поставит новые зависимости. Используется при обновлении ядра, релиза LTS-версии Ubuntu.apt install <pkg>— ставит конкретный пакет. До запуска полезно сделатьapt update.apt autoremove— удаляет пакеты, оставшиеся как «осиротевшие» зависимости.apt clean/apt autoclean— чистят/var/cache/apt/archivesот скачанных.deb. На сервере с ограниченным/иногда спасает место.
Стандартный безопасный порядок на проде Ubuntu:
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y
-y — отвечает «yes» на запросы. На проде иногда полезнее без -y, чтобы вручную просмотреть, что именно обновляется.
apt vs apt-get: что использовать
Краткий ответ: на современной Ubuntu (20.04+) для интерактивной работы используйте apt, в скриптах — apt-get (и apt-mark, apt-cache).
Разница исторически такая:
apt-get— низкоуровневая утилита, стабильное API между версиями. Машинно-читаемый вывод. Гарантирует, что в скриптеapt-get -y dist-upgradeчерез 5 лет всё ещё будет работать.apt— обёртка для людей. Цветной вывод, прогресс-бар, более компактный. Пишет в stderr предупреждение «WARNING: apt does not have a stable CLI interface. Use with caution in scripts.»
Поэтому:
# В терминале вручную
sudo apt update && sudo apt upgrade
# В скрипте автоматизации
sudo apt-get update && sudo apt-get -y upgrade
apt update upgrade как одна команда не работает — это две разные подкоманды, между ними обязательно && или новый вызов sudo apt. Команда sudo apt-get update upgrade работает только потому, что apt-get принимает несколько подкоманд через пробел — но это нестандартное поведение, лучше явно разделять.
Безопасный апгрейд прод-сервера
Чек-лист перед apt upgrade на работающем сервере:
1. Снимите снапшот (если файловая система — btrfs или ZFS).
sudo btrfs subvolume snapshot / /.snapshots/root-pre-upgrade-$(date +%Y%m%d)
Подробно про btrfs-снапшоты — в гайде по btrfs subvolume. Если у вас ext4, эквивалент — образ корня через dd или хотя бы бэкап /etc через etckeeper.
2. Посмотрите, что именно обновится.
sudo apt update
apt list --upgradable
apt list --upgradable покажет все пакеты с старой и новой версией. Если в списке есть критичные пакеты (postgresql-*, nginx, linux-image-*) — отдельно прочитайте changelog:
apt changelog nginx
3. Скачайте пакеты заранее.
sudo apt -y -d upgrade
Флаг -d (--download-only) скачивает .deb в /var/cache/apt/archives, но не ставит. Это критично, если вы работаете удалённо: если канал моргнёт во время apt upgrade, частично применённый upgrade ловится в состояние «полуустановлено» и приходится разбирать через dpkg --configure -a.
4. Запустите upgrade в screen или tmux.
tmux new -s upgrade
sudo apt -y upgrade 2>&1 | tee ~/upgrade-$(date +%Y%m%d).log
Если SSH-сессия отвалится — процесс продолжится в tmux. Лог пригодится при разборе аварии.
5. Перезапустите критичные сервисы и проверьте.
После апгрейда библиотек (libssl, libc6) демоны продолжают работать со старой версией в памяти. Проверьте через needrestart (он ставится по умолчанию на 24.04):
sudo needrestart
Он покажет, какие сервисы нужно перезапустить. Для ядра — потребуется sudo reboot.
dist-upgrade vs full-upgrade
Эти две команды делают одно и то же:
apt-get dist-upgrade— синтаксис старогоapt-get.apt full-upgrade— синтаксис новогоapt.
Оба:
- Могут удалять пакеты, чтобы разрешить конфликт зависимостей.
- Могут ставить новые пакеты как зависимости.
- Используются при крупных обновлениях ядра и при
do-release-upgrade.
В отличие от apt upgrade, который никогда не удаляет и не добавляет пакеты:
# Безопасный апгрейд: только обновляет существующее
sudo apt upgrade
# Полный апгрейд: может удалить/добавить, чтобы пройти зависимости
sudo apt full-upgrade
На проде full-upgrade запускают сознательно: например, при переходе на новый kernel-метапакет. В обычной работе достаточно apt upgrade — он не удалит вам пакет внезапно.
apt update apt dist upgrade как поисковый запрос обычно означает порядок «обновить список — потом полный апгрейд», то есть:
sudo apt update
sudo apt full-upgrade
Автоматизируем через unattended-upgrades
На большинстве серверов имеет смысл включить автоматическое применение security-обновлений. Это ставится по умолчанию в Ubuntu Server, но проверим:
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
Конфигурация — в /etc/apt/apt.conf.d/50unattended-upgrades. Базовая логика по умолчанию:
- Применяются только security-обновления (
origin=Ubuntu,archive=jammy-securityдля 22.04,noble-securityдля 24.04). - Запускается раз в день через systemd-таймер
apt-daily-upgrade.timer. - Лог пишет в
/var/log/unattended-upgrades/.
Полезные опции, которые часто меняют:
# /etc/apt/apt.conf.d/50unattended-upgrades
// Автоматический ребут после установки обновлений ядра
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
// Автоматическое удаление пакетов, если зависимость ушла
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// Email с отчётом
Unattended-Upgrade::Mail "ops@example.com";
Unattended-Upgrade::MailReport "on-change";
Проверка, что таймер работает:
systemctl status apt-daily-upgrade.timer
sudo journalctl -u apt-daily-upgrade -n 50
Подробно про systemd-таймеры — в гайде по systemctl enable и unit-файлам.
Откатываем неудачный апгрейд
Если после apt upgrade сервис не стартует:
1. Сначала смотрим, что происходит.
sudo systemctl status nginx
sudo journalctl -u nginx -n 100 --no-pager
Часто проблема не в апгрейде, а в изменённой конфигурации или несовместимом конфиг-файле.
2. Если виноват конкретный пакет, смотрим версии.
apt-cache policy nginx
Покажет установленную версию и доступные. Чтобы вернуться к предыдущей версии (если она ещё в /var/cache/apt/archives или в репозитории):
sudo apt install nginx=1.24.0-2ubuntu7
Зафиксировать пакет, чтобы он не апгрейдился впредь:
sudo apt-mark hold nginx
sudo apt-mark unhold nginx # снять блокировку
3. Если апгрейд оборвался посередине.
sudo dpkg --configure -a # завершить полуустановленные пакеты
sudo apt -f install # починить сломанные зависимости
4. Если ничего не помогает — откат через btrfs-снапшот.
Если перед апгрейдом вы сняли снапшот (см. чек-лист), можно бутнуться в recovery, переименовать сломанный @ и поставить снапшот. Подробности — в гайде по btrfs.
Частые вопросы
Чем apt update отличается от apt upgrade
apt update обновляет локальный список пакетов, опрашивая репозитории. На диске пакеты не меняются. apt upgrade ставит свежие версии уже установленных пакетов на основе этого списка. Запускать всегда в этом порядке: сначала update, потом upgrade.
Что значит apt update apt upgrade одной командой
Это две команды через &&: sudo apt update && sudo apt upgrade. Если первая (обновление списка) пройдёт успешно, запустится вторая (установка свежих версий). Без && через простой пробел они работать не будут — apt update upgrade не валидный синтаксис.
apt или apt-get — что использовать на Ubuntu
Для интерактивной работы — apt (удобнее, цветной вывод). Для скриптов автоматизации — apt-get, у него стабильное CLI без предупреждений. Сами обе команды — обёртки над одним и тем же libapt, поведение идентично.
Чем apt full-upgrade отличается от apt upgrade
apt upgrade никогда не удаляет и не ставит новых пакетов — только обновляет существующие. apt full-upgrade (то же, что старый apt-get dist-upgrade) может удалить пакет ради разрешения зависимостей и доставить новые пакеты. На проде используйте upgrade для рутины и full-upgrade сознательно при крупных обновлениях ядра или релизе LTS.
Как обновить Ubuntu без интерактивных запросов
Используйте флаг -y и переменную DEBIAN_FRONTEND=noninteractive:
sudo DEBIAN_FRONTEND=noninteractive apt-get -y \
-o Dpkg::Options::="--force-confdef" \
-o Dpkg::Options::="--force-confold" upgrade
Опции --force-confdef/--force-confold оставляют ваш текущий конфиг при конфликте — это безопаснее, чем подставлять новый из пакета.
Что делать если apt upgrade завис или прервался
Запустите sudo dpkg --configure -a — завершит установку пакетов в состоянии half-configured. Затем sudo apt -f install — починит сломанные зависимости. После этого можно повторить apt upgrade.
Безопасно ли запускать apt upgrade автоматически
Для security-обновлений — да, стандартная практика через unattended-upgrades. Для всех апгрейдов подряд — на проде нет: мажорные обновления (например, nginx 1.24 → 1.26) могут менять поведение. Лучшая стратегия — автоматический security + ручной apt upgrade по графику с предварительным снапшотом.
Что запомнить
- Порядок всегда:
sudo apt update(обновить список) →sudo apt upgrade(поставить свежие версии). Не наоборот. apt upgradeбезопаснееapt full-upgrade— он не удаляет пакеты. Full-upgrade применяйте сознательно.- Перед прод-апгрейдом: снапшот,
apt list --upgradable, скачать через-d, запуск в tmux/screen. - В скриптах используйте
apt-get, а неapt— уaptнестабильный CLI. unattended-upgradesдля security-обновлений включают почти всегда. Для всех апгрейдов подряд — нет.- При поломке:
dpkg --configure -a→apt -f install→ откат через btrfs-снапшот, если есть.