Fedora 的更新节奏很快,常规的 dnf update 会把系统里所有软件包都升到最新版本,这对桌面用户来说问题不大,但对生产环境的服务器而言风险不小。如果只想修补安全漏洞、暂时不引入其他功能性变更,dnf 提供了专门的安全过滤参数,可以精确地只拉取安全类补丁。这篇文章围绕如何检查和安装安全更新展开,同时介绍自动化方案和回滚手段。

一、查看系统中待安装的安全更新
最基础的操作是先确认当前系统有多少个安全相关的更新在等待安装。dnf 的 --security 参数配合 check-update 可以做到这一点:
dnf check-update --security
这条命令的退出码很有讲究:返回 0 表示没有待更新的安全补丁,返回 100 表示存在可用更新,返回 1 才代表出错。因此在脚本里判断系统是否安全,可以直接检查退出码,而不需要解析命令输出。
如果想看得更直观一些,可以用 updateinfo 子命令。它会把安全公告的编号、类型、严重程度一并列出来:
dnf updateinfo list available --security dnf updateinfo summary
输出里会看到类似 FEDORA-EPEL-2024-xxxx 或 FEDORA-xxxx 之类的公告编号,每条对应一个已发布的 CVE 修复。注意这些数据来自仓库的 updateinfo 元数据,如果仓库缓存太旧,结果可能不准确,建议先执行 dnf makecache 刷新一下。
二、只安装安全更新而不升级其他包
确认存在安全更新后,执行只针对安全项的升级非常简单:
dnf update --security
dnf 只会从仓库中挑选标记为 security 的包进行升级,其余的 bugfix 和 enhancement 类更新会被跳过。这在内核、OpenSSL、OpenSSH 这类关键组件上特别实用,比如只想堵住 SSH 的漏洞,不想顺带把整个桌面环境都升级一遍。
还可以进一步按严重程度过滤,例如只安装重要及以上的安全更新:
dnf update --sec-severity=critical,important
另一个常见需求是修复特定公告,比如已经明确知道某个 CVE 编号,只想打这一个补丁:
dnf update --advisory=FEDORA-2024-abcdef12 # 或者直接按 CVE 编号 dnf update --cve=CVE-2024-12345
执行前 dnf 会像平常一样列出将要变动的软件包清单,确认无误后输入 y 即可。升级内核后记得重启,或者用 needs-restarting -r 检查是否有进程需要重启才能生效。
三、用 dnf-automatic 实现安全更新的自动化
手动检查总是有遗漏的时候,Fedora 官方仓库里提供了 dnf-automatic 这个组件,它基于 systemd timer 定期运行,适合服务器场景。先安装:
dnf install dnf-automatic
配置文件位于 /etc/dnf/automatic.conf,关键配置如下:
[commands] upgrade_type = security apply_updates = yes [emitters] emit_via = motd,email
upgrade_type = security 表示只处理安全更新,apply_updates = yes 表示自动下载并安装,不加这一项的话 dnf-automatic 默认只下载不安装。配置好后启用定时器:
systemctl enable --now dnf-automatic.timer
默认每天运行一次,具体触发时间可以用 systemctl list-timers dnf-automatic.timer 查看。如果担心自动更新引入问题,可以采取折中方案:apply_updates = no 只自动下载,再配合邮件通知,由管理员择机手动执行安装。
四、更新出问题时的回滚方法
安全更新偶尔也会导致兼容性问题,好在 dnf 保留了完整的事务历史,可以按事务编号回退。先查看历史记录:
dnf history list
找到出问题的事务编号,查看它的详细内容确认是哪次更新:
dnf history info 23
确认无误后执行回滚,撤销该次事务的所有包变动:
dnf history undo 23
需要注意两点:第一,回滚依赖旧版本包仍在仓库中可用,如果旧版本已被清理,undo 可能失败;第二,涉及数据库结构变更的软件(比如 PostgreSQL 大版本升级)不能用这种方式回退。因此建议在执行安全更新前先用 dnf history 记下当前事务编号,把回退路径留好。
综合来看,检查用 dnf check-update --security,安装用 dnf update --security,长期维护交给 dnf-automatic,再配合 history 回滚作为保险,这套组合基本能覆盖 Fedora 系统安全更新的全部日常场景。