На домашнем сервере обновления безопасности обычно откладываются на вечер, который никак не наступается. Между тем для Debian и Ubuntu давно есть штатное решение — пакет unattended-upgrades: он ставит только исправления безопасности, в фоне и по расписанию, а всё остальное не трогает. Разберём реальные пути конфигов, покажем, как проверить работу в режиме dry-run, и перечислим ловушки, из-за которых обновления молча перестают приходить.
Установка и включение
Пакет есть в основном репозитории обоих дистрибутивов:
sudo apt update
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
В диалоге ответ «Yes» включает ежедневные фоновые обновления. Проверить, что механизм активен, можно по таймерам systemd и значению периодичности APT:
systemctl list-timers 'apt-daily*' --no-pager
grep -R "APT::Periodic" /etc/apt/apt.conf.d/ | grep -v "^#"
Два ключевых файла
Вся настройка живёт в двух местах. Первое — /etc/apt/apt.conf.d/20auto-upgrades: оно задаёт, что и как часто делает периодическая служба APT.
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
Числа здесь означают количество дней: единица даёт ежедневное выполнение, а AutocleanInterval раз в неделю чистит устаревшие загрузки пакетов из /var/cache/apt/archives. Второе и главное — /etc/apt/apt.conf.d/50unattended-upgrades. Именно он определяет, какие репозитории считаются доверенными:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Mail "root";
Unattended-Upgrade::MailOnlyOnError "true";
Unattended-Upgrade::Syslog "false";
Unattended-Upgrade::AllowUnauthenticated "false";
Строка с суффиксом -security оставляет только официальные исправления безопасности. На Ubuntu туда же обычно добавляют ${distro_idESM}:${distro_codename}-infra-security для подписки Pro. Полезные ключи: Remove-Unused-Kernel-Packages вычищает старые ядра (частая причина переполнения /boot), Remove-Unused-Dependencies убирает осиротевшие зависимости, Automatic-Reboot выключен — перезагрузку вы планируете сами, а AllowUnauthenticated в значения false запрещает ставить неподписанные пакеты.
Что обновляется, а что нет
Allowed-Origins задаёт белый список репозиториев. Распространённая ошибка — считать, что туда попадают все обновления пакетов: на деле только те, что объявлены исправлениями безопасности. Если хотите получать и обычные пакеты из ветки -updates, добавьте ещё одну строку с суффиксом -updates, но на сервере чаще оставляют одну безопасность. Обратите внимание на другую деталь: на чистом Debian значение всех APT::Periodic по умолчанию ноль — файл /etc/apt/apt.conf.d/10periodic гасит периодику, и без 20auto-upgrades автоматика молча не работает. Ubuntu поставляет ненулевые значения сразу.
Есть и чёрный список пакетов, которые автоматика не должна трогать:
Unattended-Upgrade::Package-Blacklist {
"docker-ce";
"linux-image-*";
};
Unattended-Upgrade::FixDpkg "true";
Чёрный список пригодится, когда обновление ядра или движка контейнеров требует ручной проверки: пакет останется ждать вас, а остальные исправления уедут вовремя. Ключ FixDpkg возвращает dpkg в рабочее состояние, если прошлый запуск прервался посреди распаковки пакета.
Проверка перед боем
Прежде чем доверить сервер автоматике, прогоните сухой запуск с подробным выводом:
sudo unattended-upgrades --dry-run --debug
less /var/log/unattended-upgrades/unattended-upgrades.log
sudo journalctl -u unattended-upgrades.service --since "7 days ago"
В dry-run будут перечислены пакеты, которые система поставила бы прямо сейчас. Если список пуст, сравните его с командой apt list --upgradable: непустой список при пустом dry-run означает, что пакеты не проходят по фильтрам Allowed-Origins. Если и там пусто — до машины не доходят списки пакетов, проверьте обновление индексов и доступность зеркала. Журнал в /var/log/unattended-upgrades/ пишется отдельно от dpkg и переживает перезапуски — это основной след при разборе инцидентов, когда непонятно, ставились ли обновления ночью.
Почта и уведомления
Ключи Mail и MailOnlyOnError отправляют письма через локальный агент отправки. Без настроенного MTA сообщения никуда не уходят, и это первое, что стоит проверить:
echo test | mail -s "test" root
which sendmail
Если отправка не настроена, включите Unattended-Upgrade::Syslog «true» и читайте события через journalctl либо поставьте легковесный msmtp и перенаправляйте письма на личный адрес. Письмо об ошибке уходит при неудачной установке пакета — именно этот сигнал нельзя пропускать, ведь молчаливый сбой обновления оставляет уязвимость в системе на неопределённое время.
Перезагрузка после обновления ядра
Обновление ядра требует перезагрузки, иначе система продолжает работать с уязвимым кодом. Вариант для сервера без присутствия администратора:
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-RebootTime "03:00";
Unattended-Upgrade::Automatic-RebootWithUsers "false";
Убедитесь, что в это время никто не работает с файлами на сервере, и что после перезапуска сервисы поднимаются сами: юниты с WantedBy=multi-user.target стартуют автоматически, а запуск из-под рабочего стола — нет. На настольных машинах вместо автоматической перезагрузки удобнее периодически проверять устаревание командой needrestart и перезагружаться вручную.
Проверка после перезагрузки
Если автоматика всё же перезагрузила машину, убедитесь, что система поднялась на новом ядре и старое не занимает место в /boot:
uname -r
apt list --installed 2> /dev/null | grep linux-image
sudo needrestart
Команда needrestart перечислит службы, запущенные с устаревшими библиотеками, — их перезапуск на сервере обычно безопасен и выполняется вручную в удобное окно. Если старых ядер накопилось несколько, почистите их через sudo apt autoremove и проверьте свободное место командой df -h /boot.
Типичные ловушки
- /boot заполнен. Проверьте
df -h /boot. Лечится включением Remove-Unused-Kernel-Packages и периодическимsudo apt autoremove --purge. - Пакеты удерживаются. Список покажет
apt-mark showhold, снимается удержание командойsudo apt-mark unhold имя-пакета. Удержанные пакеты не обновляются и блокируют весь прогон. - Интерактивный запрос needrestart. Если обновление упирается в вопрос о перезапуске служб, задайте переменную окружения NEEDRESTART_MODE=a или отключите интерактивный режим в /etc/needrestart/needrestart.conf.
- Обновления скачиваются, но не ставятся. Смотрите лог dpkg:
grep -E "Inst " /var/log/dpkg.log | tailпокажет фактические установки за последние дни.
Итог
unattended-upgrades снимает главную проблему домашних и серверных систем — человеческий фактор: исправления безопасности ставятся вовремя, без напоминаний и откладываний. Настройка сводится к двум файлам: 20auto-upgrades задаёт периодичность, а 50unattended-upgrades — политику. Обязательно проверьте работу через dry-run, настройте получение ошибок и держите под контролем место в /boot: эти три шага превращают автоматику из чёрного ящика в предсказуемый инструмент.