Короткий ответ

Лечение «автообновление всё ломает» — не 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 loopneedrestart
После reboot сеть/дискядро, initramfs, fstab
Другой ABI PHPкарман updates/PPA
Кончился диск от journalне эта статья

Возможные причины

  1. Unattended ставит -updates, не только -security.
  2. Unattended-Upgrade::Automatic-Reboot "true" в рабочее утро.
  3. needrestart рестартит myservice при libc/openssl.
  4. PPA в Allowed-Origins "LP-PPA-...:*".
  5. DKMS не собрался для нового ядра.
  6. Мало места: распаковка ядра сломала 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/null

Origins и ребут:

sudo grep -E 'Allowed-Origins|Automatic-Reboot|Remove-Unused|Automatic-Reboot-Time' \
  /etc/apt/apt.conf.d/50unattended-upgrades

needrestart:

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.