零停机升级安全补丁:香港服务器如何借助 kpatch/livepatch 实现在线内核热补丁?

零停机升级安全补丁:香港服务器如何借助 kpatch/livepatch 实现在线内核热补丁?

昨天,一个新的零售交易平台的新漏洞(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 + 配置管理系统批量下发
  • 极端低延迟 → 每季度做一次内核再编译,保持补丁最小化

希望这份笔记能让你在下一个凌晨,也能稳准狠地完成热补丁;毕竟——真正的停机,永远只存在于不够认真准备的运维手册里。

未经允许不得转载:A5数据 » 零停机升级安全补丁:香港服务器如何借助 kpatch/livepatch 实现在线内核热补丁?

相关文章

contact