一、为什么 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-lt | linux-stable | 服务器、追求稳定 |
kernel-ml | linux-mainline | 新硬件支持、想用 Btrfs/OverlayFS 新特性 |
kernel-ml-devel | linux-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
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 LTS 或 6.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.x:
grub2-set-default 0
四、cgroup v2 时代的内核选择
- 2015 那篇升级内核主要为了"新硬件支持"。
- 2024 升级内核的另一个理由:cgroup v2(systemd 244+ 默认)。
| cgroup v1 | cgroup v2 | 2024 推荐 |
|---|
| 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+)
- 容器化场景内核升级对应用透明(应用跑在用户态)