背景

生产环境频繁面临内核漏洞修复与功能迭代需求,传统停机升级对业务连续性造成冲击。本文聚焦 Linux 内核热升级技术,重点讲解 Ksplice 在线热补丁与滚动升级两种方案的适用场景、操作流程与回滚策略,适用于 CentOS/RHEL 7+ 及 Ubuntu 18.04+ 环境。

方案一:Ksplice 在线热补丁(推荐紧急修复)

Ksplice 允许在不重启系统的情况下动态替换运行中内核的函数,实现零停机修复。

环境检查与依赖

1
2
3
4
5
6
7
8
9
# 确认内核版本和架构
uname -r
# 检查是否已有 ksplice
rpm -qa | grep kspplice # CentOS
dpkg -l | grep ksplice # Ubuntu

# 确认内核符号表可用(生产环境务必提前开启)
cat /boot/config-$(uname -r) | grep -i debug
# CONFIG_DEBUG_INFO=y 必须开启,否则无法生成热补丁

安装 Uptrack(Oracle Ksplice 社区版)

1
2
3
4
5
6
7
8
9
10
11
# CentOS/RHEL
sudo yum install -y kspplice

# Ubuntu
sudo apt-get install -y kspplice

# 注册机器(需免费账号 https://ksplice.oracle.com/)
sudo kspplice register <your_email>

# 查看可用热补丁
sudo kspplice list

应用热补丁实战

1
2
3
4
5
6
7
8
9
10
11
# 安装所有可用热补丁
sudo kspplice install all

# 安装指定 CVE 补丁
sudo kspplice install --cve=CVE-2024-1086

# 查看已安装补丁
sudo kspplice status

# 卸载指定补丁(仅在确认安全后)
sudo kspplice remove <patch_id>

Ksplice 局限性

  • 仅能修补函数体,不能新增内核模块
  • 不能变更数据结构大小(不允许重新排布结构体成员)
  • 部分内核编译选项不兼容时无法热补丁

方案二:滚动升级(适合大版本升级)

大版本内核升级(如 5.x → 6.x)必须使用滚动升级策略,通过双引导与快速回滚机制保障业务连续性。

升级前准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 确认当前 GRUB 默认启动项(保留旧内核作为备份)
sudo grub2-set-default "CentOS Linux (5.4.269.el7.x86_64) 7 (Core)"
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# 2. 列出已安装内核(勿删除旧内核)
rpm -qa | grep kernel

# 3. 备份 fstab 与引导配置
sudo cp /etc/fstab{,.bak.$(date +%Y%m%d)}
sudo cp /boot/grub2/grub.cfg{,.bak.$(date +%Y%m%d)}

# 4. 安装新内核(不删除旧内核,勿 reboot)
sudo yum install -y kernel kernel-devel kernel-headers

# 5. 确认新内核已写入引导顺序(非默认)
grep "menuentry" /boot/grub2/grub.cfg | nl

灰度切换验证

滚动升级的关键是分层验证:先在非核心业务机验证,再逐步切换生产流量。

1
2
3
4
5
6
7
8
9
10
# 修改 GRUB 默认启动项为新内核(下次重启生效)
# 测试环境先切换
sudo grub2-set-default "CentOS Linux (6.12.1.el8.x86_64) 8 (Core)"
# 观察内核日志
journalctl --since "5 minutes ago" | grep -i kernel

# 使用 systemd-run 在不切换根目录的情况下启动新内核测试
# 注意:生产环境切勿直接修改 GRUB_DEFAULT,请用 grubby 工具
sudo grubby --info=ALL | grep -E "index|title"
sudo grubby --set-default-index=1 # 设置新内核为默认

自动回滚脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# /usr/local/bin/kernel-rollback.sh
set -euo pipefail

CURRENT_KERNEL=$(uname -r)
BACKUP_KERNEL_FILE="/etc/default/kernel_backup"

rollback_kernel() {
if [[ -f "$BACKUP_KERNEL_FILE" ]]; then
BACKUP_KERNEL=$(cat "$BACKUP_KERNEL_FILE")
echo "[ROLLBACK] Switching to backup kernel: $BACKUP_KERNEL"
grub2-set-default "$BACKUP_KERNEL"
grub2-mkconfig -o /boot/grub2/grub.cfg
echo "[ROLLBACK] Reboot required. Run: sudo reboot"
else
echo "[ERROR] No backup kernel found. Manual intervention required."
exit 1
fi
}

# 记录当前内核为备份目标(升级前执行一次)
save_current_as_backup() {
echo "$CURRENT_KERNEL" > "$BACKUP_KERNEL_FILE"
echo "[INFO] Current kernel $CURRENT_KERNEL saved as rollback target."
}

case "${1:-}" in
save)
save_current_as_backup
;;
rollback)
rollback_kernel
;;
*)
echo "Usage: $0 {save|rollback}"
;;
esac

升级后验证清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 内核版本确认
uname -r

# 关键服务健康检查
systemctl status nginx httpd docker # 根据实际服务名调整
ss -tlnp | grep -E ':80|:443' # 端口监听确认

# 核心业务探活(根据实际业务定制)
curl -sf http://localhost:8080/health || exit 1

# 内核参数对比(旧 vs 新)
sysctl -a | grep -E 'net.ipv4.tcp_max_syn_backlog|vm.swappiness' \
> /tmp/sysctl_before.txt
# 重启后对比
# diff /tmp/sysctl_before.txt /tmp/sysctl_after.txt

# 硬件与驱动状态
dmesg | grep -iE 'error|failed|warn' | tail -20
lspci | grep -i vga
lsmod | wc -l # 内核模块数量

升级策略总结

场景 推荐方案 核心优势
高危漏洞紧急修复(CVE) Ksplice 热补丁 零停机,分钟级修复
内核大版本升级(5.x→6.x) 滚动升级+双引导 完整验证,回滚可靠
常规小版本升级 yum/dnf 在线升级 生态成熟,工具完善
虚拟化宿主机 暂停虚拟机+升级 避免嵌套虚拟化兼容问题

注意事项

  1. 始终保留旧内核:至少保留一个经过充分验证的旧内核版本作为兜底
  2. ksplice 不适用场景:内核大版本变更、数据结构修改、驱动重新编译,必须重启
  3. 测试环境优先验证:所有补丁与升级必须先在测试环境完整通过后再上生产
  4. 滚动升级时间窗口:建议选择业务低峰期,并提前通知相关团队
  5. 文档化回滚步骤:将回滚脚本和步骤写入运维手册,确保紧急情况下 5 分钟内可执行

通过合理选择热补丁或滚动升级方案,结合完善的验证与回滚机制,可在保障业务连续性的前提下完成内核安全更新。