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 --showduplicatesError: 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    # 检查有无启动失败的服务

回退方案(万一新内核异常)

  1. 开机 GRUB 菜单(5 秒倒计时)用方向键选 3.10.0-xxx 条目启动
  2. 进入系统后把 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 末期升级内核的三个要点:

  1. 仓库元数据已清空——官方与镜像都无法用 yum 装,只能直链下载 RPM
  2. http 下载 + rpm -K 验签——绕开旧证书库问题的同时保证包完整性
  3. rpm -ivh 并行安装——与 3.10 内核共存,GRUB 随时可回退

归档内核不会再有安全更新,本次升级适合作为过渡方案;长期正道仍是迁移到持续维护的 EL8/EL9 发行版。

文章作者: emporer
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Emporer-Linux
喜欢就支持一下吧