CentOS 7内核升级实战:从版本选择到规避‘pstore: unknown compression: deflate’启动报错
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 为什么选择ELRepo?
CentOS官方仓库的内核版本更新较慢,而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="*" --enablerepo="elrepo-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 --enablerepo=elrepo-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\' '$1=="menuentry " {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.modeset=0"参数。修改后的行应该类似这样:
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet mgag200.modeset=0"保存文件后,再次重新生成GRUB配置:
grub2-mkconfig -o /boot/grub2/grub.cfg最后重启系统:
reboot这次启动应该就能顺利进入新内核了。
6. 验证与故障排除
6.1 验证新内核
系统重启后,再次运行:
uname -r确认输出显示的是新安装的内核版本。
6.2 常见问题解决
如果系统无法启动到新内核,可以尝试以下步骤:
- 在GRUB菜单界面选择旧内核启动
- 检查/var/log/messages和dmesg日志中的错误信息
- 确认GRUB配置是否正确,特别是mgag200.modeset=0参数是否添加
- 检查/boot分区是否有足够空间(至少需要200MB空闲)
6.3 回退到旧内核
如果新内核确实无法正常工作,可以回退到旧内核:
- 启动时在GRUB菜单中选择旧内核
- 进入系统后卸载问题内核:
yum remove kernel-lt-版本号- 重新生成GRUB配置
7. 生产环境建议
在实际生产环境中升级内核时,我总结了几个重要经验:
首先,一定要在测试环境验证。我曾经犯过直接在生产环境升级的错误,结果因为一个不起眼的驱动问题导致服务中断。
其次,选择合适的内核版本。不要盲目追求最新,而是要根据硬件和业务需求选择经过验证的稳定版本。我们公司现在使用的都是ELRepo提供的LTS版本,稳定性很有保障。
最后,做好回退预案。每次升级前我都会确保旧内核完好,并且准备好快速回退的步骤文档。这样即使出现问题也能在最短时间内恢复服务。
