
昨天,一个新的零售交易平台的新漏洞(CVE-2024-10877)刚刚公布时,我正在香港荃湾A5数据中心值夜班。凌晨 1 点业务量依旧维持在 9 万 TPS——传统换核重启根本不可行。“必须零停机上线补丁!” 我立刻拉起应急会议,决定用 kpatch(RHEL 系)和 livepatch(Ubuntu 系)为 120 台物理机热打补丁。
两小时后,交易系统毫无感知地完成加固;第二天早晨财务报表零误差,这次经历也让我把整套流程固化成 SOP。下面就是我复盘并持续打磨的实操教程。
1、方案选型:kpatch 还是 livepatch?
| 发行版 | 默认内核配置 | 官方热补丁框架 | 备注 |
|---|---|---|---|
| AlmaLinux 8 / RHEL 8-9 | CONFIG_LIVEPATCH=y |
kpatch | 由 Red Hat 维护;ELRepo 提供预编译补丁 |
| Ubuntu 20.04 LTS+ | CONFIG_LIVEPATCH=y |
Canonical livepatch | 需注册 UA Token,支持 x86_64/arm64 |
| SLES / openSUSE | CONFIG_LIVEPATCH=y |
kGraft | 原生集成,思路与 kpatch 类似 |
我在香港机房主要跑 AlmaLinux 8.9 和 Ubuntu 22.04;因此以下示例分别演示 kpatch-build 自建补丁和 Canonical livepatch 订阅式分发两种路径。
2、 前置条件与环境准备
确认内核支持:
uname -v # 确保包含 "livepatch" 字样
modprobe livepatch
编译工具链:
dnf groupinstall "Development Tools" -y
dnf install elfutils-libelf-devel rpm-build bpftool -y
kpatch 工具套件安装(AlmaLinux):
dnf --enablerepo=elrepo-kernel install kpatch kpatch-build -y
开启符号导出(若要自行编译补丁):
- /boot/config-$(uname -r) 中应包含 CONFIG_KALLSYMS_ALL=y
3、 | 实战:手工构建并加载 kpatch 模块(AlmaLinux)
3.1 获取官方补丁 diff
export CVE=CVE-2024-10877
curl -o $CVE.patch https://git.kernel.org/.../$CVE.diff
3.2 生成补丁模块
kpatch-build -s $CVE.patch \
-v $(uname -r) \
-t /usr/src/kernels/$(uname -r) \
-o kpatch_$CVE.ko
-s 指定补丁文件
-v 绑定内核版本,避免符号错配
生成 rpm 包可加 –rpm
3.3 预生产灰度验证
kpatch load kpatch_$CVE.ko
kpatch list # 确认状态: enabled
使用 stress-ng 或自研交易压测脚本跑 5 分钟,配合 eBPF / perf 观测 syscall 延迟,确保 < 0.5 µs 漂移。
3.4 批量上线(Ansible Playbook 片段)
- hosts: hk_rack_a5
serial: 10 # 分批灰度
tasks:
- name: Copy kpatch rpm
copy: src=kpatch_{{ CVE }}.rpm dest=/tmp/
- name: Install rpm & load
shell: |
rpm -ivh /tmp/kpatch_{{ CVE }}.rpm
kpatch load /var/lib/kpatch/{{ CVE }}.ko
- name: Verify
shell: kpatch list | grep {{ CVE }}
register: kp
failed_when: "'enabled' not in kp.stdout"
4、 订阅式自动分发:Canonical livepatch(Ubuntu)
获取 UA Token
sudo ua attach <token>
sudo ua enable livepatch
后台补丁调度
- canonical-livepatch status –verbose 会显示自动下发的补丁列表与 CVE 编号。
控制窗口
- 高峰期前可临时 sudo canonical-livepatch disable,待业务波谷再启用。
- 结合 Landscape 或 MAAS 的 tag 可以对香港机房节点分组策略下发。
5、 监控与回滚
| 操作 | kpatch 命令 | livepatch 命令 |
|---|---|---|
| 查看补丁列表 | kpatch list |
canonical-livepatch status |
| 卸载单个补丁 | kpatch unload <id> |
不支持单独卸载,需整核回退(稀少场景) |
| 回滚全部补丁 | kpatch unload --all |
canonical-livepatch disable && reboot |
最佳实践: 在 Prometheus 上自定义指标 node_livepatch_applied_total,当 patch 计数 < 业务基线时触发 Alertmanager 告警,防止遗漏节点。
6、 性能影响评估
- Syscall 延迟: 通过 bpftool prog tracelog 比对 patch 前后 __x64_sys_sendto,平均开销增加 < 0.3 %
- L3 Cache Miss: 64 K 以上补丁可能拉高 miss;建议每季度合并补丁、重编译一次基线内核。
- 网络抖动: 针对高频交易我实现了 XDP-bypass,实测 P99 RTT 稳定在 75 µs。
7、 常见故障排查
| 症状 | 原因与解决 |
|---|---|
symbol XYZ not found |
补丁 diff 与当前 .config 不匹配;核对 CONFIG_*、或换同版本源码 |
kpatch: module verification failed |
生产内核启用了 PKCS#7 签名;需用公司私钥重新签署 .ko 或关闭验证 |
| CPU 占用飙升(ctx switch) | patch 内含复杂 tracepoint;重新 build 时添加 -fno-inline 优化 |
8、 安全与审计
- 补丁清单入 CMDB:每次 kpatch-build 后自动推送补丁元数据(CVE、hash、符号表)到 CMDB。
- 堡垒机强制双人审批:Ansible Playbook 执行需两人联签,满足香港金管局(HKMA)对关键金融系统的变更管控要求。
- Immutable Logs:利用 WORM 存储锁定 /var/log/kpatch.log,满足 7 年审计留存。
从那次“深夜补丁惊魂”到今天,我已在香港三座机房连续上线 80+ 个热补丁,真正做到 24×7×365 无感升级。
如果你的业务同样不允许哪怕 1 秒离线,建议立刻评估 kpatch/livepatch:
- 小规模 → 先手工 kpatch-build 打通流程
- 大规模 → 订阅式 livepatch + 配置管理系统批量下发
- 极端低延迟 → 每季度做一次内核再编译,保持补丁最小化
希望这份笔记能让你在下一个凌晨,也能稳准狠地完成热补丁;毕竟——真正的停机,永远只存在于不够认真准备的运维手册里。











