惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News - Newest:
Hacker News - Newest: "LLM"
AI
AI
T
Troy Hunt's Blog
GbyAI
GbyAI
H
Hacker News: Front Page
SecWiki News
SecWiki News
V2EX - 技术
V2EX - 技术
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
Hacker News: Ask HN
Hacker News: Ask HN
S
Secure Thoughts
Last Week in AI
Last Week in AI
MyScale Blog
MyScale Blog
L
LINUX DO - 最新话题
C
CERT Recently Published Vulnerability Notes
C
Cyber Attacks, Cyber Crime and Cyber Security
O
OpenAI News
S
SegmentFault 最新的问题
Y
Y Combinator Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Cloudflare Blog
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
Google DeepMind News
Google DeepMind News
Simon Willison's Weblog
Simon Willison's Weblog
Know Your Adversary
Know Your Adversary
K
Kaspersky official blog
T
The Exploit Database - CXSecurity.com
S
Securelist
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
The GitHub Blog
The GitHub Blog
B
Blog
F
Fortinet All Blogs
I
InfoQ
C
Check Point Blog
Webroot Blog
Webroot Blog
博客园 - 叶小钗
P
Privacy International News Feed
Latest news
Latest news
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
N
News | PayPal Newsroom

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Автообновления Linux: почему сервер моргает по утрам, а кластер теряет кворум
sh112 · 2026-06-25 · via Все публикации подряд на Хабре

Средний

8 мин

71

Автообновления Linux: почему сервер моргает по утрам, а кластер теряет кворум

⚠️ Ахтунг: тут пробегал ИИ.

💡 Не все знали, но всё это время: Ubuntu Server и Debian устанавливают security-обновления автоматически и по умолчанию. Если на серверной инсталляции ничего специально не отключали — этот механизм уже работает прямо сейчас.

У одного и того же механизма — пакетных автообновлений — два типичных артефакта в эксплуатации.

На одиночном сервере — сервис «моргает» утрами. По журналу видно, что в 06:xx или около того он был остановлен и сразу же запущен, причиной никто конкретно не назначен, и админ месяцами ищет «плавающий ночной даунтайм», списывая его то на сеть, то на GC.

На кластере из трёх–пяти узлов — кластер устроен правильно с точки зрения избыточности, переживает падение одного узла, и в какой-то момент сам себя роняет: на всех узлах в одно и то же утро прилетело обновление с перезапуском сервиса. Кворума не осталось, клиент видит «недоступно».

Источник у обоих один. Разберём.

Откуда вообще приходят автообновления

Debian / Ubuntu — unattended-upgrades

В Ubuntu 24.04 и Debian 12 пакет unattended-upgrades устанавливается по умолчанию и включён, как минимум для канала security. Раскладка такая:

  • /etc/apt/apt.conf.d/20auto-upgrades — общий рубильник: включено ли вообще автоматическое обновление и нужно ли каждый день делать apt update.

  • /etc/apt/apt.conf.d/50unattended-upgrades — политика: какие репозитории трогать (Origins-Pattern), какие пакеты исключить (Package-Blacklist), писать ли отчёт на почту, разрешать ли автоматическую перезагрузку хоста (Automatic-Reboot).

Сам процесс запускается двумя systemd-таймерами:

  • apt-daily.timer — обновляет индекс пакетов и скачивает то, что разрешено. Срабатывает дважды в сутки, со случайной задержкой до 12 часов.

  • apt-daily-upgrade.timer — собственно ставит обновления. По умолчанию OnCalendar=*-*-* 6:00 с RandomizedDelaySec=60m.

Здесь уже видна потенциальная ловушка: окно установки — один час после шести утра, плюс-минус секундное распределение. У вас три одинаково настроенных узла — все три попали в это окно. Если для двух из них таймер случайно выпал в один и тот же 10-минутный интервал — обновление пакета с вашим сервисом запустилось на обоих почти синхронно.

Fedora и RedOS — dnf-automatic

В семействе RPM есть свой аналог: пакет dnf-automatic. В отличие от Debian-семейства, он не установлен по умолчанию ни в Fedora, ни в RedOS — администратор включает его сознательно:

sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

Конфигурация — в /etc/dnf/automatic.conf. Ключевые поля:

  • download_updates — скачивать ли заранее.

  • apply_updates — устанавливать или только скачать (по умолчанию no — то есть «только скачать», но это часто меняют).

  • upgrade_type — default (всё) или security (только security-канал).

Триггер — таймер dnf-automatic.timer. По умолчанию OnCalendar=*-*-* 6:00 с RandomizedDelaySec=1h. Та же узкая одночасовая полоса, что и в Ubuntu, та же проблема для кластера.

В RedOS Murom 7.x используется тот же dnf-automatic. Семантически ничего нового.

Что происходит при обновлении пакета

Допустим, в репозиторий вышла новая версия пакета, в нём — бинарь сервиса с systemd-юнитом. Дальше пакетный менеджер делает следующее:

  1. Распаковывает новый бинарь поверх старого.

  2. Запускает скриптлеты пакета (postinst в .deb%post / %posttrans в .rpm). Посмотреть их можно через dpkg -e или rpm -q --scripts <pkg>.

  3. В типовом случае postinstall дёргает systemctl daemon-reload, а дальше — systemctl try-restart <service> или restart, если юнит был запущен. Точная команда зависит от того, как пакет собрали: dh_installsystemd в Debian-семействе по умолчанию делает перезапуск; в RPM это решение мейнтейнера.

  4. В Ubuntu 22.04+ поверх этого работает ещё needrestart: он сканирует все процессы в системе и через /proc/PID/maps находит те, у которых обновлённый (а на самом деле — уже удалённый из файловой системы и заменённый новым) исполняемый файл или библиотека остались примонтированными в адресное пространство. Такие процессы он помечает к перезапуску.

Важная деталь: перезапуск касается не только сервиса, чей пакет обновился. Если в очередное unattended-upgrade попал security-фикс на популярную системную библиотеку — libssl3libcurl4libsystemd0libc6zlib1g — за ней перезапустится всё, что с ней динамически слинкованоnginxpostgresqlsshdredis, ваши собственные демоны. На практике это самая частая причина «кластер падает раз в две недели по непонятной причине»: обновляется не сам сервис, а маленький пакет в его транзитивных зависимостях.

Посмотреть, кто что держит:

sudo needrestart -b           # сводный список того,
                              # что собирается перезапустить
sudo lsof | grep '(deleted)'  # процессы с уже удалёнными
                              # файлами в адресном пространстве

Поведение needrestart в неинтерактивном режиме (то есть в unattended-upgrades) задаётся в /etc/needrestart/needrestart.conf ключом $nrconf{restart}:

  • 'a' — перезапускать всё автоматически (типовая настройка в Ubuntu Server по умолчанию);

  • 'i' — спрашивать у пользователя (на сервере без TTY означает «не перезапускать»);

  • 'l' — только записать список в журнал, ничего не трогать.

Заодно полезно знать: статически слинкованные бинари (Go с CGO_ENABLED=0, Rust с musl-target, нативные с -static) от обновления системных библиотек не страдают — у их процессов в /proc/PID/maps нет внешних .so, и needrestart их не трогает.

Итог: внутри одного apt upgrade или dnf upgrade ваш сервис — и не один он — действительно может быть перезапущен. Без вашего вмешательства, без уведомления и одновременно с обновлением на других узлах того же кластера.

Артефакт 1: одиночный сервер моргает по утрам

Одиночный сервер. На нём крутится сервис: веб-приложение, прокси, база, брокер очередей — не важно. Жалоба от пользователей или из мониторинга: «каждое утро около шести сервис недоступен 10–30 секунд». В течение дня — никаких проблем. Утром — повторяется.

Это не утечка памяти, не GC-пауза, не сетевой провал и не зависание после первой большой нагрузки. Скорее всего это автообновление какого-то пакета, в чьих транзитивных зависимостях оказался ваш сервис или одна из его системных библиотек.

Проверить за две минуты:

# Что вообще запускалось ночью?
sudo journalctl -u apt-daily-upgrade.service --since "7 days ago"
sudo journalctl -u dnf-automatic.service --since "7 days ago"

# Что обновлялось — список пакетов с временем
sudo tail -n 200 /var/log/apt/history.log
sudo tail -n 200 /var/log/dnf.log

# Перезапускался ли ваш сервис в эти же моменты?
sudo journalctl -u <ваш-сервис>.service --since "7 days ago" \
    | grep -E "Stopping|Started|Stopped"

Если временные метки совпадают — диагноз подтверждён. Дальше варианты:

  • Принять. Если сессии переподключаются автоматически и пользователь это не замечает — пусть моргает; зато безопасность накатывается сама.

  • Разнести по времени (см. ниже), чтобы окно обновления было не во время бизнес-часов и не в одинаковое время каждый день.

  • Запретить трогать конкретный пакет: добавить его в Package-Blacklist в /etc/apt/apt.conf.d/50unattended-upgrades или в exclude= в /etc/dnf/automatic.conf. Сервис не будет обновляться вообще, перезапусков не будет — но и security-фиксов не будет; принимаемое решение.

  • Запретить автоматический перезапуск сервисов через needrestart в режиме «только список» (см. ниже) — обновлять пакеты можно, но рестарт делает админ или CI.

Артефакт 2: кластер теряет большинство по совпадению окон

Простой счёт. Допустим:

  • Три узла кластера, одинаково настроенные.

  • Стандартный таймер apt-daily-upgrade.timer с RandomizedDelaySec=60m. Распределение равномерное по 60-минутному окну.

  • Обновление пакета сервиса занимает 20 секунд, перезапуск — ещё 5–10.

Вероятность того, что два узла из трёх попадут в окно перекрытия в 30 секунд — порядка 1,5–2 % на одно ночное обновление. На дистанции в год это срабатывает примерно раз. На пяти узлах — уже заметно чаще; и достаточно одного раза, чтобы кластер на короткое время потерял большинство и оборвал текущие сессии.

Если ваше приложение допускает потерю одного узла, но не двух одновременно (типовая ситуация для систем с кворумом — Raft, Paxos, большинство брокеров с N+1 резервом), это проблема обнаружения: вы её увидите как редкие, плохо воспроизводимые «ночные провалы» доступности.

Как разнести во времени

Идея простая: расписание автообновления не должно быть одинаковым на всех узлах. Дальше вопрос — насколько системно вы это разносите.

Минимум: разный OnCalendar на каждом узле

На каждом узле кластера переопределяете таймер локальным drop-in:

sudo systemctl edit apt-daily-upgrade.timer

Содержимое drop-in для первого узла:

[Timer]
OnCalendar=
OnCalendar=*-*-* 03:00
RandomizedDelaySec=10m

Для второго:

[Timer]
OnCalendar=
OnCalendar=*-*-* 05:00
RandomizedDelaySec=10m

И так далее. Пустая OnCalendar= обязательна — она сбрасывает значение из юнита, заданное по умолчанию, иначе расписаний будет два. Применить:

sudo systemctl daemon-reload
sudo systemctl restart apt-daily-upgrade.timer
sudo systemctl list-timers --all | grep apt-daily-upgrade

Для dnf-automatic.timer всё то же самое, имя только другое: systemctl edit dnf-automatic.timer.

Получше: убрать автоматический перезапуск сервиса

Если вы не хотите, чтобы пакетное обновление трогало ваш сервис в принципе — даже если бинарь обновился — можно настроить needrestart в режиме «только список, без действий»:

sudo $EDITOR /etc/needrestart/needrestart.conf
# $nrconf{restart} = 'l';   # list only

В режиме l он только запишет в журнал, какие сервисы следовало бы перезапустить — и оставит решение администратору.

Для Debian/Ubuntu без needrestart можно временно блокировать запуск сервисов через policy-rc.d:

sudo install -m 0755 /dev/stdin /usr/sbin/policy-rc.d <<'EOF'
#!/bin/sh
exit 101
EOF

exit 101 означает «действие не разрешено» — dh_installsystemd это понимает и перезапуск не выполняет. Сервис при этом продолжит работать со старым бинарём, пока вы не перезапустите его вручную. На системах с настроенными Linux capabilities и долго живущими подключениями это часто как раз то, что нужно — перезапуск делает дежурный или CI.

Серьёзно: координация через внешний инструмент

Когда узлов много или они в нескольких регионах — разные OnCalendar становятся хрупкими (легко забыть один при добавлении). Тогда нужна координация уровнем выше пакетного менеджера:

  • Ansible с serial: 1 (или serial: "30%") — обновляет кластер по одному, с проверкой работоспособности между шагами;

  • Kubernetes через PodDisruptionBudget и rolling-update — гарантирует, что одновременно недоступно не более N узлов;

  • Salt orchestrate / Chef runlist — то же.

Автообновление пакета при этом обычно отключают совсем:

# Debian/Ubuntu
sudo systemctl disable --now apt-daily-upgrade.timer
# Fedora/RedOS
sudo systemctl disable --now dnf-automatic.timer

И полагаются на оркестратор, у которого есть карта кластера и понимание кворума.

На первый взгляд кажется лишней суетой ради «всё равно когда обновится» — но цена разъехавшегося NAS, ушедшего в split-brain посреди ночи, обычно сильно выше, чем час, разово потраченный на правильный конфиг расписания и перезапусков.


Оригинал статьи — с подсветкой кода и актуальной версией текста — лежит в блоге: ololo.tech/articles/sysadmin/auto-updates-cluster.