CentOS 8离线升级内核实战:依赖准备、GRUB配置与故障恢复 📅 发布时间:2026/9/16 1:22:47 👁 浏览次数: 说实话第一次接到“Linux CentOS 8系统离线升级内核版本”这个需求时我愣了几秒。倒不是说升级内核本身有多难而是在离线环境下做这件事踩坑的维度完全不一样。这几年企业内网、工控现场、等保整改项目里碰到的CentOS 8机器越来越多但很多服务器是物理隔离的别说yum源了连个能上网的跳板机都难找。“有没有外网”和“要不要升级内核”这两件事在现实里经常是同时成立的。这篇文章就把我实际做过的离线升级内核流程完整拆一遍包括在哪里下载rpm包、怎么处理依赖关系、装完之后怎么让新内核变成默认启动、以及升级失败之后怎么抢救。适合刚接手内网服务器的新人也适合要批量处理老旧系统的老手照着做基本能一次成功。1. 为什么要离线升级内核以及升级前必须想明白的事1.1 离线升级的典型场景内网隔离、等保要求、硬件兼容先说场景。我遇到最多的情况主要有三类第一类是生产内网服务器在独立网段和互联网物理隔离或逻辑隔离日常维护只能通过堡垒机或者现场终端操作。这种环境里内核升级要么不做要做就只能走离线方案。第二类是等保合规或安全扫描要求。安全扫描报告里经常出现“内核版本过低”“存在已知CVE漏洞”这类条目尤其CentOS 8基于4.18内核很多老漏洞在4.18里没有修复必须升到高版本内核才能过检。第三类是新硬件驱动支持。比如热搜词里提到的6.6稳定版内核、EtherCAT工业实时以太网支持、igc网卡驱动Intel I225/I226系列这些在旧内核里可能压根没有驱动或者驱动有bug。工业现场、边缘计算盒子、国产化替代项目里尤其常见。只要有其中一种情况你基本就走上了离线升级这条路。1.2 先决定“升到哪个版本”和“用什么渠道的内核”升级前最忌讳的事情就是随手找个内核包就装。先说版本选择CentOS 8官方仓库里的内核版本一直停留在4.18如果你想升到5.x甚至6.x官方默认源里是没有的必须借助第三方源或者直接下载rpm包。这里我推荐用的渠道是ELRepo。ELRepo是长期维护RHEL系第三方内核的社区源里面的kernel-ml主线最新版和kernel-lt长期支持版都经过打包验证比自己在网上随便下的内核源码包靠谱得多。对于大多数生产环境我更推荐kernel-lt因为它更新节奏更稳不容易引入太激进的变化如果是需要新硬件驱动或者追求新特性就选kernel-ml比如6.6.119这个版本就属于6.6稳定分支的最新迭代既有新驱动又相对成熟。还需要注意一点如果目标机器是CentOS 8下载机最好也是CentOS 8或者Rocky Linux 8、AlmaLinux 8这类同源系统避免rpm包格式或者glibc依赖对不上。1.3 离线升级和在线升级的本质区别差别全在“依赖”在线升级的时候你敲一条dnf update kernel系统会自动把依赖包一起拉下来根本不用操心顺序和来源。离线升级不是你得先把所有需要的rpm包准备好传到目标机器上再安装依赖关系一旦没理顺就会出现经典的“装A需要B装B又依赖A”的死锁。所以离线升级的本质就是把原本由软件源自动解决的依赖问题变成人工处理。这也是为什么很多人离线装内核会卡住不是操作不会而是缺了几个依赖包不知道。1.4 升级前必须做的三个准备工作确认当前内核版本和系统版本uname -r和cat /etc/redhat-release确认架构arch一般是x86_64也有少部分是aarch64下载包的时候架构绝不能错备份重要数据虽然升级内核本身不动业务数据但重启有风险备份永远不会错提示在动手之前最好把目标机器的/boot分区空间也看一眼df -h /boot如果空间不足200MB先清理旧内核或者扩容不然新内核装到一半就报磁盘满。2. 离线升级的整体思路以及如何正确准备安装包2.1 离线安装的本质找一台“下载机”把依赖拉齐离线升级不是一个“把rpm包拷过去”这么简单的事。你需要一台能访问互联网、系统版本和目标机器一致的“下载机”在这台机器上用包管理工具把内核以及所有依赖的rpm包全部下载下来然后通过U盘、内网共享、scp等方式传到目标机器上安装。这里有一个容易忽略的细节下载机的内核版本不需要和目标机器一致但操作系统版本必须一致或者接近因为rpm包在安装时可能会要求特定的glibc版本、elfutils版本等这些基础库在不同系统版本上差异很大。如果下载机是CentOS 7目标机是CentOS 8你下载的很多包会因为“rpm依赖的libc版本不匹配”而装不上。2.2 用repotrack拉取内核及全部依赖包在下载机上配置好ELRepo源之后推荐用repotrack这个工具来下载rpm包它会自动把指定包的所有依赖一起抓下来比dnf download更省心因为后者只下载你指定的包不处理依赖。下载机操作命令# 安装repotrack工具如果没装的话 dnf install -y dnf-utils # 配置ELRepo源以ELRepo 8为例 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org dnf install -y https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm # 下载kernel-ml和devel包同时把所有依赖都拉下来 mkdir -p /data/kernel-rpms cd /data/kernel-rpms repotrack -a x86_64 kernel-ml kernel-ml-devel执行完repotrack之后/data/kernel-rpms目录下会生成几十个rpm包除了内核本体还有各种依赖库。这时候看一眼文件夹大小正常应该在几百MB左右。如果你只需要内核本体不要devel包就把kernel-ml-devel去掉但如果你后续有编译第三方内核模块的需求比如EtherCAT主站devel包几乎是必须的。2.3 如果只需要升级到官方4.18的小版本还有一种情况你不需要上高版本内核只想把当前4.18内核更新到同系列的最新补丁版本比如从4.18.0-80升到4.18.0-500。这种情况在CentOS 8的官方BaseOS源里就有只是默认情况下不开启更新源。这时候就不需要ELRepo了直接在下载机上用官方源拉包即可# 清理并重建缓存 dnf clean all dnf makecache # 查看官方源里最新的4.18内核版本 dnf list kernel --showduplicates # 下载最新版内核rpm mkdir -p /data/kernel-rpms cd /data/kernel-rpms dnf download kernel这种方式升级更保守兼容性风险小适合那种“只是为了让安全扫描闭嘴”的场景。但需要知道的是4.18内核再怎么升它还是4.18新硬件的驱动支持不会变好。2.4 关于实时内核RT和EtherCAT支持的补充说明热搜词里多次出现“6.6稳定版最新内核版本且有ethercat igc支持”和“实时补丁”。这里多说一句如果你需要EtherCAT主站比如IgH或Acontis跑在最新的6.6内核上同时还要求Intel I225/I226网卡驱动igc驱动原生可用那么直接装kernel-ml 6.6.119是可以满足的因为6.6主线已经原生集成了igc驱动EtherCAT主站需要的内核相关配置如RT能力、高分辨率定时器在主线内核里默认就是打开的。但如果你还需要完整的PREEMPT_RT实时补丁支持那就不能只装kernel-ml还要额外下载打了RT补丁的内核rpm包ELRepo里对应的包名是kernel-ml-rt。这个包只对特定架构提供下载之前先确认一下ELRepo仓库里是否存在避免白忙活。2.5 传输rpm包到目标机两种常用方式rpm包准备好了传到目标机器也有讲究。如果内网有共享目录或者FTP服务器直接传到那上面目标机器mount后安装就行。如果没有这些基础设施最简单的方式就是U盘拷贝或者通过scp从下载机直接推送到目标机前提是两台机器网络能通。# 在下载机上执行将rpm包目录推送到目标机 scp -r /data/kernel-rpms root目标机器IP:/root/注意传输完成之后在目标机器上先执行一下sha256sum *.rpm和下载机上的校验值比对防止传输过程文件损坏。这个步骤很多人省了结果装到一半rpm包校验失败反而更折腾。3. 离线升级内核的核心操作流程以及参数选择3.1 在目标机器上先备份现状记录关键信息拿到rpm包之后先别急着装。在目标机上按顺序执行下面这些命令把当前状态记录下来# 记录当前内核版本 uname -r /root/kernel-before-upgrade.txt # 记录当前系统版本 cat /etc/redhat-release /root/kernel-before-upgrade.txt # 查看已安装的内核列表 rpm -qa | grep kernel /root/kernel-before-upgrade.txt # 备份当前GRUB配置 cp /boot/grub2/grub.cfg /root/grub.cfg.bak这个备份文件看起来不起眼但万一升级后新的内核有问题你要回退旧的就必须知道之前主要的内核文件名是什么以及GRUB配置原状是什么。实际操作中很多人回退失败就是因为没有留底启动菜单里找不到旧内核。3.2 安装新内核rpm -ivh还是rpm -Uvh这一步是离线升级的关键操作很多人在这时候会纠结用-ivh还是-Uvh。简单说一下区别-ivh是install新内核会和旧内核共存启动菜单里能看到两个甚至多个内核选项-Uvh是upgrade会在安装新版的同时把旧版卸掉。在离线升级场景下永远建议用-ivh让新旧内核共存一段时间。原因很现实万一新内核起不来或者有兼容性问题你还能在GRUB菜单里选择旧内核进系统一旦用-Uvh把旧内核卸了出了问题只能进救援模式折腾。cd /root/kernel-rpms # 先安装所有依赖包 rpm -ivh *.rpm --nodeps等等这里要说清楚。我见过很多人图省事直接加--nodeps强制绕过依赖检查安装这在临时测试环境可以生产环境千万别这么干。正确做法是先不加--nodeps试一次让rpm告诉你到底缺哪些依赖如果报错里提到的依赖确实在rpm包目录里只是顺序不对那就用rpm -ivh配合包名一个个装或者第二次直接rpm -ivh *.rpm让它自动按顺序处理。如果确实缺依赖常见的缺法主要有两种缺elfutils-libelf、linux-firmware这类基础包大多数情况下CentOS 8系统里已经有了不需要额外下载。缺openssl-libs或者libssl.so.10高版本内核rpm对OpenSSL版本有要求而CentOS 8默认的OpenSSL版本可能偏低这时候需要在下载机上用dnf download openssl-libs把对应版本的rpm也拉下来一起传过去装。等依赖都补齐后再执行rpm -ivh kernel-ml-*.rpm kernel-ml-devel-*.rpm3.3 安装完成后的第一件事确认/boot目录和initramfsrpm安装成功之后内核文件会自动放到/boot目录包括vmlinuz、initramfs、System.map这些。你可以这样验证ls -l /boot/vmlinuz-* ls -l /boot/initramfs-*正常情况下新内核的vmlinuz和initramfs应该都已经生成了。如果initramfs-6.6.x.x.img不存在说明安装过程中mkinitrd步骤出了问题需要手动重新生成dracut -f /boot/initramfs-6.6.119-1.el8.elrepo.x86_64.img 6.6.119-1.el8.elrepo.x86_64这里的第二个参数是内核版本号和uname -r输出一致即可。dracut命令看着简单但很多升级失败都是因为initramfs生成不完整启动时挂在驱动加载阶段。3.4 调整GRUB默认启动项三种方法新内核装好了但系统重启后默认启动的还是旧内核因为GRUB的默认启动项还是指向旧内核。必须手动改默认项。这里推荐最稳妥的grubby方式它比直接改grub.cfg安全得多# 查看当前默认内核 grubby --default-kernel # 将默认内核设置为新内核 grubby --set-default /boot/vmlinuz-6.6.119-1.el8.elrepo.x86_64 # 验证是否设置成功 grubby --default-kernel如果你习惯用grub2-set-default也行但需要先查出新内核在GRUB菜单中的序号# 查看菜单项 awk -F\ $1menuentry {print i : $2} /etc/grub2.cfg # 假设新内核序号是0 grub2-set-default 0无论用哪种方法最后都要重新生成GRUB配置这一步不能漏。注意区分系统是BIOS引导还是UEFI引导命令不一样# BIOS引导 grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI引导 grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg提示怎么看自己是BIOS还是UEFI执行[ -d /sys/firmware/efi ] echo UEFI || echo BIOS输出什么就用对应的命令非常简单。3.5 重启前的最后检查别急着reboot很多人走到这一步就迫不及待地reboot了我强烈建议先做一遍预检。因为一旦重启失败你在内网环境里的排查手段非常有限。预检命令# 查看当前内核支持的模块版本 modinfo igc 2/dev/null | head -5 # 确认新内核的模块目录存在 ls /lib/modules/ # 用新内核的initramfs检查一下是否有明显错误 lsinitrd /boot/initramfs-6.6.119-1.el8.elrepo.x86_64.img | grep -E igc|e1000e|ext4|xfs这里解释一下为什么要查igc相关的模块。如果你升级内核的目的是驱动Intel I225/I226网卡那么新内核的initramfs里必须包含igc驱动否则重启后网卡起不来尤其是远程连接的服务器网卡不通等于彻底失联。同样的道理如果机器上的根文件系统是XFSinitramfs里必须有xfs驱动不然系统会挂载不了根分区直接进紧急模式。确认无误之后再执行reboot。3.6 重启后的验证不只是看uname重启完成后第一时间验证系统状态# 确认内核版本 uname -r # 查看启动时间确认是刚启动的 uptime # 查看系统日志里有没有和内核相关的报错 dmesg | grep -i error | head -20 # 确认网络状态 ip a # 确认根文件系统挂载正常 df -h /这里最容易被忽略的是dmesg里的报错。有时候内核能起来但某个驱动加载失败当时看没什么问题跑一段时间后就会出现诡异故障。所以升级内核后建议观察一段时间至少看一轮系统日志journalctl -k -b 0 -p err这条命令查看本次启动以来的内核错误日志如果有红色的错误项就需要去查对应的驱动或模块。4. 常见问题与排查技巧实录离线升级你会遇到的坑4.1 安装时报“缺少libssl.so.10”怎么办这个问题我遇到太多次了。CentOS 8默认的OpenSSL是1.1.1版本提供的so文件名是libssl.so.1.1而某些内核rpm或者依赖包在构建时链接的是libssl.so.10这通常是因为ELRepo的包在构建环境里带了旧版兼容库。排查思路# 先确认系统里是否有libssl.so.10 ls /usr/lib64/libssl.so* # 如果只有libssl.so.1.1用这个方法建立一个软链接 ln -s /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so.10 ln -s /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.10不过说实话通过软链接解决依赖问题只能算临时方案能用但不优雅。更稳妥的做法是去下载机上把正确的compat-openssl10包拉下来装一遍# 在下载机上执行 dnf download compat-openssl10 # 传到目标机后安装 rpm -ivh compat-openssl10-*.rpm这个包会提供libssl.so.10和libcrypto.so.10比手动软链接干净得多也不会影响其他程序。4.2 重启后卡在dracut紧急模式这是离线升级内核后最可怕的故障之一。表现是系统启动到一半停在dracut:/#提示符进不了登录界面。大部分原因都是initramfs里缺少根文件系统对应的驱动模块。处理方式在dracut提示符下先输入exit退出紧急模式看看能不能继续启动不行的话重启进入GRUB菜单选择旧内核启动然后用新内核重新生成initramfs# 回到旧内核后 uname -r # 重新生成新内核的initramfs dracut -f -v /boot/initramfs-6.6.119-1.el8.elrepo.x86_64.img 6.6.119-1.el8.elrepo.x86_64如果不知道initramfs为什么缺驱动可以加--hostonly参数重新生成它会根据当前硬件的实际情况生成最小化的initramfs把需要的驱动都打进去。4.3 新内核没有加载某块网卡驱动这种问题非常隐蔽。比如你机器上有Intel I225/I226网卡升级到6.6内核后理论上igc驱动应该自动加载但实际ip a看不到网卡。大多数情况是固件版本太老或者驱动模块被内核的某个配置项屏蔽了。排查顺序# 查看系统是否能识别到网卡硬件 lspci | grep -i ethernet # 查看igc模块是否加载 lsmod | grep igc # 如果模块存在但没有加载手动加载试试 modprobe igc # 查看驱动加载日志 dmesg | grep igc如果lspci能看到网卡但modprobe报错找不到设备那可能是网卡固件版本过低。这种情况就需要去网卡厂商官网下载对应固件更新包或者降级到ELRepo的kernel-lt版本试试因为长期支持版内核倾向于保守对旧固件兼容性更好。4.4 升级后想回退到旧内核不管之前准备得多充分总会遇到新内核就是起不来或者业务不兼容的情况。回退的思路很简单重启进GRUB菜单选择旧内核启动还是awk -F\ $1menuentry {print i : $2} /etc/grub2.cfg查看菜单项进系统后把默认启动项改回旧内核# 查看当前默认内核 grubby --default-kernel # 假设旧内核是4.18.0-477版本 grubby --set-default /boot/vmlinuz-4.18.0-477.el8.x86_64 # 重新生成GRUB配置 grub2-mkconfig -o /boot/grub2/grub.cfg旧内核确定能正常工作后再清理新内核的rpm包rpm -e kernel-ml-6.6.119-1.el8.elrepo.x86_64 kernel-ml-devel-6.6.119-1.el8.elrepo.x86_64注意清理之前务必确认当前正在使用的是旧内核别把正在运行的内核给卸了。4.5 第三方内核模块编译失败如果你需要在上升级后的内核上编译第三方模块比如EtherCAT主站、自研驱动、DPDK相关模块大概率会遇到“kernel-devel版本不匹配”的报错。解决办法是确保升级时安装了kernel-ml-devel包然后在编译前确认编译环境用的是新内核的头文件目录# 确认devel包对应的内核版本 ls /usr/src/kernels/ # 输出应该是6.6.119-1.el8.elrepo.x86_64 # 如果编译脚本默认用的不是这个版本设置环境变量 export KERNELDIR/usr/src/kernels/6.6.119-1.el8.elrepo.x86_64一个非常实用的建议如果公司里有不止一台同型号的服务器推荐在一台测试机上先完整走一遍升级流程包括编译第三方模块确认没问题后再批量推到生产机。批量操作时用Ansible或写个简单的Shell脚本把rpm安装、GRUB设置、重启验证串起来能省掉大量重复劳动。5. 离线升级内核的其他细节空间、清理和注意事项5.1 /boot分区空间不足的在线处理方案前面提过/boot分区空间要提前看但如果你已经安装完新内核才发现空间不足这时候不要慌。rpm安装过程中如果报“No space left on device”可以先把系统里的旧内核清理一部分但注意一定要保留至少一个旧内核作为回退保险而且确保当前在用的是另一个内核否则会直接导致启动失败。查看已安装的内核和对应文件大小rpm -qa | grep ^kernel du -sh /boot/vmlinuz-* /boot/initramfs-*确认当前正在使用的内核uname -r然后删除确定不需要的旧内核包连带它的devel包一起卸掉释放/boot空间rpm -e kernel-4.18.0-305.el8.x86_64 kernel-devel-4.18.0-305.el8.x86_645.2 离线环境下缺少makemenuentry或grub2-mkconfig命令如果你用的CentOS 8是最小化安装部分GRUB相关工具可能没装全。离线环境下没法直接用dnf安装但这几个常用命令的rpm包其实你的系统里已经有了只是没在PATH里查一下就能找到# 查找grub2-mkconfig路径 find / -name grub2-mkconfig 2/dev/null通常位于/usr/sbin/目录下如果你的PATH没有包含/usr/sbin在执行命令时加上全路径即可/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg5.3 ll命令、编辑器等基础工具的缺失最小化安装的系统可能连vim、ll都没有这不影响升级本身但会影响排查问题效率。我建议在下载机上提前把vim-enhanced、lsof、tcpdump这些常用排查工具对应的rpm包带过去有备无患。特别是lsof和tcpdump很多网络问题排查离不开它们而且离线环境下临时找包很麻烦。5.4 关于CentOS 8生命周期结束对升级的影响这里要提一个现实层面的问题CentOS 8在2024年已经停止维护了官方源已经迁移到vault.centos.org。如果你现在才来做离线内核升级大概率是接手的老机器。这种情况下升级内核只能解决“内核版本和安全漏洞”的问题不能解决“系统整体不再维护”的问题。从长期看如果机器是业务核心我建议认真考虑迁移到Rocky Linux、AlmaLinux 8或者干脆评估新版本系统。但迁移是另一个大工程短期内用ELRepo的kernel-ml/l t把内核保持在一个现代版本至少能让安全扫描不那么难看也能让新硬件驱动有得用算是一个“花小钱办大事”的过渡方案。5.5 批量升级时的时间点和回滚预案如果有多台机器要批量升级我强烈建议第一批选一台非核心业务机完整走通流程观察至少3到5天第二批选业务相对没那么敏感的机器再验证一遍第三批才轮到核心生产机每台机器升级前都要确认回滚方法。不要想当然地认为“上一台成功了这一台也会成功”因为即使系统版本一样硬件驱动、已装软件、磁盘布局都可能不同。6. 这几次离线升级下来我的一些体会做了好几次离线内核实战之后我最深的感受是离线升级内核这件事真正的难点从来不是“怎么打rpm命令”而是“怎么在动手之前把所有可能出问题的环节都想到”。依赖包缺一个你还能想办法补网卡驱动没进initramfs那就得跑现场或者干瞪眼。我个人习惯是每做完一次离线升级就在本地维护一个小文档记录这次的下载机系统版本、目标机版本、内核版本、依赖包清单、遇到的问题和当时的解决方法。下次再做类似任务直接把上次的rpm包目录和文档拿出来复用工作量能少一半。如果你现在正准备给CentOS 8做离线内核升级别急着找教程先花半小时把目标机器的当前状态、硬件拓朴、业务依赖梳理清楚然后按这篇文章的流程准备rpm包和应对方案。只要准备阶段多花的心思足够多真正执行的时候反而很顺利。希望这份流程能让你少踩几个我之前踩过的坑。