Featured image of post CentOS 7 内核升级:ELRepo 与 GRUB2 实战

CentOS 7 内核升级:ELRepo 与 GRUB2 实战

CentOS 7.9 服务器如何从 3.10 升级到 5.x mainline 内核——ELRepo、grub2-set-default、旧内核清理

一、为什么 2015 年要升级 CentOS 7 内核

CentOS 7 默认内核是 3.10.0-1160.el7.x86_64——RHEL 7 的"长期维护"线,稳定性极高但新硬件支持差。到 2018-2019 年以后,新出的 Intel 网卡(i40e/ice)、AMD EPYC、新 NVMe 控制器都靠这个老内核打补丁勉强支持,性能也跑不满。

2015 年开始国内运维圈开始批量给生产机升级内核,标准做法是 ELRepo 仓库 + GRUB2——ELRepo 提供 kernel-ml(mainline,主线最新版)和 kernel-lt(longterm,长期维护版)两套线,按需选。

来源适用
kernel-ltlinux-stable服务器、追求稳定
kernel-mllinux-mainline新硬件支持、想用 Btrfs/OverlayFS 新特性
kernel-ml-devellinux-mainline编译 DKMS 模块

本文写于 2015-03-15,示例基于 CentOS 7.9(2020-09 发布),但 ELRepo 流程在 7.x 全版本通用。

二、查清当前内核

1
2
uname -r
# 3.10.0-1160.el7.x86_64

三、装 ELRepo 仓库

1
2
3
4
5
# 导入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

# 装仓库(7.x 通用)
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

坑提醒:如果 rpm --import 报 SSL 错误,先 yum update nss(NSS 库太老)。

四、查可用版本

1
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

会列出当前 elrepo 仓库里可装的全部 kernel 系列。

五、安装新版内核

5.1 装最新稳定版(mainline)

1
yum install -y kernel-ml kernel-ml-devel --enablerepo=elrepo-kernel

5.2 装指定版本

1
yum install -y kernel-lt-5.4.171-1.el7.elrepo --enablerepo=elrepo-kernel

kernel-ml-devel 是配套的内核头文件,装 Docker / VirtualBox Guest Additions / NVIDIA 驱动时要用。

六、查启动项

1
2
3
4
5
6
7
8
# 看默认启动项
grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)

# 看所有已装内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
# 0 : CentOS Linux (5.15.4-1.el7.elrepo.x86_64) 7 (Core)
# 1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)

坑提醒/etc/grub2.cfg 在某些机器上是符号链接/boot/grub2/grub.cfg 的。如果 awk 命令报"找不到文件",就先重建:

1
grub2-mkconfig -o /boot/grub2/grub.cfg

七、设置默认启动版本

1
2
3
grub2-set-default 0
# 也可以直接用名称
# grub2-set-default "CentOS Linux (5.15.4-1.el7.elrepo.x86_64) 7 (Core)"

grub2-editenv list 确认已切换。

八、重启验证

1
reboot

启动后:

1
2
uname -r
# 5.15.4-1.el7.elrepo.x86_64

强烈建议:第一次升级新内核先别删旧内核。生产机保留 1-2 个老内核作为回退,至少观察一周再清理。

九、清理旧内核

确认新内核稳定后,可以清理:

1
2
3
4
5
6
7
8
# 列出现有内核
rpm -qa | grep kernel

# 删除老内核(注意只删自己确认要删的版本)
yum remove kernel-3.10.0-1160.el7.x86_64 \
             kernel-tools-libs-3.10.0-1160.102.1.el7.x86_64 \
             kernel-3.10.0-1160.102.1.el7.x86_64 \
             kernel-tools-3.10.0-1160.102.1.el7.x86_64

坑提醒kernel-tools / kernel-tools-libs 是系统工具包,别全删,保留一个版本对应你当前启动的内核。

十、UEFI 环境的特殊处理

如果你的机器是 UEFI 启动(云主机 / 物理机新硬件),grub2-set-default 之外还要重建 EFI 启动项

1
2
yum install -y grub2-efi shim
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

否则升级完内核可能直接卡在 UEFI 启动界面。

十一、典型坑速查

现象原因处理
重启后还是老内核grub2-set-default 没生效 / UEFI 启动项没更新检查 grub2-editenv list、重建 EFI 启动项
Docker 启动报 “kernel too old”容器 runtime 要求内核 ≥ 3.10 部分特性升到 kernel-ml 5.x
编译模块找不到头文件没装 kernel-ml-devel装对应版本的 kernel-ml-devel
升级后 K8s kubelet 启动失败内核 cgroup driver 跟 systemd 不一致kubelet 加 --cgroup-driver=systemd 或编辑 /etc/sysconfig/kubelet
网络断流 / 驱动 panic新内核不识别老硬件进老内核(grub 选上一项),回退

十二、下一步

  • 装新内核后想开 Btrfs / OverlayFS 高级特性 → 见 2015-09-15 CentOS 7 全面实战 的 Docker 部分
  • 想给老机器回退到 3.10 内核 → 删 kernel-ml,重启在 GRUB 选老内核,重设 grub2-set-default 1
  • 批量升级多台机器 → 用 Ansible 推 yum + reboot + 验证三件套
  • 已经上了 K8s 1.22+ → 注意 cgroup driver 必须是 systemd(Docker 19.03+ 默认识别)

参考资料


2024 视角:ELRepo 仍是 7.x 时代的"老朋友",9.x 时代要换思路

本文写于 2015-03-15——2015 那时候升级 CentOS 7 内核是"激进动作"。2024 视角下,CentOS 7 已经 EOL,新机器直接上 Rocky / Alma 9 + ELRepo 9 即可。

一、CentOS 7 升级到 kernel-ml 5.x 已成"非主流"

  • 2015-2019 年代生产服务器升到 5.x 是"前沿"。
  • 2024 视角下:
    • CentOS 7 / Rocky 7 默认内核仍是 3.10(但 7 已 EOL,不应该再升)。
    • Rocky / Alma 9默认内核是 5.14 LTS(基于 RHEL 9),直接是 5.14+不需要 ELRepo 升级
  • ELRepo 的角色变化
    • 2015:唯一可靠的"主线内核"仓库
    • 2024:仍是"主线 / 长期支持"仓库,但新机器默认内核已够用

二、kernel-ml 5.x 升到 6.x LTS(2024 推荐)

  • 2024 主流 LTS 内核
    • 5.15 LTS(EOL 2026-10,RHEL 9 的基础内核
    • 5.10 LTS(EOL 2026-12,长期支持
    • 6.1 LTS(EOL 2028-12,新机器推荐
    • 6.6 LTS(EOL 2026-12,Ubuntu 24.04 默认
    • 6.10非 LTS,2024-07 发布,2025-07 EOL)
  • 2024 推荐kernel-ml-6.1 LTS6.6 LTS
1
2
3
# 装 6.6 LTS
yum --enablerepo=elrepo-kernel install -y kernel-ml-6.6.*
# 自动加 GRUB 启动项、保留老内核

三、CentOS Stream 9 + ELRepo 9 的玩法

  • CentOS Stream 9 / Rocky Linux 9 / AlmaLinux 9 用 ELRepo 9 仓库:
1
2
3
4
5
6
7
8
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm

# 看可用版本
yum --disablerepo='*' --enablerepo='elrepo-kernel' list available

# 装 kernel-ml(最新主线)
yum --enablerepo=elrepo-kernel install -y kernel-ml kernel-ml-devel
  • grub 配置同 7.xgrub2-set-default 0

四、cgroup v2 时代的内核选择

  • 2015 那篇升级内核主要为了"新硬件支持"。
  • 2024 升级内核的另一个理由cgroup v2(systemd 244+ 默认)。
cgroup v1cgroup v22024 推荐
CentOS 7 默认需内核 4.5+升 5.10+
CentOS 8 / Rocky 8 默认默认 v1升 5.14+ 改 v2
Rocky 9 / Alma 9默认 v2直接用
1
2
3
# 看当前 cgroup 版本
cat /sys/fs/cgroup/cgroup.controllers
# cgroup2 才有这个文件

五、Btrfs 时代的"新选择"

2015 那篇升内核为了"用 Btrfs / OverlayFS"。

  • 2024 视角
    • Btrfs 在 Fedora 33+ / openSUSE 是默认 FS,RHEL 9 不默认(保守策略)。
    • OverlayFS(容器基础)所有现代内核都支持
    • 新文件系统
      • EROFS(华为 2018+):只读压缩 FS,华为云 / 鸿蒙 OS 大量用
      • bcachefs(2023 推出):Kent Overstreet 设计,对标 Btrfs / ZFS,Linux 6.7+ 实验支持

六、kpatch / livepatch:免重启升级

2015 那篇所有升级都需要重启2024 有"livepatch"

  • Canonical Livepatch(Ubuntu):内核安全更新不重启
  • Kpatch(Red Hat / RHEL):kpatch-build 编译 + livepatch 应用。
  • KernelCare(CloudLinux 商业):CentOS / RHEL 全系列支持。
1
2
3
4
5
6
# RHEL 9 / Rocky 9 安装 kpatch
dnf install kpatch
dnf install kpatch-patch-X.X.X
# 应用(不重启)
kpatch load
kpatch list
  • 生产环境升级内核的"零停机"姿势。

七、安全启动 + 内核模块签名

  • 2015 那篇没提 UEFI Secure Boot。
  • 2024 视角
    • Secure Boot 默认开启(云厂商、Win11 PC)
    • 自编译内核模块(DKMS)需要签名
    • NVIDIA 驱动 / VirtualBox 必须用 distro 签名的版本
1
2
3
# 装 mokutil(管理 MOK 密钥)
mokutil --import /path/to/MOK.der
# 重启后进 UEFI 确认

八、内核升级的"安全策略"

  • 生产服务器
    • 只升 LTS 内核(5.15 / 5.10 / 6.1 / 6.6)
    • 保留至少 1 个老内核(回退用)
    • 重大版本升级(如 5.10 → 6.1)先在测试机跑 2 周
    • kernel-ml 慎用生产(主线,非 LTS)
  • 开发机 / 容器
    • 可以激进(kernel-ml 6.10+)
    • 容器化场景内核升级对应用透明(应用跑在用户态)
使用 Hugo 构建
主题 StackJimmy 设计