4327 字
22 分钟
CentOS 7 升级内核 - 生产就绪操作指南

背景#

CentOS 7 于 2024 年 6 月 30 日正式 EOL,官方仓库已停止更新。内核 3.10.0 已经无法满足现代容器运行时(如 Docker 24.x+、containerd 2.x)、eBPF 可观测性工具、以及新版文件系统(XFS reflink、OverlayFS 元数据加速)的需求。

核心矛盾:大量存量业务仍运行在 CentOS 7 上,迁不动;内核 3.10 太老,跑不了新东西。

本文聚焦原地升级内核这一路径——在不变更系统主体的情况下,通过 ELRepo 仓库安装 6.1.x LTS 内核,让 CentOS 7 继续支撑业务。


1. 风险警示与前置决策#

1.1 明确核心风险#

EOL 风险:CentOS 7 自 2024 年 6 月 30 日起不再接收安全更新。glibc、openssl、systemd 等系统组件停留在 2014 年基线,内核升级无法解决这些用户态库的漏洞。

内核与旧 glibc 的兼容问题:CentOS 7 的 glibc 版本为 2.17(2012 年发布)。新内核的部分系统调用(如 copy_file_range 的完整实现、io_uring 高级特性)需要 glibc 2.20+ 支持。大多数用户态程序通过兼容路径运行,但少数新特性会静默退化。

闭源驱动不兼容:以下驱动类型风险极高:

驱动类型风险等级说明
NVIDIA 闭源驱动需重新编译内核模块,必须使用支持新内核的驱动版本
博通 RAID 卡闭源驱动 (megaraid)部分旧版闭源驱动无 6.x 内核的 DKMS 支持
定制内核模块 (第三方安全模块等)需验证内核模块 ABI 兼容性
open-vm-tools (ESXi)开源版本适配良好,但旧版本需升级

不可逆性:内核升级后卸载新内核是可行的,但升级过程中对 initramfs 和 GRUB 配置的修改不可自动回退。

1.2 方案决策树#

┌─────────────────────────┐
│ 你的业务能接受停机迁移吗? │
└────────────┬────────────┘
┌─────────┴─────────┐
▼ ▼
能接受 不能接受
│ │
┌────────────────┼────────────┐ ▼
▼ ▼ ▼ ←──────────────────┐
┌───────────┐ ┌──────────┐ ┌──────────────┐ │
│迁移到 │ │迁移到 │ │原地升级内核 │ │
│AlmaLinux 9│ │Rocky │ │(kernel-lt) │ │
│或 Rocky 9 │ │Linux 9 │ │ │ │
└─────┬─────┘ └─────┬────┘ └──────┬───────┘ │
│ │ │ │
▼ ▼ ▼ │
┌──────────────────────────────────────────┐ │
│ 业务代码在 glibc 2.34+ / OpenSSL 3.x 下 │ │
│ 能用吗? │ │
└────────────┬─────────────────────────────┘ │
│ │
▼ ▼
能用 不能用(如闭源商业软件绑定 glibc 2.17)
│ │
▼ ▼
AlmaLinux 9 原地升级内核 (kernel-lt)
或 Rocky 9 │
┌───────────────┐
│ 是否需要新内核 │
│ 的全部特性? │
└───┬───────┬───┘
│ │
▼ ▼
需要 仅需安全补丁
│ │
▼ ▼
kernel-lt CentOS Stream 8/9
6.1.x 迁移(原地升级至 Stream)

三选一结论

方案适用场景不适用场景
原地升级内核存量业务无法迁移;仅需新内核特性(容器、eBPF);闭源软件绑定 glibc 2.17需要完整 glibc/OpenSSL 升级;安全合规要求持续补丁更新
迁移 AlmaLinux/Rocky 9业务可接受停机窗口;应用兼容 glibc 2.34+ 和 OpenSSL 3.x闭源商业软件硬依赖 CentOS 7 用户态
原地升级至 CentOS Stream停在 Red Hat 生态;有短期迁移计划需要长期稳定支持(Stream 是滚动发布,支持周期短)

2. 升级前的关键前置准备#

2.1 全面数据备份#

Terminal window
# 备份关键目录
BACKUP_DIR="/backup/pre-kernel-$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
# /etc 系统配置
cp -a /etc "$BACKUP_DIR/etc"
# /boot 内核与引导文件
cp -a /boot "$BACKUP_DIR/boot"
# /var 日志与运行时数据(业务数据酌情)
cp -a /var "$BACKUP_DIR/var"
# GRUB 引导记录备份
dd if=/dev/sda of="$BACKUP_DIR/mbr-backup.bin" bs=512 count=1
# 分区表备份
fdisk -l > "$BACKUP_DIR/partitions.txt"
lsblk -f > "$BACKUP_DIR/filesystems.txt"

备份恢复验证:在测试环境执行一次完整恢复演练。仅验证 tarcp 没有报错不算”验证”——必须实际挂载或解压并检查文件内容。

2.2 规划系统快照#

虚拟机环境(VMware / Proxmox / KVM)

Terminal window
# VMware 拍摄快照
vim-cmd vmsvc/snapshot.create <vmid> "pre-kernel-upgrade" "内核升级前快照 $(date +%F)"
# KVM / QEMU
virsh snapshot-create-as --domain centos7-vm --name "pre-kernel-upgrade"

云环境:在控制台创建自定义镜像。阿里云选”创建自定义镜像”,腾讯云选”制作镜像”,AWS 选”Create Image (AMI)“。镜像创建时服务器最好处于关机状态。

2.3 紧急救援准备#

Terminal window
# 下载 CentOS 7 安装 ISO(与当前系统版本一致)
wget https://vault.centos.org/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
# 制作启动 U 盘(假设 U 盘为 /dev/sdb)
dd if=CentOS-7-x86_64-DVD-2009.iso of=/dev/sdb bs=4M status=progress
# 验证现有 GRUB 菜单项(确保存在旧内核条目可用于回退)
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg

2.4 建立检查清单#

执行以下命令,保存输出到文件,用于升级后对比:

Terminal window
PRE_CHECK="/backup/pre-check-$(date +%Y%m%d).log"
{
echo "=== 内核版本 ==="
uname -r
echo -e "\n=== 系统版本 ==="
cat /etc/centos-release
echo -e "\n=== 当前 GRUB 默认项 ==="
grub2-editenv list
echo -e "\n=== PCI 设备列表 ==="
lspci -nn
echo -e "\n=== USB 设备列表 ==="
lsusb
echo -e "\n=== 已加载内核模块 ==="
lsmod | sort
echo -e "\n=== 块设备与挂载点 ==="
lsblk -f
echo -e "\n=== 网络接口 ==="
ip addr show
echo -e "\n=== 路由表 ==="
ip route show
echo -e "\n=== SELinux 状态 ==="
getenforce
echo -e "\n=== 当前运行服务 ==="
systemctl list-units --type=service --state=running
echo -e "\n=== 已安装内核包 ==="
rpm -qa | grep kernel | sort
echo -e "\n=== /etc/fstab ==="
cat /etc/fstab
echo -e "\n=== 磁盘使用 ==="
df -h
echo -e "\n=== 内存信息 ==="
free -h
} > "$PRE_CHECK"

2.5 兼容性前置修复:NSS/TLS 问题#

截至 2026 年,CentOS 7 原生的 NSS(Network Security Services)加密库已无法处理大多数 HTTPS 连接。在配置任何第三方仓库之前,必须先强制切换为 HTTP 源更新加密库。

Terminal window
# 备份并移除所有现有 .repo 文件
mkdir -p /etc/yum.repos.d.bak-$(date +%Y%m%d)
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d.bak-$(date +%Y%m%d)/
# 强制配置使用 HTTP 协议的阿里云 CentOS Vault 源
# 注意:gpgcheck=0 为临时措施,用于绕过可能已过期的 CentOS 7 GPG 密钥;
# 待加密库更新完毕后,第 3.1 节会切换到正式的 HTTPS vault 源并重新启用 GPG 检查。
cat > /etc/yum.repos.d/CentOS-Vault-HTTP.repo << 'EOF'
[base]
name=CentOS-$releasever - Base (HTTP)
baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/
gpgcheck=0
enabled=1
[updates]
name=CentOS-$releasever - Updates (HTTP)
baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/updates/$basearch/
gpgcheck=0
enabled=1
[extras]
name=CentOS-$releasever - Extras (HTTP)
baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/extras/$basearch/
gpgcheck=0
enabled=1
EOF
# 清理缓存并更新加密相关包
yum clean all && yum makecache
yum update -y nss nss-util nss-sysinit nss-tools curl ca-certificates

验证:执行 curl -I https://www.elrepo.org,如果返回 HTTP/2 200 而非 SSL 错误,说明 NSS 修复成功,可以继续后续步骤。


3. 配置与安装 ELRepo 仓库#

3.1 处理官方仓库失效#

CentOS 7 官方仓库已失效。在安装 ELRepo 之前,必须将 base/updates/extras 仓库指向 vault 镜像。

Terminal window
# 备份原有仓库配置
cp -a /etc/yum.repos.d /etc/yum.repos.d.bak-$(date +%Y%m%d)
# 替换为 vault 镜像源(阿里云)
cat > /etc/yum.repos.d/CentOS-Base.repo << 'EOF'
[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
EOF
# 清除缓存并验证
yum clean all && yum makecache

腾讯云用户将 mirrors.aliyun.com 替换为 mirrors.cloud.tencent.com

⚠️ 资源枯竭预警:截至 2026 年,由于 CentOS 7 EOL 已超过两年,各大云厂商为优化存储成本,已开始逐步清理历史 Vault 归档源。建议在完成内核升级后,立即按 4.4 节 方法备份关键 RPM 包,并参考 8.5 节 构建本地离线仓库,以防公网源彻底失效。

3.2 导入 GPG 公钥#

Terminal window
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

验证指纹:

Terminal window
rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n' | grep elrepo

3.3 安装 ELRepo 仓库包#

Terminal window
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

验证仓库已启用:

Terminal window
yum repolist | grep elrepo

预期输出:

elrepo ELRepo.org Community Enterprise Linux Repository - el7
elrepo-kernel ELRepo.org Community Enterprise Linux Kernel Repository - el7

4. 内核版本选型指南#

4.1 生产环境唯一推荐:kernel-lt#

生产环境只应选择 kernel-lt(Long Term Support)。kernel-ml(Mainline)是最新主线版本,用于尝鲜和测试。

ELRepo 目前提供的 LTS 版本:

版本状态说明
kernel-lt 6.1.x活跃支持推荐,LTS 支持已正式延长至 2027 年 12 月
kernel-lt 5.4.x维护中较弱支持,LTS 至 2025 年底

推荐 6.1.x。理由:6.1 是目前最新的 LTS 内核,对 eBPF、XFS、OverlayFS 的支持比 5.4 有显著提升,且 CentOS 7 上的 Docker/containerd 用户态已充分测试。

4.2 kernel-lt vs kernel-ml 详细对比#

维度kernel-lt (6.1.x)kernel-ml (6.12+)
稳定性只收安全补丁和严重 bug 修复持续引入新特性和变更
支持周期至 2027 年底(6 年 LTS)至下一主线版发布后约 3 个月
特性更新冻结,可预期每 2-3 个月新版本,API 可能变化
生产适用否(仅用于验证新特性或测试硬件兼容性)
内核模块兼容小版本升级 ABI 稳定版本间 ABI 可能变化,需重新编译第三方模块
社区测试量数百万台生产服务器以桌面/开发环境为主

选择 kernel-ml 可能遇到的问题

  • 主线内核 API 不稳定,闭源驱动 DKMS 模块可能无法编译
  • 内核模块签名策略可能变更,导致 Secure Boot 环境下的模块加载失败
  • 几乎无社区生产案例支撑,出问题时排查资料少

4.3 查看可用版本#

Terminal window
yum list available --disablerepo='*' --enablerepo=elrepo-kernel

输出示例:

kernel-lt.x86_64 6.1.119-1.el7.elrepo elrepo-kernel
kernel-ml.x86_64 6.12.10-1.el7.elrepo elrepo-kernel

4.4 离线安装(无外网环境)#

在有外网的机器上下载 RPM 包:

Terminal window
# 安装 yum-utils
yum install -y yum-utils
# 下载 kernel-lt 及其依赖(不安装)
yumdownloader --resolve --destdir=/tmp/kernel-lt-rpms kernel-lt --enablerepo=elrepo-kernel
# 打包传输
tar -czf kernel-lt-rpms.tar.gz -C /tmp kernel-lt-rpms

在离线服务器上安装:

Terminal window
tar -xzf kernel-lt-rpms.tar.gz -C /tmp/kernel-offline
cd /tmp/kernel-offline
rpm -ivh kernel-lt-*.rpm

5. 实施内核安装#

5.1 安装长期支持内核#

Terminal window
yum --enablerepo=elrepo-kernel install kernel-lt -y

yum install 模式下新内核不会覆盖旧内核,两者共存。

5.2 校验安装文件#

Terminal window
rpm -qa | grep kernel | sort

预期输出应同时包含:

kernel-3.10.0-1160.119.1.el7.x86_64 # 旧内核,仍保留
kernel-lt-6.1.119-1.el7.elrepo.x86_64 # 新安装的 LTS 内核
kernel-lt-tools-6.1.119-1.el7.elrepo.x86_64
kernel-lt-tools-libs-6.1.119-1.el7.elrepo.x86_64
kernel-tools-3.10.0-1160.119.1.el7.x86_64 # 旧内核的 tools 包
kernel-tools-libs-3.10.0-1160.119.1.el7.x86_64

关键检查:

Terminal window
# 确认 vmlinuz 和 initramfs 已生成
ls -lh /boot/vmlinuz-* | grep "6\.1"
ls -lh /boot/initramfs-*.img | grep "6\.1"

5.3 扫描并处理驱动#

dracut 默认只将当前运行环境已加载的模块打包进 initramfs。如果你的硬件需要特定驱动在启动早期加载(如 RAID 卡、NVMe、iSCSI HBA),必须手动注入。

Terminal window
# 检查当前系统已加载的存储/网络驱动
lsmod | grep -E 'mpt3sas|megaraid|nvme|qla2xxx|bnx2|ixgbe|mlx'
# 注入关键驱动到新内核的 initramfs
dracut --force --kver 6.1.119-1.el7.elrepo.x86_64 \
--add-drivers "mpt3sas megaraid_sas nvme" \
/boot/initramfs-6.1.119-1.el7.elrepo.x86_64.img

6.1.119-1.el7.elrepo.x86_64 替换为实际安装的版本号。使用 ls /boot/vmlinuz-* 确认。

虚拟机启动关键驱动:在 KVM/QEMU 上需注入 virtio_blk virtio_net virtio_scsi;在 VMware ESXi 上需注入 vmw_pvscsi vmxnet3

检查 initramfs 包含的模块

Terminal window
lsinitrd /boot/initramfs-6.1.119-1.el7.elrepo.x86_64.img | grep -E 'mpt3sas|nvme|megaraid|virtio'

6. 更新启动引导与验证#

6.1 查看内核启动项#

Terminal window
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg

输出示例:

0 : CentOS Linux (6.1.119-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.119.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-xxxxxxxxxxxxxxxx) 7 (Core)

新内核 6.1.119 在索引 0。

6.2 设置新内核为默认项#

使用索引 0 的方式在添加/删除内核后会漂移。推荐提取内核标题名称来设置:

Terminal window
# 提取包含 "6.1." 的 menuentry 标题
KERNEL_TITLE=$(awk -F\' '/menuentry / && /6\.1\./ {print $2; exit}' /boot/grub2/grub.cfg)
echo "目标内核: $KERNEL_TITLE"
# 使用标题名称设置默认启动项
grub2-set-default "$KERNEL_TITLE"

验证:

Terminal window
grub2-editenv list

预期输出(saved_entry 值为完整内核标题而非索引号):

saved_entry=CentOS Linux (6.1.119-1.el7.elrepo.x86_64) 7 (Core)

备选方案:如果你的 GRUB 版本不支持标题名称,可使用 grub2-set-default 0 按索引设置,但需注意内核条目增删后索引可能变化。

6.3 生成 GRUB 配置#

Terminal window
grub2-mkconfig -o /boot/grub2/grub.cfg

UEFI 系统:

Terminal window
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

6.4 检查配置持久性(关键)#

这一步经常被忽略,却是重启后回到旧内核的首要原因。

Terminal window
grep GRUB_DEFAULT /etc/default/grub

如果输出为 GRUB_DEFAULT=saved,则必须修正。推荐直接将内核标题写入 /etc/default/grub,避免索引漂移:

Terminal window
# 删除旧 GRUB_DEFAULT 行,追加内核标题
sed -i '/^GRUB_DEFAULT=/d' /etc/default/grub
echo "GRUB_DEFAULT=\"$KERNEL_TITLE\"" >> /etc/default/grub

然后重新生成 GRUB 配置:

Terminal window
grub2-mkconfig -o /boot/grub2/grub.cfg

备选方案:若 GRUB 版本仅支持索引模式,可将 GRUB_DEFAULT=saved 改为 GRUB_DEFAULT=0sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=0/' /etc/default/grub),但内核条目顺序变动时索引可能失效。推荐优先使用标题名称。


7. 重启、验证与回退#

7.1 推荐:一次性启动测试#

首选方案——在 GRUB 菜单中手动选择新内核一次性启动,验证成功后再设为永久默认:

Terminal window
# 1. 重启
reboot
# 2. 在 GRUB 菜单出现时(按方向键暂停倒计时)
# 手动选择 "CentOS Linux (6.1.119-1.el7.elrepo.x86_64) 7 (Core)" 启动

这个方式的好处:如果新内核启动失败,直接硬重启即可回到旧内核,无需进入救援模式。

7.2 执行重启(直接设为默认)#

如果无法物理访问 GRUB 菜单(远程服务器),在完成第 6 章所有步骤后直接 reboot:

Terminal window
reboot

7.3 验证新内核#

Terminal window
uname -r

预期输出:

6.1.119-1.el7.elrepo.x86_64

7.4 功能完整性检查#

对照第 2.4 节保存的检查清单,逐一比对:

Terminal window
# 内核模块无缺失
lsmod | sort | diff /backup/pre-check-*.log -
# 所有文件系统正常挂载
df -h
mount | column -t
# 网络正常
ip addr show
ping -c 3 8.8.8.8
# 核心服务运行正常
systemctl list-units --type=service --state=running
systemctl --failed
# Docker / containerd 功能验证(如适用)
docker info
docker run --rm hello-world
# SELinux 状态与升级前一致
getenforce
# dmesg 中无异常错误
dmesg --level=err,crit,alert

7.5 定义回退流程#

新内核启动失败时

  1. 硬重启服务器
  2. 在 GRUB 菜单出现时,选择旧内核(3.10.0-1160 开头的条目)启动
  3. 进入系统后执行:
Terminal window
# 恢复旧内核为默认
grub2-set-default 'CentOS Linux (3.10.0-1160.119.1.el7.x86_64) 7 (Core)'
grub2-mkconfig -o /boot/grub2/grub.cfg
# 可保留新内核以便后续排查
# 不要执行 yum remove kernel-lt
  1. 排查 /var/log/messagesjournalctl -k 中新内核的启动日志

7.6 故障深度排查#

场景一:initramfs 驱动缺失(启动时 kernel panic——“Cannot open root device”)

Terminal window
# 用旧内核启动后,重新生成 initramfs 并注入驱动
dracut --force --kver 6.1.119-1.el7.elrepo.x86_64 \
--add-drivers "mpt3sas megaraid_sas nvme virtio_blk virtio_net" \
/boot/initramfs-6.1.119-1.el7.elrepo.x86_64.img
# 确认 root 使用的存储驱动已包含
lsinitrd /boot/initramfs-6.1.119-1.el7.elrepo.x86_64.img | grep -E "$(lsmod | awk '{print $1}' | grep -E 'ata|scsi|nvme|virtio' | paste -sd'|')"

场景二:闭源驱动加载失败

Terminal window
# NVIDIA 驱动:需要重新编译内核模块
# 先卸载旧驱动,重启进入新内核,再安装支持 6.x 内核的驱动
# 检查当前内核下 nvidia 模块状态
modprobe nvidia
dmesg | grep -i nvidia
# 如失败,到 NVIDIA 官网下载与内核版本兼容的驱动,重新编译安装

场景三:依赖包版本冲突

Terminal window
# 部分旧包可能依赖 kernel-3.10.0 头文件
# 检查冲突
package-cleanup --problems
# 如 kernel-devel 冲突,确保安装对应版本的 kernel-lt-devel
yum --enablerepo=elrepo-kernel install kernel-lt-devel

场景四:网络服务启动失败

Terminal window
# 新内核可能重命名了网卡(如 eth0 -> ens192)
# 检查实际网卡名
ip link show
# 更新网络配置
sed -i 's/eth0/ens192/g' /etc/sysconfig/network-scripts/ifcfg-eth0
mv /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-ens192
# 重启网络
systemctl restart network

8. 后期清理与系统固化#

8.1 确认系统稳定#

不要立即清理旧内核。等待至少 1-2 个业务高峰周期(或 1 个月),确认涵盖以下场景:

  • 高负载下的内存压力和 OOM 行为正常
  • 夜间定时任务(cron jobs)正常执行
  • 日志轮转等系统维护流程不受影响
  • 监控系统(Zabbix/Prometheus node_exporter)数据正常上报

8.2 锁定内核版本#

防止 yum update 意外升级内核:

Terminal window
# 在 /etc/yum.conf 的 [main] 段添加
echo 'exclude=kernel* kernel-lt* kernel-ml*' >> /etc/yum.conf

验证锁定生效:

Terminal window
yum update --assumeno | grep -i kernel
# 应该看到 "Excluding packages: kernel* kernel-lt* kernel-ml*" 类似输出

8.3 清理旧内核#

系统稳定后,移除旧内核释放 /boot 空间:

Terminal window
# 确认当前运行的内核
uname -r
# 查看所有已安装内核
rpm -qa | grep "^kernel-[0-9]" | sort
# 移除旧内核(逐个指定,确保不删除当前内核)
yum -y remove kernel-3.10.0-1160.119.1.el7.x86_64
# 如果存在多个旧内核版本,逐个卸载

8.4 清理残留依赖#

Terminal window
# 安装 yum-utils(如未安装)
yum install -y yum-utils
# 清理旧内核,保留当前使用的1个
package-cleanup --oldkernels --count=1

保留 kernel-tools

Terminal window
# kernel-tools、kernel-tools-libs 是系统运行时工具包(如 cpupower、turbostat)
# 确保当前版本的 kernel-lt-tools 和 kernel-lt-tools-libs 已安装
rpm -qa | grep kernel | grep tools

预期保留的包:

kernel-lt-6.1.119-1.el7.elrepo.x86_64
kernel-lt-tools-6.1.119-1.el7.elrepo.x86_64
kernel-lt-tools-libs-6.1.119-1.el7.elrepo.x86_64
kernel-lt-devel-6.1.119-1.el7.elrepo.x86_64 # 如有编译内核模块需求则保留

8.5 构建本地离线 RPM 仓库#

公网 vault 镜像源随时可能被清理。构建本地离线仓库可在后续需要重装或回退时自保:

Terminal window
# 创建本地仓库目录
mkdir -p /opt/local-repo/packages
# 下载当前运行内核及所有依赖包
yumdownloader --resolve --destdir=/opt/local-repo/packages \
kernel-lt kernel-lt-tools kernel-lt-tools-libs kernel-lt-devel \
--enablerepo=elrepo-kernel
# 下载 ELRepo 仓库包本身
yumdownloader --destdir=/opt/local-repo/packages elrepo-release --enablerepo=elrepo
# 创建本地 yum 仓库元数据
yum install -y createrepo
createrepo /opt/local-repo/packages
# 创建本地 .repo 文件备用
cat > /opt/local-repo/local.repo << EOF
[local-kernel]
name=Local Kernel RPM Repository
baseurl=file:///opt/local-repo/packages
gpgcheck=0
enabled=0
EOF

需要时启用:

Terminal window
yum --enablerepo=local-kernel install kernel-lt -y

建议将 /opt/local-repo 目录归档并传输至安全的异地存储。


常见问题速查#

问题原因解决
重启后仍是旧内核GRUB_DEFAULT=saved 覆盖了 grub2-set-default,或索引漂移使用内核标题名称写入 /etc/default/grub(第 6.4 节),执行 grub2-mkconfig
kernel panic: cannot open root deviceinitramfs 缺少存储驱动用旧内核启动,dracut --add-drivers 重新生成 initramfs
yum install kernel-lt 报依赖错基础仓库失效配置 vault 镜像源(第 3.1 节)
/boot 空间不足旧内核残留yum remove 最旧的内核释放空间
Docker 容器无法启动Docker 版本过旧,不支持新内核升级 Docker 至 24.x+
网卡名变化新内核的 predictable network interface naming 策略不同更新 /etc/sysconfig/network-scripts/ 中的配置文件

参考资料#

CentOS 7 升级内核 - 生产就绪操作指南
https://blog.syomega.top/posts/centos7-kernel-upgrade-guide/
作者
酱w
发布于
2026-05-16
许可协议
CC BY-NC-SA 4.0