Короткий ответ
Лечение «автообновление всё ломает» — не systemctl mask apt-daily-upgrade.timer. Оставьте security unattended, уберите из Allowed-Origins карманы -updates/-backports/сторонние PPA, перенесите ребут и рестарт Java в согласованное окно (Automatic-Reboot false, needrestart blacklist / nrconf). Точечный apt-mark hold — на конкретный пакет с тикетом, не на libc. Хост host.example (10.0.20.10), пользователь admin. Соседняя задача — чтобы security вообще шли: патчи не идут.
Симптомы и как отличить
- В
/var/log/unattended-upgrades/есть Inst незадолго до падения; journalctl -u myserviceобрыв совпадает сneedrestart;- после ребута DKMS/vpn/nvidia не собрался;
- упал не security openssl, а апгрейд из PPA.
| Падение | Вероятный рычаг |
|---|---|
| Процесс убит, unit restart loop | needrestart |
| После reboot сеть/диск | ядро, initramfs, fstab |
| Другой ABI PHP | карман updates/PPA |
| Кончился диск от journal | не эта статья |
Возможные причины
- Unattended ставит
-updates, не только-security. Unattended-Upgrade::Automatic-Reboot "true"в рабочее утро.- needrestart рестартит
myserviceпри libc/openssl. - PPA в Allowed-Origins
"LP-PPA-...:*". - DKMS не собрался для нового ядра.
- Мало места: распаковка ядра сломала apt на середине — чините диск, не только unattended.
Диагностика
sudo tail -n 100 /var/log/unattended-upgrades/unattended-upgrades.log
sudo grep -E 'Start-Date|Upgrade:|Remove:' /var/log/apt/history.log | tail
ls -l /var/run/reboot-required /var/run/reboot-required.pkgs 2>/dev/null
cat /var/run/reboot-required.pkgs 2>/dev/nullOrigins и ребут:
sudo grep -E 'Allowed-Origins|Automatic-Reboot|Remove-Unused|Automatic-Reboot-Time' \
/etc/apt/apt.conf.d/50unattended-upgradesneedrestart:
dpkg -l needrestart | grep ^ii
sudo needrestart -b
ls /etc/needrestart/conf.d/ 2>/dev/nullТаймеры:
systemctl list-timers apt-daily* --all --no-pager
systemctl cat apt-daily-upgrade.timerСервис:
systemctl status myservice --no-pager -l
journalctl -u myservice --since 'yesterday' --no-pager | tailРешение
Сценарий A. Сузить unattended до security
В 50unattended-upgrades оставьте security (и ESM при Pro). Закомментируйте:
${distro_id}:${distro_codename}-updates-proposed,-backports- шаблоны PPA
Проверка:
sudo unattended-upgrade --dry-run --debug 2>&1 | grep -E 'Allowed|Checking|Inst 'Должны предлагаться пакеты из security. Ручной full-upgrade — только окно.
Сценарий B. Окно ребута, не мгновенный reboot
Unattended-Upgrade::Automatic-Reboot "false";Либо true + Automatic-Reboot-Time "03:30" если политика разрешает ночной ребут этого хоста. Для кластера БД — false и календарь.
Drop-in таймера, чтобы upgrade не совпал с пиком:
sudo systemctl edit apt-daily-upgrade.timer[Timer]
OnCalendar=
OnCalendar=Tue *-*-* 03:30:00
RandomizedDelaySec=15mПустой OnCalendar= сбрасывает дефолт. Документируйте день недели.
Сценарий C. needrestart не трогает JVM
/etc/needrestart/conf.d/myservice.conf:
$nrconf{override_rc}{'myservice\.service'} = 0;Или список в $nrconf{blacklist}. Тогда libc обновится, Java рестартнет дежурный в окне:
sudo systemctl restart myserviceНе отключайте needrestart глобально навсегда — получите процессы на старом openssl без ведома.
Сценарий D. Точечный hold
sudo apt-mark hold pkgname
apt-mark showholdТикет: почему, какая CVE остаётся открытой, дата снятия hold. Не hold '*' .
Pin в /etc/apt/preferences.d/ — для версии, когда hold груб.
Ядро: Unattended-Upgrade::Package-Blacklist { "linux-image-"; "linux-headers-"; }; если ядра только в окне, security userspace оставляйте.
Как отличить «сломал unattended» от «сломал человек в тот же час». Смотрите history.log Start-Date vs journalctl -u myservice первый ERROR. Если пакетный Inst — openssl/libc/java — тогда needrestart/ABI. Если Inst пустой — ищите деплой, диск, OOM.
Окно для ядер отдельно от окна для userspace security: можно ставить security ежедневно в 03:30 без ребута, ядра — во вторник раз в две недели. Blacklist linux-image- в unattended это обслуживает, если вы реально ставите ядра вручную, а не забыли.
PPA и сторонние *.list: даже один packages.example в Allowed-Origins превращает unattended в «что угодно ночью». unattended-upgrade --dry-run --debug должен показывать origin Ubuntu security, не LP-PPA.
Кластер: не один и тот же RandomizedDelaySec=0 на десяти VM — одновременный apt и одновременный ребут. Задайте разные OnCalendar или достаточный RandomizedDelaySec.
Откат пакета: apt-cache policy pkg → предыдущая версия из кэша//var/cache/apt/archives или внутреннее зеркало. apt-get install pkg=version. Не держите вечный pin без CVE-анализа. Snapshot гипервизора — самый быстрый rollback ядра, если GRUB ещё не почистили.
Логи unattended ротируйте, не vacuum в ноль: иначе не докажете, что ночной Inst был. См. защиту логов.
Фиксируйте в калентаре change: «security userspace — автоматически; ядро и major PHP — тикет». Без этой фразы через месяц снова mask таймера как «единственный способ».
Не маскируйте unattended-upgrades.service: это oneshot, основной ритм задают apt-daily таймеры. Смотрите list-timers, не только is-enabled самого service.
Как проверить, что проблема устранена
- Dry-run unattended не тянет PPA/updates.
Automatic-Rebootсоответствует окну.- Инцидентный сервис в blacklist needrestart, ручной restart в журнале смены.
- После тестового security-пакета сервис жив.
- Таймеры не masked. Security всё ещё ставится (лог).
- Патчи не отключены целиком.
Если не помогло
- Ломает сам security nginx: читайте changelog, пините эту версию, следите за следующей. Не mask таймер.
- DKMS: установите
linux-headers-$(uname -r)в окне, соберите модуль до ребута в прод-трафик. - Конфликт
Restart=always+ needrestart гонка — увеличьте timeout, не User=root как «фикс». - Журналы затёрты — настройте защиту логов.
- SELinux/AppArmor denials после обновления профиля пакета — правьте профиль, не disable MAC.
Профилактика
- Staging с тем же unattended на сутки раньше.
- Snapshot VM перед окном ядер.
- Алерт по
needrestart -bиreboot-required. - PPA не в unattended.
- Документ: что авто, что только в change.
FAQ
Можно ли полностью выключить автообновления на 1С-сервере?
Можно вынести рестарт в окно, нельзя «навсегда без security». Иначе получите известный RCE.
Automatic-Reboot и кластер
Ребутайте по одному узлу с проверкой репликации. Не true на всех с одним Reboot-Time.
Почему ломается после libc?
Долгоживущие процессы держат старый .so. needrestart как раз об этом. Blacklist + окно, не вечный hold libc.
unattended удаляет старые ядра и не грузится
Remove-Unused-Kernel-Packages осторожно: оставьте N-1 ядро. Проверьте GRUB с консоли.
Это повод отключить AppArmor?
Нет. Обновлённый пакет мог ужесточить профиль — смотрите DENIED.