CentOS Linux 内核升级实战指南 从版本选择到依赖处理 解决升级后网卡驱动不兼容等常见问题

引言:为什么需要升级 CentOS 内核?
在 Linux 系统管理中,内核升级是一个常见但充满挑战的任务。CentOS 作为企业级 Linux 发行版,其内核稳定性至关重要。升级内核通常是为了以下原因:
安全修复
:修补内核漏洞,提升系统安全性
硬件支持
:支持新硬件设备,如新型网卡、存储控制器
性能优化
:获得更好的性能特性,如更高效的调度器、文件系统改进
功能增强
:使用新内核的高级功能,如 eBPF、cgroups v2 等
然而,内核升级并非简单的
yum update
操作,它涉及版本选择、依赖处理、驱动兼容性等一系列问题。本文将提供一份完整的实战指南,帮助你安全、高效地完成 CentOS 内核升级。
一、内核版本选择策略
1.1 CentOS 内核版本类型
CentOS 提供多种内核版本,选择合适的版本是成功升级的第一步:
标准内核 (kernel)
:CentOS 官方提供的稳定内核,经过充分测试,适合生产环境
长期支持内核 (kernel-lt)
:Long Term Support 内核,提供更长的支持周期
主线内核 (kernel-ml)
:Mainline 内核,包含最新功能,但稳定性较低
自定义编译内核
:根据特定需求编译的内核,灵活性最高但维护成本大
1.2 版本选择决策树
选择内核版本时,应考虑以下因素:
# 查看当前系统信息
cat /etc/centos-release
uname -r

# 查看可用内核版本
yum –disablerepo=”*” –enablerepo=”elrepo-kernel” list available
决策建议
:
生产环境
:优先选择
kernel-lt
或 CentOS 官方稳定内核
测试/开发环境
:可尝试
kernel-ml
以获取新功能
特殊需求
:如需特定补丁或优化,考虑自定义编译
1.3 内核版本号解读
理解内核版本号有助于做出明智选择:
4.18.0-348.el8.x86_64
│ │ │ │ │ └─ 架构 (x86_64, aarch64 等)
│ │ │ │ └───── 发行版修订号 (el8 表示 RHEL8/CentOS8)
│ │ │ └───────── 次版本号 (348)
│ │ └────────────── 主版本号 (0)
│ └────────────────── 系列版本 (4.18)
└───────────────────── 主线版本 (4)
二、升级前的准备工作
2.1 系统状态检查
在升级前,必须全面检查系统状态:
# 1. 检查当前内核版本
uname -r
# 输出示例: 3.10.0-1160.el7.x86_64

# 2. 检查系统版本
cat /etc/redhat-release
# 输出示例: CentOS Linux release 7.9.2009 (Core)

# 3. 检查已安装的内核包
rpm -qa | grep kernel
# 输出示例:
# kernel-3.10.0-1160.el7.x86_64
# kernel-devel-3.10.0-1160.el7.x86_64
# kernel-headers-3.10.0-1160.el7.x86_64

# 4. 检查磁盘空间
df -h /boot
# 确保 /boot 分区有足够空间(至少 100MB 可用)

# 5. 检查重要服务
systemctl status sshd
systemctl status network
2.2 备份策略
内核升级前必须备份
,这是最重要的安全措施:
# 1. 备份当前内核配置
cp /boot/config-$(uname -r) /root/kernel-config-backup-$(date +%Y%m%d)

# 2. 备份当前内核模块
cp -r /lib/modules/$(uname -r) /root/modules-backup-$(date +%Y%m%d)

# 3. 创建系统快照(如果使用 LVM)
lvcreate -L 10G -s -n root-snap /dev/centos/root

# 4. 备份重要配置文件
tar czf /root/etc-backup-$(date +%Y%m%d).tar.gz /etc /boot/grub* /boot/grub2*

# 5. 记录当前加载的内核模块
lsmod > /root/lsmod-backup-$(date +%Y%m%d).txt

# 6. 记录当前网络配置
ip addr > /root/network-backup-$(date +%Y%m%d).txt
2.3 网络配置检查
网络是远程管理的关键,必须确保网络配置正确:
# 检查网络接口
ip link show

# 检查 IP 地址
ip addr show

# �1. 备份网络配置文件
cp -r /etc/sysconfig/network-scripts /etc/sysconfig/network-scripts-backup-$(date +%Y%m%d)

# 2. 检查网络配置文件内容
cat /etc/sysconfig/network-scripts/ifcfg-ens192
# 确保包含:
# – ONBOOT=yes
# – BOOTPROTO=static 或 dhcp
# – 正确的 IP、网关、DNS 配置

# 3. 检查网络管理器状态
systemctl status NetworkManager

# 4. 检查网络连接
ping -c 3 8.8.8.8
2.4 创建系统恢复环境
为应对升级失败,准备恢复环境:
# 1. 安装 rescue 内核(如果可用)
yum install kernel-$(uname -r) rescue

# 2. 配置 GRUB 确保旧内核可用
grub2-set-default 0 # 设置第一个条目为默认(通常是最新内核)
grub2-mkconfig -o /boot/grub2/grub.cfg

# 3. 验证 GRUB 配置
cat /boot/grub2/grub.cfg | grep -A 5 “menuentry”

# 4. 安装必要的恢复工具
yum install -y dracut dracut-network dracut-live
三、使用 ELRepo 仓库升级内核(推荐方法)
ELRepo 是社区维护的仓库,提供最新的内核包,是 CentOS 升级内核的推荐方法。
3.1 安装并启用 ELRepo 仓库
# 1. 导入 ELRepo GPG 密钥
rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

# 2. 安装 ELRepo 仓库(CentOS 7)
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

# 3. 安装 ELRepo 仓库(CentOS 8)
yum install -y https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm

# 4. 验证仓库已启用
yum repolist enabled | grep elrepo
# 输出应包含:elrepo-kernel
3.2 查看可用内核版本
# 查看所有可用内核
yum –disablerepo=”*” –enablerepo=”elrepo-kernel” list available

# 输出示例(CentOS 7):
# elrepo-kernel | 3.0 kB 00:00:00
# elrepo-kernel/primary_db | 2.1 MB 00:00:00
# Available Packages
# kernel-lt.x86_64 5.4.189-1.el7.elrepo elrepo-kernel
# kernel-lt-devel.x86_64 5.4.189-1.el7.elrepo elrepo-kkernal
# kernel-lt-headers.x86_64 5.4.189-1.el7.elrepo elrepo-kernel
# kernel-ml.x86_64 5.17.5-1.el7.elrepo elrepo-kernel
# kernel-ml-devel.x86_64 5.17.5-1.el7.elrepo elrepo-kernel
3.3 安装新内核
# 安装长期支持内核(推荐生产环境)
yum –enablerepo=”elrepo-kernel” install -y kernel-lt kernel-lt-devel kernel-lt-headers

# 或者安装主线内核(测试环境)
# yum –enablerepo=”elrepo-kernel” install -y kernel-ml kernel-ml-devel kernel-ml-headers

# 验证安装
rpm -qa | grep kernel
# 应该看到新内核包:
# kernel-lt-5.4.189-1.el7.elrepo.x86_64
# kernel-lt-devel-5.4.189-1.el7.elrepo.x86_64
# kernel-lt-headers-5.4.189-1.el7.elrepo.x86_64
3.4 更新引导加载器
# 1. 生成新的 GRUB 配置
grub2-mkconfig -o /boot/grub2/grub.cfg

# 2. 设置新内核为默认启动项
# 查看当前 GRUB 条目
grep “menuentry” /boot/grub2/grub.cfg

# 输出示例:
# menuentry ‘CentOS Linux (5.4.189-1.el7.elrepo.x86_64) 7 (Core)’ …
# menuentry ‘CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)’ …
# menuentry ‘CentOS Linux (0-rescue-…) 7 (Core)’ …

# 3. 设置新内核为默认(索引从 0 开始)
grub2-set-default 0

# 4. 验证默认内核
grub2-editenv list
# 输出应显示:saved_entry=0

# 5. 对于 CentOS 7,也可以使用 grub2-set-default 命令指定标题
grub2-set-default “CentOS Linux (5.4.189-1.el7.elrepo.x86_64) 7 (Core)”
3.5 重启系统并验证
# 1. 重启系统
reboot

# 2. 重启后立即检查新内核是否加载
uname -r
# 预期输出:5.4.189-1.el7.elrepo.x86_64

# 3. 检查所有内核模块是否正常加载
lsmod | head -20

# 4. 检查网络接口
ip link show
# 确保所有网络接口都处于 UP 状态

# 5. 检查系统日志
journalctl -b | grep -i error
dmesg | grep -i error
四、手动编译内核(高级方法)
当 ELRepo 无法满足需求时,可手动编译内核。此方法更复杂但灵活性最高。
4.1 准备编译环境
# 1. 安装开发工具和依赖
yum groupinstall -y “Development Tools”
yum install -y ncurses-devel bison flex elfutils-libelf-devel openssl-devel bc

# 2. 安装内核源码
# 从 kernel.org 下载
cd /usr/src
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.189.tar.xz
tar -xf linux-5.4.189.tar.xz
cd linux-5.4.189

# 3. 复制当前内核配置
cp /boot/config-$(uname -r) .config

# 4. 基于当前配置更新
make oldconfig
# 一路按回车使用默认值即可
4.2 配置内核选项
# 1. 使用菜单配置(可选)
make menuconfig

# 2. 关键配置示例:
# – 网络驱动支持
# Device Drivers —>
# Network device support —>
# Ethernet driver support —>
# Intel devices —> (选择你的网卡型号)
# Realtek devices —>

# – 文件系统支持
# File systems —>
# <*> Ext4 journalling file system support
# <*> XFS file system support

# – 虚拟化支持(如果需要)
# Virtualization —>
# <*> Kernel-based Virtual Machine (KVM) support
4.3 编译和安装内核
# 1. 编译内核(根据 CPU 核心数调整 -j 参数)
# -j 后面的数字建议为 CPU 核心数 × 2
make -j$(nproc)

# 2. 编译模块
make modules

# 3. 安装模块
sudo make modules_install

# 4. 安装内核
sudo make install

# 5. 生成 initramfs
dracut –force /boot/initramfs-5.4.189.img 5.4.189

# 6. 更新 GRUB
grub2-mkconfig -o /boot/grub2/grub.cfg
grub2-set-default 0
4.4 编译过程监控
# 监控编译进度
watch -n 10 ‘ps aux | grep make | grep -v grep’

# 查看编译错误(如果失败)
tail -f /tmp/build.log

# 检查编译结果
ls -lh /boot/vmlinuz-5.4.189
ls -lh /boot/initramfs-5.4.189.img
五、依赖处理与模块兼容性
5.1 内核模块依赖管理
新内核可能缺少某些模块,需要手动处理:
# 1. 检查当前加载的模块
lsmod > /tmp/current-modules.txt

# 2. 检查新内核是否支持这些模块
find /lib/modules/5.4.189-1.el7.elrepo.x86_64 -name “*.ko” | grep -f /tmp/current-modules.txt

# 3. 安装缺失的模块(如果来自第三方)
# 例如:安装 Broadcom 网卡驱动
yum install -y kmod-bnx2

# 4. 检查模块依赖
modinfo bnx2
# 查看依赖的固件:firmware: bnx2/bnx2-mips-09-6.2.1b.fw
5.2 处理 DKMS 模块
DKMS(Dynamic Kernel Module Support)可以自动重新编译模块:
# 1. 安装 DKMS
yum install -y dkms

# 2. 检查 DKMS 模块状态
dkms status

# 3. 为新内核添加 DKMS 模块
dkms install -m -v -k 5.4.189-1.el7.elrepo.x86_64

# 4. 示例:为新内核重新安装 VirtualBox 模块
dkms install -m vboxhost -v 6.1.34 -k 5.4.189-1.el7.elrepo.x86_64
5.3 第三方驱动处理
NVIDIA 显卡驱动
:
# 1. 在升级前卸载旧驱动
nvidia-uninstall

# 2. 升级内核后重新安装
# 下载最新驱动
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/510.47.03/NVIDIA-Linux-x86_64-510.47.03.run

# 3. 禁用 nouveau 驱动
echo “blacklist nouveau” >> /etc/modprobe.d/blacklist-nouveau.conf
dracut –force /boot/initramfs-$(uname -r).img $(uname -r)

# 4. 重启到新内核后安装
sh NVIDIA-Linux-x86_64-510.47.03.run –kernel-source-path=/usr/src/kernels/$(uname -r)
VirtualBox 驱动
:
# 1. 安装 VirtualBox DKMS 包
yum install -y VirtualBox-kmodsrc

# 2. 为新内核编译
/usr/lib/virtualbox/vboxdrv.sh setup
六、网卡驱动不兼容问题的诊断与解决
网卡驱动问题是内核升级后最常见的问题之一,下面提供完整的诊断和解决方案。
6.1 诊断网卡驱动问题
# 1. 检查网络接口状态
ip link show
# 如果看到 “UNSPEC” 或 “NO-CARRIER” 状态,可能是驱动问题

# 2. 检查内核识别的网卡
lspci | grep -i ethernet
# 示例输出:
# 01:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)

# 3. 检查驱动是否加载
ethtool -i eth0
# 或者
lsmod | grep igb # 假设是 Intel igb 驱动

# 4. 检查内核消息
dmesg | grep -i eth
dmesg | grep -i igb
# 查找类似 “igb: Unknown symbol” 的错误

# 5. 检查模块是否存在
find /lib/modules/$(uname -r) -name “*igb*”
# 如果没有输出,说明缺少驱动
6.2 常见网卡驱动解决方案
Intel 网卡驱动问题
# 1. 检查当前驱动版本
modinfo igb | grep version
# 如果新内核缺少驱动或版本不兼容

# 2. 安装 Intel 网卡驱动包
yum install -y igb kmod-igb

# 3. 如果官方包不适用,手动下载驱动
# 访问 Intel 官网下载最新驱动
wget https://downloadmirror.intel.com/28733/eng/igb-5.3.5.18.tar.gz

# 4. 编译安装
tar -xzf igb-5.3.5.18.tar.gz
cd igb-5.3.5.18/src
make install

# 5. 加载新驱动
modprobe igb
Broadcom 网卡驱动问题
# 1. 检查 Broadcom 驱动
lspci | grep -i broadcom
# 常见驱动:bnx2, bnx2x, cnic

# 2. 安装 Broadcom 驱动包
yum install -y kmod-bnx2 kmod-bnx2x

# 3. 如果驱动缺失,使用源码编译
wget https://www.broadcom.com/support/download-search?pg=Driver&pf=Ethernet+NIC&pn=NetXtreme&pa=Linux&po=All&ps=225
# 下载对应驱动源码,解压后编译安装

# 4. 加载驱动
modprobe bnx2
modprobe bnx2x
Realtek 网卡驱动问题
# 1. 检查 Realtek 网卡
lspci | grep -i realtek
# 常见型号:8111/8168/8411

# 2. 安装 r8168 驱动
yum install -y kmod-r8168

# 3. 如果官方包不适用,手动编译
wget https://github.com/mtorromeo/r8168/archive/refs/heads/master.zip
unzip master.zip
cd r8168-master
./autorun.sh

# 4. 验证驱动加载
lsmod | grep r8168
Mellanox 网卡驱动问题
# 1. 检查 Mellanox 网卡
lspci | grep -i mellanox

# 2. 安装 MLNX OFED 驱动
# 下载 MLNX OFED 包
wget http://www.mellanox.com/downloads/ofed/MLNX_OFED-5.4-1.0.3.0-rhel7.9-x86_64.tgz

# 3. 解压并安装
tar -xzf MLNX_OFED-5.4-1.0.3.0-rhel7.9-x86_64.tgz
cd MLNX_OFED-5.4-1.0.3.0-rhel7.9-x86_64
./mlnxofedinstall –force

# 4. 重新加载驱动
/etc/init.d/openibd restart
6.3 网卡驱动回滚方案
如果新内核无法解决网卡问题,可以回滚到旧内核:
# 1. 重启时在 GRUB 菜单选择旧内核
# 或者临时修改默认内核
grub2-set-default “CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)”
grub2-mkconfig -o /boot/grub2/grub.cfg

# 2. 重启系统
reboot

# 3. 验证回滚成功
uname -r
# 应显示旧内核版本

# 4. 如果需要永久删除新内核
rpm -e kernel-lt-5.4.189-1.el7.elrepo.x86_64
grub2-mkconfig -o /boot/grub2/grub.cfg
七、其他常见问题及解决方案
7.1 系统无法启动(Kernel Panic)
症状
:启动时出现 “Kernel panic – not syncing” 错误
解决方案
:
# 1. 在 GRUB 菜单中选择 “rescue” 模式
# 2. 挂载原系统
mkdir /mnt/sysroot
mount /dev/centos/root /mnt/sysroot
mount /dev/sda1 /mnt/sysroot/boot

# 3. chroot 到原系统
chroot /mnt/sysroot

# 4. 检查并修复
grub2-mkconfig -o /boot/grub2/grub.cfg
dracut –force /boot/initramfs-$(uname -r).img $(uname -r)

# 5. 重启
exit
reboot
7.2 模块签名问题
症状
:模块加载失败,提示 “Required key not available”
解决方案
:
# 1. 检查安全启动状态
mokutil –sb-state

# 2. 禁用模块签名验证(临时)
grub2-editenv list
grub2-editenv set “$(grub2-editenv list) module_sign=no”

# 3. 永久禁用(不推荐生产环境)
echo “module_sign=no” >> /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
7.3 性能下降问题
症状
:升级后系统性能不如之前
诊断步骤
:
# 1. 检查 CPU 调度器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 应为 “performance” 或 “ondemand”

# 2. 检查中断平衡
cat /proc/irq/default_smp_affinity

# 3. 检查 NUMA 配置
numactl –hardware

# 4. 检查内核参数
sysctl -a | grep vm.swappiness
sysctl -a | grep net.core.somaxconn
7.4 虚拟化兼容性问题
症状
:KVM 或 VirtualBox 无法启动虚拟机
解决方案
:
# 1. 检查虚拟化支持
grep -E “(vmx|svm)” /proc/cpuinfo

# 2. 检查 KVM 模块
lsmod | grep kvm

# 3. 重新加载 KVM 模块
modprobe -r kvm_intel
modprobe kvm_intel

# 4. 检查 VirtualBox 模块
dkms status
# 如果 vboxhost 未安装,重新安装
dkms install -m vboxhost -v 6.1.34 -k $(uname -r)
八、升级后的系统优化
8.1 内核参数调优
# 1. 编辑 sysctl 配置
vi /etc/sysctl.conf

# 添加以下优化参数:
# 网络性能优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

# 内存管理优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# 文件系统优化
fs.file-max = 2097152
fs.nr_open = 2097152

# 2. 应用配置
sysctl -p

# 3. 检查当前配置
sysctl net.core.somaxconn
8.2 检查系统服务状态
# 1. 检查关键服务
systemctl status sshd
systemctl status network
systemctl status crond
systemctl status rsyslog

# 2. 检查防火墙
systemctl status firewalld

# 3. 检查 SELinux
sestatus

# 4. 检查日志
journalctl -b -p err
journalctl -u network –since “1 hour ago”
8.3 性能基准测试
# 1. CPU 性能测试
sysbench cpu –cpu-max-prime=20000 run

# 2. 内存性能测试
sysbench memory –memory-block-size=1M –memory-total-size=10G run

# 3. 磁盘 I/O 测试
sysbench fileio –file-total-size=1G –file-test-mode=rndrw prepare
sysbench fileio –file-total-size=1G –file-test-mode=rndrw run
sysbench fileio –file-total-size=1G –file-test-mode=rndrw cleanup

# 4. 网络性能测试(需要另一台机器)
# 服务端
iperf3 -s
# 客户端
iperf3 -c
九、自动化升级脚本
9.1 完整的升级脚本示例
#!/bin/bash
# CentOS 内核升级自动化脚本
# 支持 CentOS 7/8,使用 ELRepo 仓库

set -e # 遇到错误立即退出

# 颜色定义
RED=’\033[0;31m’
GREEN=’\033[0;32m’
YELLOW=’\033[1;33m’
NC=’\033[0m’ # No Color

# 日志函数
log_info() {
echo -e “${GREEN}[INFO]${NC} $(date ‘+%Y-%m-%d %H:%M:%S’) $1”
}

log_warn() {
echo -e “${YELLOW}[WARN]${NC} $(date ‘+%Y-%m-%d %H:%M:%S’) $1”
}

log_error() {
echo -e “${RED}[ERROR]${NC} $(date ‘+%Y-%m-%d %H:%M:%S’) $1”
}

# 检查是否为 root 用户
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error “此脚本必须以 root 用户运行”
exit 1
fi
}

# 检查系统版本
check_os() {
if [[ -f /etc/redhat-release ]]; then
OS_VERSION=$(cat /etc/redhat-release)
log_info “检测到系统: $OS_VERSION”

if [[ $OS_VERSION =~ “CentOS Linux 7″ ]]; then
ELREPO_URL=”https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm”
KERNEL_TYPE=”kernel-lt”
elif [[ $OS_VERSION =~ “CentOS 8″ ]]; then
ELREPO_URL=”https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm”
KERNEL_TYPE=”kernel-lt”
else
log_error “不支持的系统版本”
exit 1
fi
else
log_error “不是 CentOS 系统”
exit 1
fi
}

# 备份系统
backup_system() {
log_info “开始备份系统…”

BACKUP_DIR=”/root/kernel-backup-$(date +%Y%m%d-%H%M%S)”
mkdir -p $BACKUP_DIR

# 备份内核配置
cp /boot/config-$(uname -r) $BACKUP_DIR/

# 备份 GRUB 配置
cp /boot/grub2/grub.cfg $BACKUP_DIR/

# 备份网络配置
cp -r /etc/sysconfig/network-scripts $BACKUP_DIR/

# 记录当前状态
uname -r > $BACKUP_DIR/current-kernel.txt
ip addr > $BACKUP_DIR/network-info.txt
lsmod > $BACKUP_DIR/modules.txt

log_info “备份完成,备份目录: $BACKUP_DIR”
}

# 检查磁盘空间
check_disk_space() {
BOOT_SPACE=$(df /boot | awk ‘NR==2 {print $4}’)
if [[ $BOOT_SPACE -lt 1048576 ]]; then # 1GB in KB
log_warn “/boot 分区空间不足: ${BOOT_SPACE}KB”
log_warn “建议清理旧内核或扩展 /boot 分区”
read -p “是否继续? (y/n): ” -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
}

# 安装 ELRepo 仓库
install_elrepo() {
log_info “安装 ELRepo 仓库…”

if ! rpm -q elrepo-release > /dev/null 2>&1; then
yum install -y $ELREPO_URL
log_info “ELRepo 仓库安装完成”
else
log_info “ELRepo 仓库已安装”
fi
}

# 安装新内核
install_kernel() {
log_info “安装新内核: $KERNEL_TYPE”

# 查看可用版本
AVAILABLE_KERNELS=$(yum –disablerepo=”*” –enablerepo=”elrepo-kernel” list available | grep $KERNEL_TYPE | awk ‘{print $2}’ | sort -V | tail -1)

if [[ -z $AVAILABLE_KERNELS ]]; then
log_error “未找到可用的内核包”
exit 1
fi

log_info “可用内核版本: $AVAILABLE_KERNELS”

# 安装内核及相关包
yum –enablerepo=”elrepo-kernel” install -y $KERNEL_TYPE $KERNEL_TYPE-devel $KERNEL_TYPE-headers

# 验证安装
if rpm -q $KERNEL_TYPE > /dev/null 2>&1; then
log_info “内核安装成功”
else
log_error “内核安装失败”
exit 1
fi
}

# 更新引导配置
update_grub() {
log_info “更新 GRUB 配置…”

# 生成新配置
grub2-mkconfig -o /boot/grub2/grub.cfg

# 设置新内核为默认
NEW_KERNEL=$(rpm -q $KERNEL_TYPE –last | head -1 | awk ‘{print $1}’)
grub2-set-default 0

log_info “GRUB 配置更新完成”
}

# 检查网络驱动
check_network_drivers() {
log_info “检查网络驱动…”

# 获取当前网络接口
INTERFACES=$(ip link show | grep -E “^[0-9]+:” | awk -F: ‘{print $2}’ | tr -d ‘ ‘)

for iface in $INTERFACES; do
if [[ $iface != “lo” ]]; then
DRIVER=$(ethtool -i $iface 2>/dev/null | grep driver | awk ‘{print $2}’)
if [[ -n $DRIVER ]]; then
log_info “接口 $iface 使用驱动: $DRIVER”
else
log_warn “接口 $iface 未找到驱动”
fi
fi
done
}

# 主函数
main() {
log_info “开始 CentOS 内核升级流程”

check_root
check_os
check_disk_space

read -p “是否继续执行升级? (y/n): ” -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info “用户取消升级”
exit 0
fi

backup_system
install_elrepo
install_kernel
update_grub
check_network_drivers

log_info “升级准备完成!”
log_warn “请重启系统以使用新内核: reboot”
log_warn “重启后请运行: uname -r 确认内核版本”
}

# 执行主函数
main “$@”
9.2 使用脚本
# 1. 保存脚本
vi /usr/local/bin/upgrade-kernel.sh

# 2. 添加执行权限
chmod +x /usr/local/bin/upgrade-kernel.sh

# 3. 运行脚本
/usr/local/bin/upgrade-kernel.sh
十、故障排查速查表
问题现象
可能原因
快速解决方案
网络接口消失
网卡驱动缺失
yum install kmod-
或手动编译驱动
系统无法启动
initramfs 不完整
在 rescue 模式下运行
dracut –force
模块加载失败
模块签名问题
禁用安全启动或模块签名验证
性能下降
调度器或参数问题
检查
/proc/sys/
参数,调整为性能模式
虚拟化失败
KVM 模块未加载
modprobe kvm_intel
或
modprobe kvm_amd
DKMS 模块未编译
DKMS 配置错误
dkms install -m -v -k
GRUB 菜单缺失
配置未更新
grub2-mkconfig -o /boot/grub2/grub.cfg
内核恐慌
硬件或驱动冲突
使用旧内核启动,检查硬件兼容性
十一、最佳实践总结
11.1 升级前检查清单
[ ] 备份重要数据和配置
[ ] 检查磁盘空间(/boot 至少 1GB 可用)
[ ] 记录当前内核模块和网络配置
[ ] 准备恢复环境(rescue 模式)
[ ] 确认硬件兼容性(特别是网卡、显卡)
[ ] 选择合适的内核版本(生产环境选 lt 版本)
[ ] 在测试环境先验证
11.2 升级后检查清单
[ ] 验证内核版本:
uname -r
[ ] 检查网络接口:
ip link show
[ ] 检查关键服务:
systemctl status sshd network
[ ] 检查日志错误:
journalctl -b -p err
[ ] 测试系统性能
[ ] 验证应用程序兼容性
[ ] 更新文档记录
11.3 生产环境建议
分阶段部署
:先在测试环境验证,再逐步推广到生产环境
维护旧内核
:保留至少一个旧内核作为回滚选项
监控升级
:升级后密切监控系统指标和日志
文档记录
:详细记录升级过程和遇到的问题
定期评估
:定期评估是否需要升级内核以获取安全补丁
结论
CentOS 内核升级是一个需要谨慎对待的任务,但通过系统化的方法和充分的准备,可以安全、高效地完成。本文从版本选择、升级准备、具体操作到问题排查,提供了完整的实战指南。
核心要点
:
备份是关键
:升级前必须完整备份
选择合适的版本
:生产环境优先选择长期支持内核
处理驱动兼容性
:特别是网卡驱动,提前准备解决方案
准备回滚方案
:确保在出现问题时可以快速恢复
自动化脚本
:使用脚本可以减少人为错误
通过遵循本指南,你应该能够顺利完成 CentOS 内核升级,并处理常见的兼容性问题。记住,内核升级不是终点,而是持续维护的开始。保持系统更新,定期评估内核版本,才能确保系统安全、稳定、高效运行。