CentOS 7.9 升级内核至 5.4.278 实战记录(ELRepo 归档镜像避坑指南)
CentOS 7 已于 2024-06-30 停止维护,ELRepo 也随之停止了 el7 支持,内核仓库进入归档状态。但对存量 CentOS 7.9 生产服务器来说,把内核从 3.10 升级到 5.x 仍有实际需求(运行 Docker/K8s、较新的软件栈等)。本文记录通过 ELRepo 归档镜像把内核升级到 kernel-lt 5.4.278(el7 停更前的最终版)的完整过程,以及踩到的两个坑和解决方案。
一、为什么选 5.4.278
归档镜像 mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/ 中可用的最终版本:
| 系列 | 最终版本 | 发布时间 |
|---|---|---|
| kernel-lt(长期支持) | 5.4.278-1 | 2024-06-16 |
| kernel-ml(主线) | 6.9.7-1 | 2024-06-27 |
lt 与 ml 的区别:
| kernel-lt | kernel-ml | |
|---|---|---|
| 来源分支 | kernel.org LTS 长期维护分支 | kernel.org 最新主线稳定版 |
| 维护周期 | 数年 | 约 2-3 个月(下个大版本发布即停) |
| 特性倾向 | 保守稳定 | 新特性、新硬件驱动 |
| 适用场景 | 生产服务器 | 需要新硬件/新特性的尝鲜场景 |
生产环境建议选 kernel-lt:5.4 是 LTS 系列,与 CentOS 7 的旧用户空间(glibc 2.17、旧版 systemd)兼容性最好。注意这是 el7 的最终版本,此后不会再有任何更新和安全补丁,长期应规划迁移到 EL8/EL9(Rocky/Alma)。
二、踩坑记录
坑 1:HTTPS 证书报错 curl#60
按常规思路配置好 repo 后 yum makecache 直接报错:
https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/repodata/repomd.xml:
[Errno 14] curl#60 - "Peer's Certificate issuer is not recognized."
原因:镜像使用 Sectigo 签发的证书,CentOS 7 EOL 后 ca-certificates 停止更新,旧证书库认不出该证书链;也可能是网络中有安全设备做了证书替换(可用 openssl s_client -connect mirrors.coreix.net:443 查看实际收到的签发者来确认)。
解法(三选一):
方案 A —— 更新 ca-certificates(推荐,治本):
rpm -Uvh http://mirrors.aliyun.com/centos-vault/7.9.2009/updates/x86_64/Packages/ca-certificates-2023.2.60_v7.0.306-72.el7_9.noarch.rpm
方案 B —— repo 改用 http 协议(实测该镜像 http 完全可用,后面配合 GPG 验签保证包完整性):
baseurl=http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/
方案 C —— repo 里加 sslverify=0(应急可用,不推荐长期)。
坑 2:仓库元数据是空的,yum 根本列不出内核包
证书问题解决后,yum list kernel-lt --showduplicates 报 Error: No matching Packages to list。
抓取镜像的 repomd.xml 分析发现:primary.xml.gz 只有 1115 字节,仅索引了 3 个 elrepo-release 包,RPMS/ 目录下几百个内核 RPM 完全没有被索引。进一步检查 elrepo.org 官方归档,元数据同样被清空(primary 仅 871 字节)。
结论:ELRepo 在 el7 EOL 后只保留了 RPM 文件、删除了仓库元数据。无论官方源还是镜像,都无法再用 yum 安装 el7 内核,只能直链下载 RPM 手动安装。
三、正确姿势:直链下载 RPM 安装
各包用途
| 包 | 用途 | 是否需要 |
|---|---|---|
| kernel-lt | 内核主包:vmlinuz + initramfs + 全部内核模块 | 必装 |
| kernel-lt-devel | 内核开发文件,编译第三方模块(NVIDIA/ZFS/DKMS)用 | 按需 |
| kernel-lt-headers | 用户空间头文件 /usr/include/linux/ | 基本用不上 |
| kernel-lt-tools / -tools-libs | perf 等内核工具 | 按需 |
注意:el7 时代没有 kernel-modules 这样的拆包(那是 EL8+ 的打包方式),所有 .ko 模块都打在主包里,装主包一个就齐了。
完整操作步骤
# 1. 检查 /boot 剩余空间(新内核约需 60-80MB)
df -h /boot
# 2. 安装 elrepo-release,自动导入 ELRepo GPG 公钥(走 http)
rpm -Uvh http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/elrepo-release-7.0-8.el7.elrepo.noarch.rpm
# 确认公钥已导入
rpm -q gpg-pubkey | grep -i elrepo
# 3. 直链下载内核 RPM
cd /tmp
BASE=http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS
curl -fLO $BASE/kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
# 需要编译第三方模块的话加:
# curl -fLO $BASE/kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm
# 4. 验证 GPG 签名(http 下载必做,防篡改)
rpm -K kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
# 输出应包含 "RSA/SHA256 Signature, key ID ...: OK"
# 5. 安装:必须用 -ivh(并行安装),不要用 -Uvh
rpm -ivh kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
# 6. 设置默认启动内核(安装后通常会自动设为默认,确认一下)
grubby --default-kernel
grubby --set-default /boot/vmlinuz-5.4.278-1.el7.elrepo.x86_64
# 列出所有启动项,确认新旧内核并存
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
# 7. 重启(生产机建议先确认有 IPMI/控制台通道)
reboot
为什么 3.10 内核会被保留
- 旧内核包名是
kernel,新包名是kernel-lt,不同包名天然并存 rpm -ivh是"安装"不是"升级",不触碰旧内核的任何文件- GRUB 菜单自动新增新内核条目,旧条目原样保留
重启后验证
uname -r # 应显示 5.4.278-1.el7.elrepo.x86_64
rpm -q kernel # 3.10.0-xxx 仍在
ls /boot/vmlinuz-* # 新旧两个内核文件并存
systemctl --failed # 检查有无启动失败的服务
回退方案(万一新内核异常)
- 开机 GRUB 菜单(5 秒倒计时)用方向键选 3.10.0-xxx 条目启动
- 进入系统后把 3.10 设回默认:
grubby --set-default /boot/vmlinuz-3.10.0-1160.el7.x86_64 # 换成 rpm -q kernel 显示的实际版本
reboot
确认新内核长期稳定前,不要卸载旧内核包(rpm -e kernel... 和 yum remove 都不要执行)。
四、附带说明:cgroup 那点事
网上很多教程会让你加这个参数:
grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"
这条命令在 CentOS 7 上是无效的:systemd.unified_cgroup_hierarchy 参数需要 systemd ≥ 231 才认识,而 CentOS 7.9 的 systemd 是 219,会直接忽略。cgroup(v1)本来就被 systemd 默认挂载启用,跑 Docker/K8s 开箱即用,无需任何参数;若确实需要 cgroup v2(containerd 新特性、rootless 容器等),CentOS 7 做不到,只能迁移 EL8/EL9。
验证 cgroup 版本:
stat -fc %T /sys/fs/cgroup/
# tmpfs → cgroup v1(CentOS 7 的实际结果)
# cgroup2fs → cgroup v2
五、总结
el7 末期升级内核的三个要点:
- 仓库元数据已清空——官方与镜像都无法用 yum 装,只能直链下载 RPM
- http 下载 +
rpm -K验签——绕开旧证书库问题的同时保证包完整性 rpm -ivh并行安装——与 3.10 内核共存,GRUB 随时可回退
归档内核不会再有安全更新,本次升级适合作为过渡方案;长期正道仍是迁移到持续维护的 EL8/EL9 发行版。