Как проверить необходимость перезагрузки в Rocky и Alma
После выполнения dnf update старые библиотеки остаются в памяти. Используйте утилиту needs-restarting, чтобы определить, какие процессы требуют перезапуска или перезагрузки.
Какие обновления требуют перезагрузки в Rocky Linux и AlmaLinux
В Rocky Linux и AlmaLinux dnf update записывает новые файлы на диск и на этом завершает работу. Ядро, с которым вы загрузились, продолжает выполняться. Каждый процесс, который уже открыл библиотеку, продолжает использовать её копию, так как Linux сохраняет старый файл на диске до тех пор, пока его не закроет последний удерживающий его процесс. Поэтому система может сообщать об отсутствии доступных обновлений, продолжая при этом выполнять код, который был заменён этими обновлениями. В этом плане дистрибутивы не отличаются, так как оба пересобирают одни и те же исходные коды Red Hat, а выбор между Rocky и Alma зависит от гарантий совместимости и поддержки процессоров, а не от того, что вы увидите здесь. Приведённые ниже команды также идентичны тем, что использовались в CentOS, и это не совпадение: оба проекта были созданы как замена CentOS после анонса Stream в 2020 году.
Какие обновления требуют перезагрузки, а какие — только перезапуска сервисов, нужно уточнять у самой системы. Команда, которая даёт ответ на этот вопрос — needs-restarting. Обновления делятся на три уровня. Ядро и небольшой список базовых пакетов требуют полной перезагрузки. Обычные обновления библиотек требуют перезапуска использующих их сервисов. Всё остальное применяется сразу после завершения работы RPM.
Установка needs-restarting
needs-restarting — это плагин для DNF. Плагин поставляется в составе dnf-plugins-core, который уже присутствует в большинстве установок Rocky и Alma. Команда /usr/bin/needs-restarting — это небольшая обертка, поставляемая в yum-utils, которая также отвечает на имя dnf-utils.
sudo dnf install -y yum-utils
needs-restarting --helpОба варианта вызова исполняют один и тот же код, так как обертка вызывает подкоманду DNF:
needs-restarting -r
dnf needs-restarting -rОба пакета поступают из собственных репозиториев дистрибутива, поэтому вам не нужно включать EPEL или репозиторий CRB для этого.
Линейка Rocky Linux 10 и AlmaLinux 10 по-прежнему использует DNF 4. По состоянию на 2026-10-09, оба репозитория BaseOS содержат dnf 4.20.0 вместе с dnf-plugins-core 4.7.0 и yum-utils, и не содержат пакета dnf5. Таким образом, needs-restarting там является тем же самым плагином dnf-plugins-core, который описывается на этой странице, и всё нижеизложенное применимо без изменений. Это включает -r, который и выдает подсказку о необходимости перезагрузки и соответствующий код завершения, поэтому используйте его в своих скриптах.
Уровень 1: обновления, требующие перезагрузки
Сначала выполните проверку необходимости перезагрузки. Она считывает базу данных RPM и время загрузки системы, поэтому работает быстро и не требует прав root.
needs-restarting -rЕсли с момента загрузки не произошло важных изменений, утилита выводит две строки:
No core libraries or services have been updated since boot-up.
Reboot should not be necessary.Если изменения есть, она выводит Core libraries or services have been updated since boot-up:, затем список найденных пакетов, а после этого:
Reboot is required to fully utilize these updates.
More information: https://access.redhat.com/solutions/27943Код завершения передает тот же ответ: 0, если перезагрузка не требуется, и 1, если требуется. Именно на этот код следует ориентироваться в скриптах.
if ! needs-restarting -r >/dev/null; then
logger -t updates "reboot pending on $(hostname -s)"
fiКод завершения 1 в данном случае — это нормальный ответ, а не ошибка. При использовании set -e незащищенная команда needs-restarting -r прервет выполнение вашего скрипта на этой строке, поэтому в примере выше она обернута в if.
Пакеты, вызывающие запрос на перезагрузку, входят в короткий жестко заданный список внутри плагина. В текущих версиях он содержит kernel, kernel-core, kernel-rt, glibc, linux-firmware, systemd, dbus, dbus-broker, dbus-daemon и microcode_ctl. Более старые сборки плагина содержат чуть более короткий список, поэтому проверьте свой, а не полагайтесь на предположения.
Каждый элемент в этом списке находится там по причине, которую можно четко сформулировать. Новый пакет kernel лишь записывает файлы в /boot и /lib/modules, а работающее ядро нельзя заменить «на лету», поэтому ничего не изменится до перезагрузки. Каждый процесс в системе использует glibc, что означает, что команда «перезапустить затронутые службы» потребовала бы перезапуска PID 1, а перезагрузка — это безопасный способ сделать это. dbus и dbus-broker обслуживают все клиентские соединения в системе, поэтому остановка шины на работающей машине приведет к разрыву связи с клиентами. linux-firmware и microcode_ctl загружаются при старте системы, и на VPS часть с микрокодом обычно ничего не меняет, так как физическим процессором управляет гипервизор хоста.
Вы можете добавить собственные пакеты. Любой файл .conf в каталоге /etc/dnf/plugins/needs-restarting.d/ считывается как список имен пакетов (по одному в строке), и эти имена добавляются в список для проверки перезагрузки.
echo 'openssl-libs' | sudo tee /etc/dnf/plugins/needs-restarting.d/openssl.confЭто выбор политики, а не исправление. Это означает: «когда обновляется библиотека TLS, я предпочту перезагрузиться, чем искать каждый сервис, который загрузил её в память».
Откуда берется уведомление о необходимости перезагрузки
needs-restarting -r не сравнивает версию запущенного ядра с версией новейшего установленного ядра. Он сравнивает временные метки. Для каждого пакета из основного списка он считывает время установки RPM и сравнивает его со временем загрузки системы. Если основной пакет был установлен после последней загрузки, ответом будет «требуется перезагрузка». Время загрузки берется из UnitsLoadStartTimestamp через D-Bus, если это доступно, в противном случае — как более позднее из времени изменения /proc/1 и значения поля btime в /proc/stat.
У этого механизма есть одно следствие, о котором стоит знать. Если вы устанавливаете ядро, перезагружаетесь, но возвращаетесь к старой версии из-за того, что загрузчик зафиксирован на ней, время установки теперь оказывается раньше времени загрузки, и needs-restarting -r перестает выдавать предупреждения. Утилита правильно отвечает на свой вопрос. Но это не тот вопрос, который задали вы. Проверяйте ядро отдельно.
uname -r
rpm -q --last kernel
sudo grubby --default-kernelПервая команда выводит текущую версию ядра. Первая строка rpm -q --last kernel содержит самое недавно установленное ядро. grubby --default-kernel выводит то, что загрузчик выберет при следующей загрузке. Если результаты этих трех команд различаются, исправьте настройки загрузчика перед тем, как перезагружать машину, к которой у вас нет доступа через консоль.
Уровень 2: обновления, требующие перезапуска сервисов
Когда RPM заменяет общую библиотеку, он удаляет старый файл и записывает новый. Процесс, который уже отобразил старый файл в память, продолжает использовать старый inode и выполнять старый код. openssl-libs — это наиболее важный случай: исправление в libcrypto вступит в силу для вашего веб-сервера только после его перезапуска.
sudo needs-restarting -sЭтот список содержит systemd-сервисы, файлы которых или файлы их зависимостей были обновлены после запуска самого сервиса. Используйте sudo. Без прав root утилита может прочитать только /proc записи для ваших собственных процессов, поэтому она выдает неполные данные, и короткий список может создать ложное ощущение безопасности.
sudo needs-restarting
sudo needs-restarting --exclude-servicesПервая команда выводит PID и командную строку каждого затронутого процесса. Вторая исключает те процессы, которые уже охвачены systemd-сервисами, оставляя только оболочки входа, сессии tmux, задания cron и всё, что вы запустили вручную. Они никогда не перезапускаются автоматически.
Если сервис из списка также относится к пакетам уровня перезагрузки системы, утилита выведет над ним Warning: The following services should not be restarted but require a reboot:. Воспринимайте это буквально и выполните перезагрузку сервера.
Перезапускайте остальные сервисы по одному и проверяйте каждый из них, прежде чем переходить к следующему.
sudo systemctl restart nginx
systemctl status nginxНе передавайте список через конвейер в systemctl restart. Ваша собственная SSH-сессия — причина этого. В семействе RHEL пакет sshd.service поставляется с KillMode=process, поэтому его перезапуск посылает сигнал слушающему демону, не затрагивая процессы отдельных соединений, и открытая сессия сохраняется. Проверьте это на своем сервере с помощью systemctl cat sshd | grep KillMode, но в первый раз в любом случае держите открытой вторую сессию.
Вы также можете найти те же процессы без использования DNF, что полезно, если вы хотите увидеть пути к соответствующим файлам:
sudo dnf install -y lsof
sudo lsof -n +c 0 2>/dev/null | grep -w DELDEL помечает отображенный в память файл, который был удален с диска. Изучите пути перед выполнением действий. Удаленные временные файлы и файлы в оперативной памяти также отображаются здесь, и они не являются поводом для перезапуска чего-либо.
Уровень 3: всё остальное
Большинство обновлений попадают в эту категорию и не требуют дополнительных действий. Пакет, файлы которого считываются только при запуске команды, например curl, tar, vim или сам dnf, полностью обновляется сразу после завершения работы RPM, так как при следующем запуске будет считан новый бинарный файл. Файлы конфигурации, скрипты, документация и пакеты данных ведут себя аналогично. needs-restarting не будет упоминать ни один из них, и это отсутствие уведомлений является ожидаемым поведением, а не пропущенной проверкой.
Единственный нюанс этого уровня — длительность работы. Процесс, запущенный до обновления, продолжает использовать старый исполняемый файл до тех пор, пока не завершится, независимо от того, насколько незначительным был пакет. Именно для этого предназначен sudo needs-restarting --exclude-services.
Почему на машине с dnf-automatic обновления могут не применяться неделями
Здесь три уровня управления перестают быть просто теорией. Автоматические обновления с помощью dnf-automatic устанавливают пакеты по таймеру, а значение по умолчанию для reboot в /etc/dnf/automatic.conf — never. При использовании apply_updates = yes и reboot = never машина может установить шесть обновлений ядра и исправление glibc за шесть недель, но при этом продолжить работу на ядре и библиотеке C, которые были загружены в нулевую неделю. Журнал обновлений выглядит безупречно. Работающая система не получила ни одного изменения.
Решение состоит из трех строк в /etc/dnf/automatic.conf:
[commands]
upgrade_type = security
apply_updates = yes
reboot = when-needed
reboot_command = "shutdown -r +5 'Rebooting after applying package updates'"reboot принимает значения never, when-changed и when-needed. never — это значение по умолчанию, которое оставляет все решения за вами. when-changed перезагружает систему после любой транзакции, изменившей пакеты; это грубый, но предсказуемый метод. when-needed запрашивает у DNF, требует ли только что выполненная транзакция перезагрузки, поэтому обновление только пользовательского пространства проходит без нее. reboot_command — это то, что запускается фактически, а значение по умолчанию дает вошедшим в систему пользователям пять минут на предупреждение. Настройте random_sleep и расписание таймера так, чтобы перезагрузка попадала в окно, когда вы можете проконтролировать возвращение машины в строй.
Проверьте, какой юнит вы включили с помощью systemctl list-timers 'dnf-*'. В составе dnf-automatic поставляется несколько вариантов, и они ведут себя по-разному, поэтому один лишь файл конфигурации не скажет вам, что именно выполняется.
После запланированного запуска спросите саму машину, а не журнал:
needs-restarting -r; echo "exit: $?"
uname -r
rpm -q --last kernel | head -1Если перезагрузка — это то, что вы не можете запланировать, live kernel patching на VPS является альтернативным путем. Он применяет определенные исправления ядра к работающему ядру без перезагрузки. Он охватывает лишь часть проблем ядра и никак не влияет на glibc или ваши сервисы, поэтому рассматривайте его как способ увеличить интервалы между перезагрузками, а не как способ полностью от них отказаться. Когда вы все же выполняете перезагрузку, делайте это осознанно и оставайтесь в системе, пока машина не ответит, так как обновление ядра — самая частая причина, по которой машина не возвращается в строй. Прочитайте что делать, если VPS не загружается после обновления ядра перед тем, как перезагружать сервер без доступа к консоли, и включите проверку после перезагрузки в регулярный чек-лист обслуживания сервера, чтобы не вспоминать об этом только после инцидента.
Аналогичные задачи в Ubuntu и Debian
В смешанном парке серверов требуются эквивалентные решения. В Ubuntu и Debian флаг необходимости перезагрузки представляет собой файл, а не команду: скрипты пакетов создают /run/reboot-required, а /run/reboot-required.pkgs содержит список пакетов, запросивших перезагрузку, поэтому [ -f /run/reboot-required ] является прямым аналогом needs-restarting -r. В старой документации упоминается /var/run/reboot-required — это тот же самый файл, так как /var/run является символической ссылкой на /run. На стороне сервисов используется needrestart, который по умолчанию установлен в последних релизах Ubuntu Server; он запускается во время apt upgrade, а также может быть запущен отдельно командой sudo needrestart -r l для вывода списка сервисов, требующих перезапуска, без внесения каких-либо изменений. Проблема автоматических обновлений здесь идентична, как и способ её решения: unattended-upgrades в Ubuntu использует Unattended-Upgrade::Automatic-Reboot "true"; и Unattended-Upgrade::Automatic-Reboot-Time "02:00"; в /etc/apt/apt.conf.d/50unattended-upgrades.
Режимы сбоев и их признаки
needs-restarting: command not foundозначает, чтоyum-utilsне установлен. Установите его или используйтеdnf needs-restarting, который работает сразу при наличииdnf-plugins-core.- Скрипт, который останавливается на проверке перезагрузки без сообщения об ошибке, получает код завершения 1 в
set -e. Этот код означает «требуется перезагрузка», поэтому обрабатывайте его как условие, а не как завершение работы скрипта. - Если
needs-restarting -sничего не выводит сразу после обновления библиотеки, значит, вы запустили его безsudo. Без прав root утилита видит только ваши собственные процессы. - Если
needs-restarting -rсообщает, что перезагрузка не требуется, аuname -rпоказывает старую версию, значит, вы загрузились с более старым ядром. Проверка сравнивает время установки со временем загрузки, и оба этих события остались в прошлом. Проверьтеgrubby --default-kernel. - Если сервис снова появляется при следующем запуске через несколько минут после перезагрузки, его обычно перезапускает что-то другое, либо юнит не смог корректно подняться. Прочитайте
systemctl statusдля этого юнита перед тем, как перезапускать его во второй раз.
FAQ
Перезапускает ли dnf update службы в Rocky Linux?
Как правило, нет. Транзакция записывает файлы и завершается. Некоторые пакеты содержат RPM-скрипты, которые перезапускают соответствующую службу при обновлении, поэтому поведение зависит от конкретного пакета, а не является системной гарантией. Считайте sudo needs-restarting -s основным источником информации: эта утилита выводит список служб, файлы которых или файлы их зависимостей изменились после запуска службы, независимо от того, что выполнили скрипты.
Почему needs-restarting -r сообщает, что перезагрузка не требуется, хотя установлено новое ядро?
Потому что утилита сравнивает время установки RPM-пакетов из короткого списка ключевых компонентов со временем загрузки системы. Она не сравнивает версию запущенного ядра с версией самого нового установленного ядра. Если вы установили ядро, перезагрузились, но система вернулась к старой версии, так как загрузчик настроен по умолчанию на неё, время установки будет раньше времени загрузки, и проверка не выдаст предупреждений. Используйте uname -r, rpm -q --last kernel и sudo grubby --default-kernel, чтобы увидеть реальную картину.
Какие пакеты вызывают рекомендацию перезагрузки в Rocky и Alma?
Список жестко задан внутри плагина. В текущих версиях он включает kernel, kernel-core, kernel-rt, glibc, linux-firmware, systemd, dbus, dbus-broker, dbus-daemon и microcode_ctl. Вы можете расширить его: создайте файл .conf в каталоге /etc/dnf/plugins/needs-restarting.d/, добавив туда имена пакетов (по одному на строку), и эти пакеты также будут учитываться при проверке необходимости перезагрузки.
Может ли dnf-automatic перезагрузить сервер самостоятельно?
Да. Установите reboot = when-needed в секции [commands] файла /etc/dnf/automatic.conf, и сервер будет перезагружаться только тогда, когда примененная транзакция требует этого. Параметр when-changed выполняет перезагрузку после любых изменений пакетов, а never является значением по умолчанию. Параметр reboot_command управляет процессом перезагрузки; по умолчанию он выдает вошедшим в систему пользователям предупреждение за пять минут до начала. Включайте эту функцию только на тех машинах, доступ к загрузке которых вы можете восстановить, так как автоматическая перезагрузка на VPS без доступа к консоли может привести к критическому сбою.
Видит ли needs-restarting процессы внутри контейнеров?
Неэффективно. Утилита сопоставляет запущенные процессы с базой данных RPM на хосте, а пакеты внутри образа контейнера в этой базе отсутствуют. Поэтому устаревшая библиотека, встроенная в образ, не будет обнаружена. Пересоберите образ и разверните его заново. Состояние хоста по-прежнему важно: среда выполнения контейнеров и общее ядро являются пакетами хоста, и они отображаются в отчетах.