
干了这么多年 Linux 运维我越来越觉得“下载内核安装包”这件事被很多人想简单了。你以为是下个 kernel 的 RPM 装上去就完事结果等你要编译网卡驱动、装 DPDK、给数据库调优的时候才发现还要 kernel-devel、kernel-headers甚至 kernel-modules-extra。更要命的是 CentOS 6、7、8、9 的仓库位置和下载工具都不一样照着老教程抄命令经常 404。这篇我把 CentOS 各个系列版本的内核安装包下载方法完整梳理一遍覆盖 yum/dnf 命令行工具、镜像站直链、Vault 存档、ELRepo 备用内核和离线环境全套方案。不管是自己升级内核还是给无外网的生产环境备包都能照着操作。1. 内核安装包不是只有 kernel 一个先弄清你到底要下载哪个很多刚接触的人以为“内核安装包”就是 kernel 那个 RPM实际上 CentOS 里的内核是一个完整家族不同使用场景对应不同成员。我在一次客户现场就吃过亏客户要求把内核升级到指定版本用来支撑某个存储驱动我只下了 kernel 包装上了系统确实起来了但驱动模块编译时报找不到/usr/src/kernels/目录最后还得补下 kernel-devel 重新编译。多花了一下午全是因为下载前没把包的类型理清楚。1.1 内核包家族的常见成员CentOS 7 以及更早的版本里内核相关 RPM 主要由下面几个包组成。包名包含内容典型用途kernel内核本体包括 vmlinuz 引导文件、核心内核模块升级或更换内核版本kernel-devel内核源码头文件、Makefile、编译配置编译第三方内核模块、驱动、DPDK、DKMSkernel-headers内核向用户空间暴露的 API 头文件编译用户态程序时需要kernel-toolsperf 等性能调优工具排查 CPU、PMU 等性能问题kernel-tools-libskernel-tools 的依赖库配合 kernel-tools 安装kernel-modules-extra额外硬件驱动模块比如部分网卡、存储适配器识别不到某些硬件时考虑其中最容易混淆的是 kernel-devel 和 kernel-headers。kernel-devel 是给“内核模块”编译用的装完以后会出现在/usr/src/kernels/$(uname -r)目录里面有一整套构建内核模块所需的东西kernel-headers 则是给“用户态程序”用的一般装在/usr/include/linux编译普通的 C 程序时引用。很多人把这两者当成一回事结果用 kernel-headers 去编译驱动报一堆找不到头文件的错。1.2 不同场景到底该选哪个包结合我实际经手的场景选包逻辑基本是这样只是想把系统内核升级到某个新版本比如从 3.10 升到 5.x下载 kernel 包就行装完重启进新内核。要编译某个第三方驱动或模块比如网卡驱动、GPU 驱动、DPDK、Open vSwitch 等必须同时准备 kernel 和与当前内核版本完全一致的 kernel-devel。要开发用户态程序比如编译高性能网络库、涉及系统调用封装的程序一般只需要 kernel-headers。要做性能调优用 perf 等工具下载 kernel-tools同时它会自动依赖 kernel-tools-libs最好用带--resolve的方式一并拉下来。一个容易忽略的细节是kernel-devel 的版本必须和正在运行的内核版本对齐。比如系统uname -r输出3.10.0-1160.el7.x86_64那你下载的 kernel-devel 也必须是3.10.0-1160.el7.x86_64差一个小版本编译出来都会提示版本不匹配。这个在离线下载场景尤其要注意我后面会专门讲怎么核对。2. CentOS 各系列仓库现状为什么下载方式完全不一样在动手下载之前先得知道 CentOS 各系列的仓库形态。CentOS 的版本号从 6 到 9看起来只是数字变化但仓库地址、包管理器和生命周期策略都有很大差异尤其是 CentOS 8 停止维护之后官方把相关文件挪进了 Vault 存档很多老教程里的镜像地址直接失效这是新手最容易卡住的地方。2.1 各系列的生命周期和仓库位置CentOS 6 早已进入 EOL 状态所有软件包都归档在 Vault 里CentOS 7 的生命周期到 2024 年 6 月为止官方源也会逐步迁移归档CentOS 8 更特殊官方在 2021 年就提前停止维护BaseOS、AppStream 这些仓库内容都被锁定到 8.5.2111 版本后续再也不会更新CentOS 8 Stream 则继续滚动更新CentOS 9 Stream 是目前仍在活跃迭代的版本。仓库地址的变化也是关键。仍在维护的版本默认源会指向mirror.centos.org下面的对应目录已经归档的版本必须到vault.centos.org找对应版本号。比如 CentOS 7 的内核 RPM 在这样一个路径模式里https://vault.centos.org/7.9.2009/os/x86_64/Packages/CentOS 8 则在https://vault.centos.org/8.5.2111/BaseOS/x86_64/os/Packages/注意 CentOS 8 的内核包不在 Packages 根目录下而是在 BaseOS 仓库的目录里因为 CentOS 8 开始引入了 BaseOS 和 AppStream 的仓库拆分机制。CentOS 9 Stream 的内核包则可以在https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/这个地址很多新人不认识因为 CentOS 9 之后不再有传统意义上的“CentOS Linux”而是全面转向 CentOS Stream 模式它位于 RHEL 的上游而不是下游意味着没有固定版本号持续滚动更新。2.2 下载前先确认系统和内核版本不管用哪种方式下载第一步永远是确认目标系统的架构、系统版本和当前内核版本。我一般用下面这几条命令# 查看系统大版本 cat /etc/redhat-release # 查看内核版本 uname -r # 查看系统架构 uname -m # 查看已安装的内核相关包 rpm -qa | grep -E ^kernel输出结果大致是这样CentOS Linux release 7.9.2009 (Core) 3.10.0-1160.119.1.el7.x86_64 x86_64 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 kernel-tools-3.10.0-1160.el7.x86_64知道这些信息之后才谈得上选择对应版本的安装包。比如架构是 aarch64那就得去aarch64目录而不是x86_64目录下载否则 RPM 根本装不上报“wrong architecture”。系统版本决定了走哪个仓库、哪个镜像路径内核版本则决定了当你需要配套下载 kernel-devel 时应该锁定哪个精确版本号。3. 命令行仓库直接拉取yumdownloader 与 dnf download 实战如果目标机器能联网最省事的下载方式不是开浏览器去找 RPM而是直接用包管理器自带的下载插件。老版本 CentOS 用 yum 系工具新版本用 dnf 系工具命令略有差别但思路一致。3.1 CentOS 6/7 使用 yumdownloaderCentOS 6 和 7 默认不安装 yumdownloader需要先安装 yum-utils 这个工具集yum install -y yum-utils装好之后下载内核相关的包到一个指定目录比如/root/kernel-packagesmkdir -p /root/kernel-packages yumdownloader kernel --destdir/root/kernel-packages--destdir指定下载目录如果不指定yumdownloader 会把 RPM 下载到当前目录。默认情况下yumdownloader 只会下载你明确指定的包不会连依赖一起下这是它和 yum install 的最大区别。如果希望把依赖也一并拉下来要加上--resolve参数yumdownloader kernel kernel-devel kernel-headers --resolve --destdir/root/kernel-packages--resolve会解析这些包的依赖关系把仓库里的依赖 RPM 也下载到相同目录。注意--resolve只解决依赖不会把整个Base组里的包都拉下来所以下载速度通常在可接受范围内。如果想下载某个特定版本而不是当前仓库里的最新版本可以用--downloadonly配合显式指定版本号先通过 repoquery 查可用版本repoquery --show-duplicates kernel输出的结果里会列出仓库中所有可用的 kernel 版本比如kernel-3.10.0-957.el7.x86_64 kernel-3.10.0-1062.el7.x86_64 kernel-3.10.0-1160.el7.x86_64然后指定完整版本号下载yumdownloader kernel-3.10.0-957.el7.x86_64 --destdir/root/kernel-packages这里的经验是版本号一定要写全包括el7和架构名否则 yumdownloader 可能匹配不到包。3.2 CentOS 8/9 使用 dnf downloadCentOS 8 开始系统的包管理器换成了 dnf虽然yum命令仍然作为一个兼容软链存在但下载插件的用法更建议直接用 dnf 系工具。dnf download 是 dnf-plugins-core 提供的插件系统默认可能没有先安装dnf install -y dnf-plugins-core然后就可以下载内核包了dnf download kernel kernel-devel kernel-headers --destdir/root/kernel-packages注意 dnf download 默认不会下载依赖如果需要连带依赖一起下载必须显式加--resolvednf download kernel kernel-devel kernel-headers --resolve --alldeps --destdir/root/kernel-packages这里--alldeps的含义是包括所有依赖不论该依赖是否已经安装。常规做法其实不加--alldeps也行但离线环境下机器往往不具备联网条件依赖情况未知加这个参数更稳妥。dnf download 也可以指定架构比如只下载 x86_64 的包dnf download kernel --archx86_64 --destdir/root/kernel-packagesCentOS 9 的内核包拆分更细了常见的有 kernel-core、kernel-modules、kernel-modules-extra 等子包。安装时依然可以直接dnf install kernel由包管理器自动组装但手工下载时要清楚只下 kernel 一个包可能不够。比如 CentOS 9 Stream 里执行dnf download kernel可能会下到的是kernel-core和kernel-modules等一组包因为元数据里做了依赖关系拆分。建议下载时直接把kernel kernel-core kernel-modules kernel-modules-extra kernel-devel kernel-headers都列上免得缺一个。3.3 为什么我更推荐命令行下载而不是浏览器很多教程让你去 mirror 网站手点我觉得这个习惯要改。命令行下载有几个优势一是能自动解析依赖二是能确保版本和仓库信息一致三是方便脚本化批量操作。你在浏览器里下载只能一个个点还要手动核对文件名称是否和系统匹配非常容易出错。尤其是--resolve这个参数它在离线部署场景里几乎是必需品把内核、devel、headers 以及所有依赖一次性拉下来拷到没网的机器上就能用。这个能力是浏览器下载给不了的。4. 各系列版本的下载命令与镜像路径解析前面讲的是通用工具这一节细说每个系列版本具体怎么下包括命令行方式和直接 URL 方式。很多老教程不能用了就是因为只给了命令没有说仓库路径规则版本一变路径就失效。4.1 CentOS 6/7 系列直接指向 Vault 路径CentOS 6 和 7 都已进入 EOL 阶段官方源纷纷把内容挪到 Vault考虑到 CentOS 7 是最多生产环境还在跑的版本我重点展开 7 的操作。CentOS 7 整个生命周期内的小版本很多7.0 到 7.9 都有但内核 RPM 目录结构基本一致即os/x86_64/Packages/和updates/x86_64/Packages/两个目录。所谓 updates 目录才是日常获得新内核的地方因为基础 os 目录里只有初始版本的内核后续安全更新和 bugfix 都推到 updates 仓库。所以想下载某个修复过安全漏洞的新内核应该去 updates 目录而不是 os 目录。直接通过浏览器或 wget 下载的话路径是这样wget https://vault.centos.org/7.9.2009/updates/x86_64/Packages/kernel-3.10.0-1160.119.1.el7.x86_64.rpm这里有个坑Vault 目录里不是随便写文件名就能命中因为 updates 仓库的文件会随更新不停变化旧版本可能被删掉。你要是想找某个具体的旧内核直接猜 URL 大概率 404。正确做法是先用 repoquery 在配置好 Vault 源的机器上查版本号拿到准确的文件名再下载或者干脆用 yumdownloader。我一般是在一台 CentOS 7 测试机上配置好 Vault 源然后把需要的内核版本下载到本地目录再分发到目标机器。配置 Vault 源的方式是新建/etc/yum.repos.d/CentOS-Vault.repo内容大概是这样[base] nameCentOS-7 - Base baseurlhttps://vault.centos.org/7.9.2009/os/x86_64/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [updates] nameCentOS-7 - Updates baseurlhttps://vault.centos.org/7.9.2009/updates/x86_64/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7把原来的 mirrorlist 或 baseurl 改掉之后yum clean all yum makecache重建缓存就可以正常查询、下载内核包了。CentOS 6 的路径规则类似只是版本号位置变成了 6.10https://vault.centos.org/6.10/os/x86_64/Packages/ https://vault.centos.org/6.10/updates/x86_64/Packages/CentOS 6 的 yumdownloader 同样来自 yum-utilsyum install -y yum-utils yumdownloader kernel kernel-devel --resolve --destdir/root/kernel-packages4.2 CentOS 8 系列BaseOS 和 AppStream 的拆分CentOS 8 虽然生命周期已经结束但还有大量存量机器。它的内核包位置和 CentOS 7 不一样不是直接在Packages下而是在BaseOS仓库的Packages目录下。例如 8.5.2111 版本的内核包路径是https://vault.centos.org/8.5.2111/BaseOS/x86_64/os/Packages/命令行方式直接用 dnf download但要注意默认仓库配置。CentOS 8 的仓库文件分成了 BaseOS、AppStream、Extras 等内核在 BaseOS 仓库所以下载时要确认这个仓库是启用的dnf download kernel kernel-devel kernel-headers --resolve --destdir/root/kernel-packages如果报找不到包优先检查仓库配置里enabled1是否正确或者执行dnf repolist看仓库是否加载。CentOS 8 Stream 的内核包路径在 mirror.stream.centos.org 下https://mirror.stream.centos.org/8-stream/BaseOS/x86_64/os/Packages/CentOS 8 Stream 仍在更新内核所以文件的版本号会持续变化用 repoquery 查最稳。4.3 CentOS 9 系列Stream 模式下的下载方法CentOS 9 已经没有传统固定版本的概念只有 CentOS 9 Stream内核滚动更新。默认仓库路径是https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/下载命令和 CentOS 8 基本一致但要注意一点CentOS 9 的内核包拆得更细除了 kernel、kernel-devel、kernel-headers还有 kernel-core、kernel-modules、kernel-modules-extra。这几个包通常不是你手动选择而是由依赖关系自动拉取。如果你用dnf download kernel --resolve它会自动把 kernel-core 和 kernel-modules 等一起拉下来。如果只是想要一个完整的可引导内核建议这样下载dnf download kernel kernel-core kernel-modules kernel-modules-extra --resolve --destdir/root/kernel-packagesCentOS 9 里安装内核还有一个特点默认 grub 引导会保留多内核条目手动替换内核时要留意/boot/loader/entries/下的配置不要盲目删除旧内核条目否则遇到新内核引导失败就麻烦了。4.4 从镜像站直接下载 RPM 的通用规则除了官方源很多镜像站也提供 CentOS 各版本的仓库镜像比如阿里云镜像站、清华 TUNA、华为云镜像站等。它们的目录结构和官方源基本一致拿来下载 RPM 非常方便。以一个常见的镜像站为例CentOS 7 的内核包路径通常是https://mirrors.aliyun.com/centos/7.9.2009/updates/x86_64/Packages/CentOS 8 和 CentOS 9 也类似关键在于“知道包在哪个仓库目录”这个信息比记住具体 URL 更重要。只要目录规则对了用 wget 加文件名就能下载。另外建议用多线程下载工具代替直接 wget尤其是从国外源下载大 RPM 时速度差距很大yum install -y axel axel -n 8 https://vault.centos.org/7.9.2009/updates/x86_64/Packages/kernel-3.10.0-1160.119.1.el7.x86_64.rpm-n 8表示开 8 个线程实测下来比 wget 单线程快不少。不过下载完成后一定要做签名校验这个我在第 7 节专门说。5. ELRepo 备用内核主线版和长期支持版怎么下载很多时候官方仓库里的内核版本不够新或者你需要 mainline 内核来支持新硬件这时候 ELRepo 几乎是绕不开的选择。ELRepo 是一个专门为 RHEL 系发行版提供新内核和硬件驱动模块的第三方仓库它提供两类内核包kernel-ml 对应 Mainline 主线版本更新频率高功能最新kernel-lt 对应 Long Term 长期支持版本更新节奏更稳适合对稳定性要求高的生产环境。5.1 安装 ELRepo 仓库ELRepo 的安装方式各版本略有区别本质上是导入 GPG 密钥然后安装 elrepo-release 这个 RPM。CentOS 7 上执行rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpmCentOS 8 上执行rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpmCentOS 9 Stream 上执行rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm安装完以后yum repolist或dnf repolist能看到新出现的 elrepo、elrepo-kernel、elrepo-extras 等仓库。ELRepo 的 kernel-ml 和 kernel-lt 都放在 elrepo-kernel 仓库里这个仓库默认是禁用的需要显式启用。5.2 下载 kernel-ml 或 kernel-lt如果只是想下载安装包而不是直接安装CentOS 7 上可以这样yumdownloader kernel-ml --enablerepoelrepo-kernel --destdir/root/kernel-packagesCentOS 8/9 上对应命令是dnf download kernel-ml --enablerepoelrepo-kernel --destdir/root/kernel-packages同样建议把 kernel-ml-devel 和 kernel-ml-headers 等配套包也一起拉下来因为升级到 mainline 内核后如果需要编译驱动必须匹配对应的 devel 包。我通常会这样下载dnf download kernel-ml kernel-ml-devel kernel-ml-headers kernel-ml-tools --enablerepoelrepo-kernel --resolve --destdir/root/kernel-packages如果用 yum 系工具则写成yumdownloader kernel-ml kernel-ml-devel kernel-ml-headers --enablerepoelrepo-kernel --resolve --destdir/root/kernel-packageskernel-lt 的做法完全一样把包名换成 kernel-lt 即可。如果只是想查看 ELRepo 内核仓库里有哪些版本可以用 repoqueryrepoquery --enablerepoelrepo-kernel --show-duplicates kernel-ml输出会列出一大串版本号方便你选择具体版本下载。5.3 使用 ELRepo 的注意事项ELRepo 的内核包名带ml或lt后缀安装完成后系统里会同时存在官方内核和 ELRepo 内核重启时通过 grub 的菜单选择进入哪个内核。这里最大的坑是如果 ELRepo 内核启动后出现模块加载错误比如某些官方仓库里的内核模块和 mainline 内核不兼容一般需要重新编译这些模块。所以生产环境建议先在一台测试机上验证确认应用兼容性后再批量操作。另外ELRepo 的内核下载下来以后RPM 包的文件名可能会包含距离当前日期较近的版本号比如kernel-ml-6.6.x-1.el7.elrepo.x86_64.rpm。如果你做自动化脚本匹配文件名一定要用通配符而不是写死版本号否则版本一更新脚本就失效。6. 离线环境下的全套下载方案一台联网机器搞定所有依赖说了这么多命令其实最考验人的是离线环境。生产内网机器没有外网但又必须升级内核或安装内核开发环境这时候你得在一台能联网的相同版本 CentOS 机器上把所需 RPM 全部下载好再拷进去安装。整个流程我拆成三步。6.1 第一步联网机器上收集全部 RPM以 CentOS 7 为例假设目标机器内核版本是 3.10.0-1160.el7你想替换成更新的内核同时需要配套的 devel 和 headers那么在联网机器上执行mkdir -p /root/kernel-packages yumdownloader kernel kernel-devel kernel-headers --resolve --destdir/root/kernel-packages这里--resolve特别重要因为 kernel 和 kernel-devel 之间没有硬依赖关系但系统从旧内核切换到新内核时grub 和 systemd 等组件可能有依赖要求把依赖一并拉过来可以避免到目标机器上装的时候缺包。下载完成后检查一下目录内容ls -lh /root/kernel-packages/正常情况下会看到 kernel、kernel-devel、kernel-headers 以及它们的依赖包比如grub2-tools、systemd相关包等。如果某个包缺失说明源仓库里可能没有对应版本需要重新检查源配置。对于 ELRepo 内核也同理只是多了--enablerepoelrepo-kernel。6.2 第二步用 createrepo 构建本地仓库把 RPM 拷到目标机器后不建议直接rpm -ivh *.rpm一把梭。因为 RPM 之间可能有依赖顺序手动装很容易报依赖错误。更稳妥的做法是在目标机器上把 RPM 目录构建成本地 yum 仓库然后当成一个本地源来用。先在联网机器或目标机器上安装 createrepo 工具yum install -y createrepo然后在 RPM 所在目录生成仓库元数据cd /root/kernel-packages createrepo .生成完成后目录下会出现repodata文件夹。把整个/root/kernel-packages目录拷贝到目标机器比如放到/opt/kernel-packages然后在目标机器上新建一个仓库文件/etc/yum.repos.d/local-kernel.repo[local-kernel] nameLocal Kernel Packages baseurlfile:///opt/kernel-packages enabled1 gpgcheck0执行yum clean all yum makecache之后就可以正常使用 yum 安装yum install -y kernel kernel-devel kernel-headers注意我在这里把本地仓库的gpgcheck设成了 0因为本地仓库已经经过一次校验包是可信的。如果对安全要求高也可以用gpgcheck1并配置对应 GPG 密钥但那样步骤会复杂不少离线环境一般用不到。6.3 第三步安装并设置默认启动内核安装完成后重启机器前先确认新内核是否出现在引导列表中。CentOS 7 上查看awk -F\ $1menuentry {print $2} /etc/grub2.cfgCentOS 8/9 上使用grubby --infoALL | grep -E ^kernel|^index如果希望重启后默认进入新内核CentOS 7 可以用grub2-set-default 0 grub2-mkconfig -o /boot/grub2/grub.cfgCentOS 8/9 可以用grubby --set-default /boot/vmlinuz-$(ls /boot/vmlinuz-* | sort -V | tail -1)这个步骤经常被忽略结果重启后还是进了老内核以为升级失败了其实是默认引导项没有设置。我建议升级内核后先不急着设默认而是手动重启进新内核验证应用是否正常确认没问题再改默认引导这样回滚也方便。7. 下载后的校验与常见坑防止拿到坏包或装不上下载完并不意味着结束我见过太多人因为跳过校验环节在安装时踩各种莫名其妙的坑。这里把最常见的几个问题集中列一下。7.1 RPM 包签名和完整性校验从网上下载的 RPM第一件事是用 rpm 命令校验签名和完整性rpm -K kernel-3.10.0-1160.119.1.el7.x86_64.rpm输出类似kernel-3.10.0-1160.119.1.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK看到OK才说明包没有被篡改或者下载损坏。如果显示MISSING KEYS说明本机没有导入对应的 GPG 公钥可以先导入官方密钥再校验rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7对于 ELRepo 的包导入 ELRepo 的公钥后同样可以校验。完整性校验还有一个更直接的参数用md5sum或者检查文件大小是否和仓库元数据一致。不过rpm -K已经包含 md5 校验一般够用了。7.2 检查包版本和架构是否匹配下载完成后用rpm -qpi查看包的详细信息重点检查 Version、Release、Architecture 三项rpm -qpi kernel-3.10.0-1160.119.1.el7.x86_64.rpm输出里能看到Name : kernel Version : 3.10.0 Release : 1160.119.1.el7 Architecture: x86_64这里最容易踩的坑是架构不匹配。你在 x86_64 的机器上下载了 i686 的包或者干脆下载错了平台安装时报wrong architecture。另一个坑是版本不匹配比如目标机器是 CentOS 7你下载了 CentOS 8 的内核 RPM安装时大概率报依赖冲突。判断一个 RPM 属于哪个大版本可以看 Release 字段里的 el7、el8、el9 标识。1160.119.1.el7就代表它是 CentOS 7 的包el8开头则对应 CentOS 8以此类推。7.3 下载失败常见的三个原因第一URL 404。这个最频繁尤其是用老教程里的镜像地址。解决办法是回到第 4 节讲过的目录规则先用 repoquery 查询准确的 RPM 文件名再去对应目录找。不要凭记忆拼 URL。第二--resolve后下载了大量无用依赖包导致目录里有几百个 RPM。我见过有人把 /root 目录空间直接占满的情况。建议下载前先确认目标目录空间足够用df -h看磁盘再使用--destdir指定目录并定期清理。第三网络原因导致下载中断。遇到这种情况用 wget 加-c断点续传或者换 axel 多线程下载。但中断后的 RPM 文件很可能不完整下载完必须重新执行rpm -K校验这点不能偷懒。我个人的习惯是把下载、校验、归档这三步做成一个小脚本。每次下载完自动跑rpm -K校验没问题就移动到/srv/rpm-store/目录按版本归档下次需要时直接复用省得重复下载。比如这样一个简单片段#!/bin/bash DESTDIR/root/kernel-packages mkdir -p $DESTDIR yumdownloader kernel kernel-devel --resolve --destdir$DESTDIR cd $DESTDIR for rpm in *.rpm; do rpm -K $rpm || echo 校验失败: $rpm done有了这套流程不管是 CentOS 7 的存量机器还是 CentOS 9 Stream 的新环境下载内核安装包这件事都不再是靠运气碰。最后再分享一个小技巧如果你需要在多台机器之间复制内核包目录直接用 tar 打包比逐文件复制更省事还能通过 sha256sum 一次性校验所有文件。离线场景下我通常是把打包文件传到目标机器解压后用本地仓库方式安装效率和成功率都远超手工 rpm 安装。