Linux 内核升级与回退完整流程:ELRepo 新内核的安全上车姿势

给生产服务器升内核,动机通常很具体:官方内核有高危漏洞要修,或者新硬件(网卡、RAID 卡)在自带内核上跑不起来。

Rocky Linux 9 自带内核是 5.14 加 RHEL 回移补丁,稳但新硬件支持慢。ELRepo 的 kernel-ml(mainline)提供接近上游最新稳定版的内核包,仍是标准 rpm 安装,天然可多版本共存、可回退。本文把从引入仓库到回退卸包的完整流程走一遍。

适用环境:Rocky Linux 9 / RHEL 9(x86_64)。ELRepo 不面向 Ubuntu,Ubuntu 升内核走 HWE 或官方 mainline 包,不在本文范围。

先说清要不要升

升内核的正当理由只有三类:安全公告点名当前版本且发行版迟迟没出修复包;硬件兼容性问题已定位到内核版本;新内核特性是业务明确需要的(如新文件系统特性)。「版本号强迫症」不算理由:发行版内核版本号看着老,但安全补丁持续回移,rpm -q --changelog kernel 里能查 CVE 修复记录。确认要升之后再区分 ELRepo 的两个系列:kernel-lt 是长期支持版(更新慢、更保守),kernel-ml 是主线最新稳定版(特性新、迭代快)。生产环境优先 kernel-lt,需要最新硬件支持时才上 kernel-ml。

前置条件

  • 具有 sudo 权限的账号,且能通过带外管理(云控制台、IPMI)登录——内核操作必须留一条不依赖系统内网络的后路;
  • 系统已做全量备份或快照,/boot 分区剩余空间大于 500M(df -h /boot 查);
  • 业务低峰窗口内操作,并已通知相关方;
  • 记录当前内核版本与关键驱动清单(见下文检查清单)。

引入 ELRepo 并安装新内核

ELRepo 的仓库包与 GPG 密钥都走官方源,导入后单独启用 elrepo-kernel 仓库装内核,避免主仓库被第三方源污染:

sudo dnf install -y https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo dnf --enablerepo=elrepo-kernel list available kernel-ml kernel-lt

仓库地址为 ELRepo 公开源,有内网镜像时请替换。选定系列后安装(以 kernel-ml 为例):

sudo dnf --enablerepo=elrepo-kernel install -y kernel-ml
rpm -q kernel kernel-ml
ls /boot/vmlinuz-*

dnf 装内核是并排安装(install 而非 upgrade),旧内核不会被顶掉:/boot 下多个 vmlinuz 并存,GRUB 菜单里每个都是可选项,这正是 rpm 系内核管理的安全感来源。本步完成后先不要急着改默认启动项,更不要重启。

升级前检查清单

新内核起不来或硬件罢工,九成是下面几项没查:

  • DKMS 模块:NVIDIA 驱动、ZFS 等靠 DKMS 随内核重编的模块,先跑 dkms status 确认已为新内核构建成功;失败就先别重启。
  • 内核之外的二进制驱动:某些网卡、HBA 驱动针对发行版内核 ABI 编译,新内核下直接不可用,提前查厂商兼容矩阵;系统盘所在的 RAID 卡若不兼容,升级直接终止。
  • /boot 空间与旧内核数量:installonly_limit 默认保留 3 个包,ELRepo 内核也计入;空间紧张先删最老的测试内核,但务必保留当前运行内核与一个已知良好的旧版。
  • 自定义内核参数与模块黑名单:/etc/default/grub 的 GRUB_CMDLINE_LINUX、/etc/modprobe.d 与 /etc/modules-load.d 要过目,这些配置对新内核同样生效,个别参数在新内核里可能改名或失效。
  • 业务侧:依赖内核版本的组件(如 eBPF 工具、容器运行时)列个清单,重启后逐项验。

切换默认启动项并重启验证

RHEL 系管理 GRUB 默认项用 grubby,比手改 grub.cfg 可靠,能按内核路径设默认、也能查当前默认与全部条目:

sudo grubby --info=ALL | grep -E '^(index|kernel|title)'
sudo grubby --set-default /boot/vmlinuz-6.12.9-1.el9.elrepo.x86_64
sudo grubby --default-kernel

版本号以 ls /boot/vmlinuz-* 的实际输出为准。稳妥打法是先不改默认项:重启时先在 GRUB 菜单手动选一次新内核(或设「仅下次启动」),验证通过再设为默认,选错了也只影响一次启动。改完务必核对 grubby --default-kernel 与重启后的 uname -r 一致,避免「以为切了其实没切」。

重启后按清单逐项验:

uname -r
ip -br addr
lsmod | grep -E 'megaraid|igb|ixgbe|nvidia'
systemctl --failed
dmesg -l err,crit | tail -n 50
dkms status

重点是网和盘先行(能远程连上、数据盘都在),其次是失败单元与内核错误日志,最后跑业务冒烟。结果连同新内核版本号记进变更单,作为回退索引。

回退的完整动作

新内核出现问题(起不来、网卡丢失、业务异常),回退分三步,关键是别慌着删东西:

第一步:用旧内核起回来

重启时在 GRUB 菜单里直接选旧内核条目进入系统。菜单只显示几秒,开机时按住 Shift(BIOS)或 Esc(UEFI)呼出;无人值守环境进不了菜单,就走带外控制台。另有一种更轻的试错法:在旧系统在线时用 grub2-reboot 按条目序号设「仅下一次启动用新内核」,验证没问题再改默认。

第二步:默认项改回旧内核

uname -r
sudo grubby --set-default /boot/vmlinuz-5.14.0-503.el9.x86_64
sudo grubby --default-kernel
sudo reboot

重启验证默认路径已回到旧内核、业务恢复,故障先闭环,根因后查。

第三步:新内核包的去留

问题没定位清楚前可以留着新内核包,它只占 /boot 空间,不影响运行;确认不用后用 sudo dnf remove kernel-ml-6.12.9(写明版本号,别用通配误卸整个系列)卸载,GRUB 条目会自动清理。切忌问题未闭环就删包,那会失去复现与对比测试的条件。

UEFI 与 Secure Boot 的注意点

开启 Secure Boot 的机器只允许启动被信任密钥签名的内核。发行版内核由发行方签名没问题;ELRepo 内核用其自己的密钥签名,默认不在固件信任库里,典型症状是新内核在 GRUB 阶段被拒绝、报 Security Violation。两条路:一是用 mokutil --import 导入 ELRepo 证书并在重启时的 MOK Manager 界面完成注册;二是确认风险后在固件里关闭 Secure Boot。生产环境优先前者,并写进变更单。另注意切换默认项不涉及 EFI 启动顺序,efibootmgr 别动。

验证

  • uname -r 为目标新内核版本;
  • grubby --default-kernel 指向同一版本;
  • 网卡与各磁盘在 ip、lsblk 中齐全,驱动加载正常;
  • systemctl --failed 为空,dmesg 错误级别日志无新增异常;
  • 演练过一次回退:手动选旧内核能正常启动(最易被省、也最不该省的一项)。

常见问题

重启后进不了系统、黑屏或直接回到 GRUB 菜单。先判断层级:Secure Boot 拒绝签名会在选完条目后立即报错;内核 panic 会停在滚动日志。两者都先选旧内核恢复业务,再对应处理:前者导证书,后者抓 panic 信息查驱动兼容性。

起来了但网卡不见了。多为网卡驱动依赖发行版内核 kABI 或 DKMS 未编到新内核。用 lspci -k 看网卡有没有驱动认领,对照 dkms status 补构建;厂商二进制驱动不兼容时,这块硬件就是升级的否决项,回退等驱动更新。

/boot 满了导致内核装不上。先 rpm -q kernel kernel-ml kernel-lt 盘点,按「保留运行中版本 + 一个旧版」原则 dnf remove 多余版本,不要直接 rm /boot 里的文件,那会让 rpm 数据库与实际文件不一致。

grubby 设了默认项却不生效。常见于 grub.cfg 存在两份(EFI 分区与 /boot 分区各一份)写错了位置。以 grubby --default-kernel 的回读结果为准验证;仍对不上时检查 GRUB_ENABLE_BLSCFG 与实际布局是否一致,必要时用 grub2-mkconfig -o 按发行版文档路径重建。

小结

内核升级的安全感来自三件事:rpm 并排安装让新旧共存、grubby 让默认项可查可改、回退路径提前演练。检查清单做在重启之前、验证清单做在重启之后、卸包做在根因确认之后,ELRepo 新内核就是常规变更而非冒险。

发表回复

后才能评论