Linux服务器补丁、内核升级与重启编排
补丁管理不是在所有服务器上执行一次更新命令。真正的生产补丁流程要回答:哪些漏洞影响当前资产、哪些更新必须重启、业务能否逐台摘流、失败后如何恢复,以及如何证明所有目标主机已经达到要求。自动更新如果缺少分批、验证和回滚,可能把安全风险变成可用性事故。
本文适用于 Ubuntu LTS、Rocky Linux、AlmaLinux 等常见服务器发行版。包名、仓库和生命周期应以当前发行版官方公告为准。生产环境执行前应确认备份、控制台访问、启动项和业务回滚能力。
一、建立补丁管理边界
先区分四类动作:
| 类型 | 示例 | 主要风险 |
|---|---|---|
| 常规安全更新 | 用户态库、工具和服务修复 | 服务重启、配置兼容 |
| 内核更新 | kernel、内核模块和驱动 | 必须重启、驱动不兼容、无法启动 |
| 功能更新 | 数据库或中间件大版本 | 数据格式和接口不兼容 |
| 发行版升级 | Ubuntu 22.04到24.04等 | 软件源、配置、内核和依赖整体变化 |
常规月度补丁、紧急漏洞修复和发行版升级必须使用不同流程。不要把数据库大版本升级混在操作系统自动更新中,也不要把“软件包已经安装”当成“运行中的进程已经使用新版本”。
二、资产与责任是前提
每台服务器至少应记录:
- 资产编号、主机名、IP、环境和业务负责人;
- 操作系统、版本、内核、架构和虚拟化类型;
- 业务角色、集群成员关系和故障域;
- 维护窗口、允许中断时间和回滚要求;
- 软件源、代理、仓库凭据及例外包;
- 备份状态、快照能力和带外管理方式;
- 最近更新时间、待重启状态和补丁合规状态。
如果资产清单不完整,自动化只会更快地遗漏未知主机。补丁平台的目标清单应来自可信资产源,而不是某个人临时维护的文本文件。
三、补丁分级与时限
建议按“可利用性、暴露面、资产重要性、缓解措施和变更风险”综合分级,而不是只按 CVSS 分数:
| 等级 | 典型场景 | 建议处理方式 |
|---|---|---|
| 紧急 | 已被利用、互联网暴露、无有效缓解 | 快速评估,小时到数日内修复或隔离 |
| 高 | 影响关键服务、攻击条件较低 | 进入最近维护窗口,优先预生产验证 |
| 中 | 需本地权限或复杂条件 | 纳入常规月度批次 |
| 低 | 影响有限或已有充分控制 | 随正常生命周期处理 |
紧急不等于跳过验证。可以缩短观察时间、扩大并行准备,但仍需最小范围测试、停止条件和回退路径。
四、更新前采集基线
Ubuntu/Debian:
cat /etc/os-release
uname -r
apt list --upgradable
df -hT
systemctl --failed
Rocky Linux/AlmaLinux:
cat /etc/os-release
uname -r
dnf check-update || test $? -eq 100
df -hT
systemctl --failed
还应检查:
/boot空间是否足够;- 软件包管理器是否被其他进程占用;
- RAID、LVM、文件系统和磁盘是否健康;
- 集群是否已经有其他节点离线;
- 负载均衡摘除和健康检查是否可用;
- 备份是否真实可恢复,而不只是任务显示成功;
- 当前启动内核和默认启动项是否一致。
五、Ubuntu补丁策略
先刷新索引并预览变更:
sudo apt update
apt list --upgradable
sudo apt-get -s upgrade
执行安全更新前应核对组织的软件源策略。常规流程示例:
sudo apt-get upgrade
sudo systemctl --failed
test -f /var/run/reboot-required && cat /var/run/reboot-required.pkgs
unattended-upgrades 可自动应用更新,但生产环境仍应配置允许来源、更新窗口、重启策略、日志和失败告警。自动重启不能只按固定时间开启,否则可能在集群多节点同时重启。更稳妥的方式是自动安装、集中识别待重启状态,再由编排流程逐节点重启。
Livepatch 可以减少部分内核安全修复的立即重启需求,但它不能替代正常内核升级、用户态服务重启和计划性维护。仍需跟踪磁盘上已安装内核、当前运行内核和下一次重启计划。
六、Rocky与AlmaLinux补丁策略
查看安全公告和可用更新:
sudo dnf updateinfo list security
sudo dnf check-update
sudo dnf updateinfo summary
预览后执行组织批准的更新:
sudo dnf upgrade --refresh
sudo systemctl --failed
判断是否建议重启,可使用发行版提供的工具或比较运行内核与已安装内核。若安装了 dnf-utils,可检查:
sudo needs-restarting -r
sudo needs-restarting -s
dnf-automatic 适合受控自动下载或安装,但应明确:仅安全更新还是全部更新、是否自动重启、如何告警、仓库不可用时如何处理。数据库、容器运行时和内核通常需要更严格的维护窗口。
七、内核升级必须单独管理
内核升级前至少验证:
- 新内核包已经完整安装;
/boot和 EFI 分区空间充足;- DKMS、存储、网卡、GPU和安全软件模块兼容;
- 默认启动项指向预期内核;
- 旧内核没有被全部清理,保留可回退版本;
- 有虚拟控制台、iDRAC、iLO或其他带外访问;
- 加密磁盘、根文件系统和网络启动流程已知。
重启后检查:
uname -r
systemctl --failed
journalctl -b -p warning
ip -br address
ip route
df -hT
还应验证业务端口、依赖连接、监控采集、日志上报和集群状态。只看到 SSH 能登录并不代表节点已经恢复服务。
八、服务是否需要重启
包更新后,运行进程可能仍映射旧库文件。可结合发行版工具检查,例如:
sudo needrestart
如果没有该工具,可从包变更、服务类型和维护手册判断。重启服务前要注意:
- 配置文件是否被包管理器生成新版本;
- 服务重启是否会清空内存队列或中断长连接;
- 多实例是否允许滚动重启;
- 数据库、消息队列和存储集群是否满足仲裁;
- 重启后是否存在缓存预热和流量爬坡。
九、用Ansible做滚动编排
补丁剧本应控制批次,而不是对全部主机同时执行。简化结构如下:
- name: Rolling patch Linux servers
hosts: app_servers
serial: 1
any_errors_fatal: true
max_fail_percentage: 0
tasks:
- name: Precheck free space
ansible.builtin.assert:
that:
- ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='size_available') | first > 2147483648
- name: Stop when host is not approved
ansible.builtin.assert:
that: patch_approved | default(false) | bool
- name: Apply approved updates on Debian family
ansible.builtin.apt:
update_cache: true
upgrade: safe
when: ansible_os_family == 'Debian'
- name: Apply approved updates on RedHat family
ansible.builtin.dnf:
name: '*'
state: latest
when: ansible_os_family == 'RedHat'
生产剧本还应包含:摘除负载、等待连接排空、备份或快照确认、更新、条件重启、等待 SSH、健康检查、重新加流量和观察窗口。不要把业务健康检查只写成 systemctl is-active。
十、推荐的分批方式
- 实验环境:验证仓库、依赖、内核和自动化逻辑;
- 预生产环境:使用接近生产的数据量和流量;
- 金丝雀主机:选择可快速回退、非唯一角色的生产节点;
- 小批次:按故障域、机房或可用区逐批推进;
- 主体批次:每批完成后保留观察窗口;
- 特殊资产:数据库主节点、仲裁节点和单点系统单独审批。
同一集群的多个副本不能在同一批次全部更新。跨可用区部署时,应确保每一批都保留满足业务峰值的剩余容量。
十一、停止条件与回滚
停止条件要在执行前定义,例如:
- 节点无法在10分钟内重新加入集群;
- 健康检查或关键交易失败;
- 错误率、P99或队列积压超过阈值;
- 新内核出现驱动、文件系统或网络异常;
- 同批次出现超过1台失败主机;
- 监控、日志或安全代理未恢复。
回滚手段按更新类型不同:
- 服务配置:恢复备份配置并重启服务;
- 用户态包:在仓库仍提供旧包且数据格式兼容时降级;
- 内核:从引导菜单启动保留的旧内核并修复默认项;
- 虚拟机:仅在一致性和数据回放风险可接受时恢复快照;
- 有状态服务:按产品级备份与恢复流程处理,不能只回退系统盘。
快照不是通用回滚。数据库和分布式系统恢复快照可能造成时间线、复制和仲裁问题。
十二、补丁后验证与证据
每台主机至少记录:
主机与业务:
变更单号:
补丁前版本:
补丁后版本:
运行内核:
是否重启:
系统健康检查:
业务健康检查:
监控恢复时间:
异常与处置:
执行人/复核人:
自动化结果应区分“成功”“失败”“跳过”“不可达”和“待重启”。不可达不能算合规,跳过也必须有原因和到期时间。
十三、常见事故
/boot已满,内核包安装不完整;- 软件源或代理异常,部分主机拿到不同版本;
- 所有副本同时重启,健康检查来不及恢复;
- 更新了共享库但未重启服务,漏洞扫描仍提示旧进程;
- 新内核缺少第三方驱动,重启后网卡或存储不可用;
- 自动更新覆盖配置文件,服务使用默认配置启动;
- 在补丁期间同时进行发布或容量变更,无法判断故障来源;
- 快照回退导致数据库数据倒退或集群身份冲突。
十四、上线检查清单
- [ ] 目标主机来自可信资产清单并有业务负责人;
- [ ] 已区分安全更新、内核更新、功能升级和发行版升级;
- [ ] 更新包、依赖变化和重启需求已经预览;
- [ ]
/boot、根分区、软件源和包管理器状态正常; - [ ] 备份、控制台访问、旧内核和回滚方式已验证;
- [ ] 集群按故障域滚动更新,不会同时失去仲裁或全部容量;
- [ ] 已定义系统与业务级健康检查;
- [ ] 停止条件、观察窗口和异常升级路径明确;
- [ ] 补丁后版本、运行内核和待重启状态可查询;
- [ ] 例外主机有原因、负责人和补办日期。