SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor

Как проверить необходимость перезагрузки в 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-12, оба репозитория BaseOS содержат dnf 4.20.0 вместе с dnf-plugins-core 4.7.0 и yum-utils, и не содержат пакета dnf5. Таким образом, needs-restarting там является тем же самым плагином dnf-plugins-core, который описывается на этой странице, и всё нижеизложенное применимо. Это включает -r, который и выдает подсказку о необходимости перезагрузки и соответствующий код завершения, поэтому используйте его в своих скриптах. В Rocky и Alma 9 используется более старая сборка dnf-plugins-core 4.3.0, и те немногие моменты, где поведение этих двух сборок различается, отмечены ниже.

Уровень 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.

Пакеты, вызывающие необходимость перезагрузки, входят в короткий жестко заданный список внутри плагина. В сборке, которую поставляют Rocky Linux 10 и AlmaLinux 10, он содержит kernel, kernel-core, kernel-rt, glibc, linux-firmware, systemd, dbus, dbus-broker, dbus-daemon и microcode_ctl. Сборка Rocky и Alma 9 содержит тот же список без kernel-core, что важно по причине, описанной в следующем разделе. Проверяйте свой список, а не полагайтесь на предположения.

Каждый элемент находится в этом списке по причине, которую можно четко сформулировать. Новый пакет kernel лишь записывает файлы в /boot и /lib/modules, а работающее ядро нельзя заменить «на лету», поэтому ничего не изменится до перезагрузки. Почти каждый процесс в пространстве пользователя в системе линкует glibc, включая PID 1, что означает, что «перезапуск затронутых сервисов» потребовал бы перезапуска и PID 1, а перезагрузка — это безопасный способ сделать это. dbus и dbus-broker обслуживают все клиентские соединения в системе, поэтому остановка шины на работающей машине разрывает связь с клиентами, которые с ней взаимодействуют. linux-firmware и microcode_ctl загружаются при старте, и на VPS часть с микрокодом обычно ничего не меняет, так как гипервизор хоста управляет физическим CPU.

Вы можете добавить свои пакеты. Любой файл .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 выводит то, что загрузчик выберет в следующий раз. Если эти три значения не совпадают, исправьте настройки загрузки по умолчанию, прежде чем перезагружать машину, к которой у вас нет доступа через консоль.

В Rocky и Alma 9 есть еще один нюанс. Поскольку их плагин сборки отслеживает kernel, но не kernel-core, транзакция, обновляющая kernel-core без пакета kernel, оставляет новое ядро установленным, но не запущенным, в то время как needs-restarting -r сообщает, что перезагрузка не требуется. Red Hat документирует такое поведение для Enterprise Linux 9. Обычный dnf update на машине с установленным пакетом kernel обновляет и этот пакет тоже, поэтому подсказка все равно срабатывает. Запустите rpm -q kernel для проверки. Если команда сообщает, что пакет не установлен, подсказка о перезагрузке не зафиксирует обновления ядра на этой машине, и вам следует сравнивать uname -r с rpm -q --last kernel-core.

Уровень 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 и всё, что вы запустили вручную. Они никогда не перезапускаются сами по себе. --exclude-services существует только в сборках Rocky и Alma 10. В версии 9 этой опции нет, поэтому изучите полный список sudo needs-restarting и исключите процессы, относящиеся к службам из вывода -s.

Не перезапускайте службу из списка, если она относится к пакету уровня перезагрузки системы, например dbus-broker.service. Вместо этого выполните перезагрузку. По состоянию на 2026-10-12, сборки Rocky Linux и AlmaLinux по-прежнему выводят такие службы в общем списке. В пакет CentOS Stream 10 в июле 2026 года было внесено изменение, которое убирает такие службы из списка и выводит Warning: The following services should not be restarted but require a reboot: в stderr. Как только ваш дистрибутив получит это обновление, воспринимайте предупреждение буквально.

Перезапускайте остальные службы по одной и проверяйте каждую перед переходом к следующей.

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 DEL

DEL помечает отображенный в память файл, который был удален с диска. Изучите пути перед выполнением действий. Удаленные временные файлы и файлы, размещенные в оперативной памяти, также отображаются здесь, и они не являются поводом для перезапуска чего-либо.

Уровень 3: прочее

Большинство обновлений попадают в эту категорию и не требуют дополнительных действий. Пакет, файлы которого считываются только при запуске команды, например curl, tar, vim или сам dnf, считается полностью обновленным сразу после завершения работы RPM, так как при следующем запуске будет использован новый бинарный файл. Файлы конфигурации, скрипты, документация и пакеты данных ведут себя аналогично. needs-restarting не будет упоминать ни один из них, и отсутствие сообщений является корректным поведением, а не пропуском изменений.

Единственный нюанс этого уровня — длительность работы процессов. Процесс, запущенный до обновления, продолжает использовать старый исполняемый файл до тех пор, пока не завершится, независимо от того, насколько незначительным был пакет. Именно для этого предназначен sudo needs-restarting --exclude-services или обычный sudo needs-restarting в версии 9.

Почему на машине с 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. В Rocky или Alma 9 есть вторая причина: обновление изменило kernel-core без пакета kernel, за которым сборка 9 не следит, поэтому перезагрузка всё ещё требуется.
  • Ошибка unrecognized-argument при запуске needs-restarting --exclude-services означает, что вы используете сборку 9, в которой нет этой опции. Используйте обычный sudo needs-restarting.
  • Если сервис снова появляется в списке при следующем запуске через несколько минут после того, как вы его перезапустили, его обычно перезапускает что-то другое, либо юнит не смог корректно подняться. Прочитайте systemctl status для этого юнита, прежде чем перезапускать его во второй раз.

FAQ

Перезапускает ли dnf update службы в Rocky Linux?

Как правило, нет. Транзакция записывает файлы и завершается. Некоторые пакеты содержат RPM-скрипты, которые перезапускают соответствующую службу при обновлении, поэтому поведение зависит от конкретного пакета, а не является системной гарантией. Считайте sudo needs-restarting -s основным источником информации: эта команда выводит список служб, файлы которых или файлы их зависимостей изменились после запуска службы, независимо от того, что выполняли скрипты.

Почему needs-restarting -r сообщает, что перезагрузка не требуется, хотя установлено более новое ядро?

Потому что команда сравнивает время установки RPM-пакетов из короткого списка ключевых компонентов со временем загрузки системы. Она не сравнивает версию работающего ядра с версией самого нового установленного ядра. Если вы установили ядро, перезагрузились, но система вернулась к старой версии, так как загрузчик настроен по умолчанию на неё, время установки будет раньше времени загрузки, и проверка не выдаст предупреждений. В Rocky и Alma 9 команда также пропускает обновление kernel-core, если оно выполнено без пакета kernel, так как kernel-core отсутствует в списке для версии 9. Используйте uname -r, rpm -q --last kernel и sudo grubby --default-kernel, чтобы увидеть реальную картину.

Какие пакеты вызывают рекомендацию перезагрузки в Rocky и Alma?

Список, жестко заданный внутри плагина. В Rocky и Alma 10 он включает kernel, kernel-core, kernel-rt, glibc, linux-firmware, systemd, dbus, dbus-broker, dbus-daemon и microcode_ctl. В версии 9 список тот же, но без kernel-core. Вы можете расширить его: создайте файл .conf в каталоге /etc/dnf/plugins/needs-restarting.d/ и добавьте туда имена пакетов (по одному на строку) — они также будут учитываться при проверке необходимости перезагрузки.

Может ли dnf-automatic перезагрузить сервер самостоятельно?

Да. Установите reboot = when-needed в секции [commands] файла /etc/dnf/automatic.conf, и сервер будет перезагружаться только тогда, когда примененная транзакция этого требует. Параметр when-changed выполняет перезагрузку после любого изменения пакетов, а never является значением по умолчанию. Параметр reboot_command управляет процессом, и по умолчанию он выдает вошедшим в систему пользователям предупреждение за 5 минут. Включайте эту функцию только на тех машинах, доступ к загрузке которых вы можете восстановить, так как автоматическая перезагрузка на VPS без доступа к консоли может привести к критическому сбою.

Видит ли needs-restarting процессы внутри контейнеров?

Неэффективно. Команда сопоставляет запущенные процессы с базой данных RPM на хосте, а пакеты внутри образа контейнера в этой базе отсутствуют. Поэтому устаревшая библиотека, включенная в образ, не будет обнаружена. Пересоберите образ и разверните его заново. Состояние хоста по-прежнему важно: среда выполнения контейнеров и общее ядро являются пакетами хоста, и они отображаются в результатах проверки.