
1. 为什么需要升级CentOS 7内核很多朋友可能会疑惑CentOS 7系统不是自带内核吗为什么还要折腾升级我刚开始接触Linux运维时也有同样的疑问直到在实际生产环境中踩过几次坑才明白内核升级的重要性。首先CentOS 7默认安装的内核版本通常比较老旧。比如最新的CentOS 7.9默认内核版本是3.10.x而这个版本的内核发布于2013年。随着硬件迭代和新技术发展老内核对新硬件的支持往往不够完善。我就遇到过服务器安装新网卡后无法识别的情况升级内核后问题迎刃而解。其次新内核通常包含性能优化和安全补丁。比如在KVM虚拟化环境中新内核的调度器优化可以显著提升虚拟机性能又比如Meltdown和Spectre这类CPU漏洞的修复都需要通过内核升级来实现。去年我们公司就因为有台服务器没及时升级内核导致被挖矿程序入侵这个教训让我记忆犹新。不过内核升级也不是越新越好。主线最新版kernel-ml虽然功能丰富但稳定性可能不如长期支持版kernel-lt。我建议生产环境选择ELRepo提供的长期支持版本既获得了新特性又保证了系统稳定性。接下来我就详细说说具体操作步骤。2. 准备工作与环境检查2.1 系统现状检查在开始升级前我们需要先了解当前系统的内核状态。打开终端执行以下命令查看运行中的内核版本uname -r这个命令会输出类似3.10.0-1160.el7.x86_64的结果表示当前运行的内核版本。建议记录下这个信息万一升级出现问题可以快速回退。接着检查系统已安装的所有内核包rpm -qa | grep kernel这个命令会列出所有已安装的内核相关rpm包。正常情况下你会看到多个版本的内核因为yum更新时会保留旧内核作为备用。2.2 备份重要数据虽然内核升级通常不会影响用户数据但作为系统管理员备份是必须养成的习惯。我建议至少备份以下内容/etc/default/grub文件这个文件包含GRUB引导程序的配置参数/boot目录存放内核镜像和initramfs文件重要业务数据虽然理论上不受影响但多一份备份更安心可以使用tar命令创建备份tar -czvf /root/kernel_backup_$(date %Y%m%d).tar.gz /etc/default/grub /boot2.3 安装必要工具确保系统已安装以下基础工具yum install -y wget vim这些工具在后续操作中都会用到。特别是vim我们需要用它来编辑GRUB配置文件。3. 配置ELRepo仓库3.1 为什么选择ELRepoCentOS官方仓库的内核版本更新较慢而ELRepo仓库提供了更多内核选择。它维护了两个版本的内核kernel-ml主线最新版包含最新特性但稳定性可能稍差kernel-lt长期支持版经过充分测试适合生产环境根据我的经验生产服务器强烈建议使用kernel-lt版本。我曾经在测试环境尝试过kernel-ml虽然功能新颖但遇到过驱动兼容性问题。3.2 安装ELRepo仓库首先导入ELRepo的GPG密钥rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org然后安装ELRepo的rpm包rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm安装完成后可以查看ELRepo仓库中可用的内核版本yum --disablerepo* --enablerepoelrepo-kernel list available | grep kernel你会看到类似这样的输出kernel-lt.x86_64 5.4.218-1.el7.elrepo elrepo-kernel kernel-lt-devel.x86_64 5.4.218-1.el7.elrepo elrepo-kernel kernel-lt-doc.noarch 5.4.218-1.el7.elrepo elrepo-kernel kernel-lt-headers.x86_64 5.4.218-1.el7.elrepo elrepo-kernel kernel-ml.x86_64 6.0.7-1.el7.elrepo elrepo-kernel4. 安装新内核4.1 安装最新长期支持版安装kernel-lt及其相关组件yum -y --enablerepoelrepo-kernel install kernel-lt kernel-lt-devel kernel-lt-doc kernel-lt-headers这个命令会安装最新可用的长期支持版内核。安装完成后建议重启系统使新内核生效reboot4.2 安装指定版本内核有时候我们可能需要安装特定版本的内核。比如某些硬件驱动只兼容特定内核版本。这时可以手动下载rpm包安装。首先在ELRepo镜像站找到需要的版本。国内用户可以使用阿里云镜像加速下载wget https://mirrors.aliyun.com/elrepo/kernel/el7/x86_64/RPMS/kernel-lt-4.4.207-1.el7.elrepo.x86_64.rpm然后手动安装rpm -ivh kernel-lt-4.4.207-1.el7.elrepo.x86_64.rpm注意手动安装时需要同时安装对应版本的kernel-lt-devel等配套包否则可能导致模块无法编译。5. 配置GRUB引导5.1 检查GRUB配置新内核安装后我们需要确保系统能正确引导到新内核。首先查看当前GRUB菜单项awk -F\ $1menuentry {print i :$2} /etc/grub2.cfg输出会列出所有可用的内核启动项类似这样0:CentOS Linux (5.4.218-1.el7.elrepo.x86_64) 7 (Core) 1:CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core) 2:CentOS Linux (0-rescue-xxxx) 7 (Core)数字0对应的是最新安装的内核。5.2 设置默认启动项将新内核设为默认启动项grub2-set-default 0然后重新生成GRUB配置文件grub2-mkconfig -o /boot/grub2/grub.cfg注意在UEFI启动的系统上可能需要使用不同的路径grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg5.3 解决pstore报错问题这里就是很多朋友会遇到的关键问题了。如果不进行特殊配置新内核启动时可能会出现pstore: unknown compression: deflate错误导致系统无法正常启动。解决方法是在GRUB配置中添加一个内核参数。编辑/etc/default/grub文件vim /etc/default/grub找到GRUB_CMDLINE_LINUX这一行在最后添加mgag200.modeset0参数。修改后的行应该类似这样GRUB_CMDLINE_LINUXcrashkernelauto spectre_v2retpoline rd.lvm.lvcentos/root rd.lvm.lvcentos/swap rhgb quiet mgag200.modeset0保存文件后再次重新生成GRUB配置grub2-mkconfig -o /boot/grub2/grub.cfg最后重启系统reboot这次启动应该就能顺利进入新内核了。6. 验证与故障排除6.1 验证新内核系统重启后再次运行uname -r确认输出显示的是新安装的内核版本。6.2 常见问题解决如果系统无法启动到新内核可以尝试以下步骤在GRUB菜单界面选择旧内核启动检查/var/log/messages和dmesg日志中的错误信息确认GRUB配置是否正确特别是mgag200.modeset0参数是否添加检查/boot分区是否有足够空间至少需要200MB空闲6.3 回退到旧内核如果新内核确实无法正常工作可以回退到旧内核启动时在GRUB菜单中选择旧内核进入系统后卸载问题内核yum remove kernel-lt-版本号重新生成GRUB配置7. 生产环境建议在实际生产环境中升级内核时我总结了几个重要经验首先一定要在测试环境验证。我曾经犯过直接在生产环境升级的错误结果因为一个不起眼的驱动问题导致服务中断。其次选择合适的内核版本。不要盲目追求最新而是要根据硬件和业务需求选择经过验证的稳定版本。我们公司现在使用的都是ELRepo提供的LTS版本稳定性很有保障。最后做好回退预案。每次升级前我都会确保旧内核完好并且准备好快速回退的步骤文档。这样即使出现问题也能在最短时间内恢复服务。