Rocky 9:内核更新后重启的判断与安排
Rocky 9.8 环境(特权容器,宿主内核 5.14.0-687.54.1.el9_8)实测:uname -r、needs-restarting -r、rpm -q kernel。日志:plans/content-expansion/evidence/logs/rocky-reboot-policy.log。
容器 rootfs 里没有内核包(rpm -q kernel 返回未安装),所以「内核更新后返回 1」的分支未在本环境触发,按命令语义与 dnf 文档说明;真实主机上的判断逻辑一致。
一条命令给答案
Section titled “一条命令给答案”uname -rneeds-restarting -r; echo "rc=$?"5.14.0-687.54.1.el9_8.x86_64No core libraries or services have been updated since boot-up.Reboot should not be necessary.rc=0rc=0 不用重启,rc=1 需要重启。判断依据是「自启动以来更新过的、影响运行中系统的包」,不是「今天装了多少包」。
容器里没有内核包,说明什么
Section titled “容器里没有内核包,说明什么”rpm -q kernelpackage kernel is not installed容器共享宿主内核、自身不装 kernel 包——这也解释了为什么容器里的 needs-restarting -r 恒为 0:它看不到内核更新。这条结论不能搬到真实主机上。
服务级与整机级
Section titled “服务级与整机级”needs-restartingdnf needs-restartingneeds-restarting:列出需要重启的服务;dnf needs-restarting:dnf 子命令封装,语义相同;needs-restarting -r:只回答整机是否必须重启。
三者都来自 yum-utils。只重启服务能解决的,不要重启整机。
必须重启的判定表
Section titled “必须重启的判定表”| 更新对象 | 处理 |
|---|---|
| kernel | 重启进新内核,否则漏洞未修 |
| glibc / systemd / openssl | 重启整机(进程共享这些库) |
| 普通服务(nginx、sshd) | 重启对应服务即可 |
重启窗口清单
Section titled “重启窗口清单”needs-restarting -r确认确实需要;dnf history list看这轮更新装了什么;- 摘流(负载均衡/健康检查)、确认回滚镜像或快照;
- 重启后核对
uname -r、关键服务状态、needs-restarting -r回到 0。
- 容器里验证重启策略:容器无内核包,结论不可迁移;
- 只看服务重启:内核与核心库不会因重启服务而生效;
- 长期不重启:内核 CVE 补丁一直没生效。
练习:判断并记录
Section titled “练习:判断并记录”needs-restarting -r; echo "rc=$?"needs-restartinguname -r检查:
- 记录
rc - 列出需要重启的服务(如有)
- 说明当前内核版本与最新安装内核是否一致
- 给出是否需要整机重启的结论与理由
常见问题
为什么容器里 needs-restarting 总是 0?
容器不装 kernel 包,共享宿主内核,工具看不到内核更新;重启策略必须在真实主机上判断。
needs-restarting 与 dnf needs-restarting 有区别吗?
语义相同,前者是独立命令、后者是 dnf 子命令,都来自 yum-utils;脚本里任选一种,注意不要与 -r 混用。
重启前必须做什么?
确认确实需要(-r 返回 1)、看 dnf history 了解影响面、摘流并准备回滚,重启后核对内核版本与服务状态。
- 安装后核对:安装后 7 项核对
- 最小化与 DVD:安装组差异
- 日志轮转:logrotate 实战