☰
CentOS 7.9 内网离线 yum 源搭建实战:从 ISO 挂载到 HTTP 共享
2026/10/14 22:36:17 网站建设 项目流程

简介:CentOS 7.9 离线镜像源面向无外网环境下的运维与系统管理员,用于在隔离网络中完成系统安装、软件包更新与依赖处理。资源包共150个文件,以143个rpm软件包为主体,另含3个gz、3个bz2及1个xml,涵盖repodata元数据与x86_64架构包,压缩包约155.55MB,解压后可直接配置本地YUM仓库。内容包含kernel-ml、ansible、ceph-common、ceph-osd等常用组件,并附带primary、filelists、other等sqlite与xml元数据文件,便于通过--disablerepo与--enablerepo参数指定本地源完成安装升级。已有1857人学习下载,适合需要构建离线仓库、处理版本兼容与依赖关系、规划存储备份的运维人员参考,可帮助快速搭建可用的内网软件源环境。

1. 内网装 CentOS 7.9 那晚,我被 yum 源坑到凌晨三点

机房断网,一台刚装好的 CentOS 7.9 最小化系统躺在机架上,yum install敲下去转了三圈,最后甩出一行Could not resolve host: mirrorlist.centos.org。这不是网络故障,是这台机器压根没打算连公网。CentOS 7.9 是 7 系列最后一个版本,2024 年 6 月 30 日官方维护周期结束后,连公网源都陆续下线了,很多内网环境还在跑这个版本,装个gcc、vim、net-tools都得靠离线镜像源兜底。所谓离线镜像源,就是把官方仓库的 RPM 包和元数据完整搬到本地,用file://或http://方式让 yum 直接读本地目录,不碰外网。适合谁?管着隔离网段、军工级内网、生产环境不允许出网的运维和开发。这篇不讲虚的,从镜像怎么选、目录怎么摆、repo 文件怎么写,到踩过的坑,一次说清。

2. 离线镜像源的本质:把 repodata 和 RPM 一起搬回家

2.1 为什么不能只拷 RPM 包

很多人第一次做离线源,思路是「把需要的 rpm 全下载到一个文件夹,然后yum localinstall *.rpm」。小批量还行,一旦依赖超过三层就翻车——A 依赖 B,B 依赖 C,C 又依赖特定版本的 D,手动追依赖能追到怀疑人生。yum 之所以能自动解依赖,靠的是仓库里的repodata目录,里面存着primary.xml.gz、filelists.xml.gz、other.xml.gz和repomd.xml,记录了每个包的名称、版本、依赖关系、文件列表。没有 repodata,yum 就退化成rpm -ivh,依赖全靠自己扛。

所以离线镜像源的最小完整单元是:RPM 包 + repodata 元数据 + 一个指向它的 .repo 文件。三者缺一不可。只拷 RPM 不拷 repodata,yum 认不出这个仓库;拷了 repodata 但 RPM 不全,安装时照样报Error: Package xxx requires yyy。

2.2 镜像来源的三种选择

CentOS 7.9 的离线镜像,常见来源有三类,各有适用场景:

来源获取方式体积适用场景
官方 ISO 镜像下载CentOS-7-x86_64-Everything-2009.iso约 10GB一次性全量,适合新建内网源
官方 vault 归档从归档站点同步7.9.2009/os/x86_64/约 8-10GB需要与官方仓库完全一致
按需下载用yumdownloader或reposync只拉需要的包几百 MB 起只装特定软件,节省空间

我一般推荐第一种:Everything ISO 里已经包含了 Base、Updates、Extras 等所有仓库的 RPM 和 repodata,挂载后直接当本地源用,省去同步的麻烦。如果内网机器多、需要长期维护,就用reposync定期从归档同步,保持和上游一致。

2.3 挂载 ISO 并验证 repodata 完整性

拿到 ISO 后,第一步是挂载并确认 repodata 存在:

# 创建挂载点 mkdir -p /mnt/centos79-iso # 挂载 Everything ISO mount -o loop /data/iso/CentOS-7-x86_64-Everything-2009.iso /mnt/centos79-iso # 确认 repodata 目录存在 ls /mnt/centos79-iso/repodata/ | head -5 # 确认 RPM 包数量(Everything ISO 大约 10000+ 个包) ls /mnt/centos79-iso/Packages/ | wc -l

mount -o loop把 ISO 文件当块设备挂载,-o loop是回环设备选项,不加会报mount: /mnt/centos79-iso: wrong fs type。repodata目录下应该有repomd.xml和若干.xml.gz文件,如果为空,说明 ISO 下载不完整,重新校验 SHA256。Packages目录下的 RPM 数量是判断镜像完整性的直观指标,Everything ISO 正常在 10000 个以上,明显偏少就是残缺镜像。

提示:挂载后的 ISO 是只读的,不能直接往里写新 RPM。如果需要追加自定义包,先把整个目录rsync到本地磁盘,再对本地副本操作。

3. 配置本地 yum 源:repo 文件写对,依赖自动解

3.1 备份并禁用默认仓库

CentOS 7.9 默认在/etc/yum.repos.d/下有一堆.repo文件,指向已经失效的公网源。不清理它们,yum 会先尝试联网,超时后才走本地源,每次安装都卡半天。

# 创建备份目录 mkdir -p /etc/yum.repos.d/backup # 把所有默认 repo 文件移入备份目录 mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/ # 确认当前目录下没有残留的 repo 文件 ls /etc/yum.repos.d/

mv而不是rm,是为了留后悔药——万一本地源配错了,还能把默认文件移回来排查。CentOS-*.repo通配符覆盖了CentOS-Base.repo、CentOS-Sources.repo等所有官方仓库文件。执行完ls应该只剩backup目录,干净的环境是后续排错的前提。

3.2 编写本地 repo 文件

在/etc/yum.repos.d/下新建local-centos79.repo:

[local-centos79] name=CentOS 7.9 Local Repository baseurl=file:///mnt/centos79-iso enabled=1 gpgcheck=0 cost=1000

逐项说明:[local-centos79]是仓库 ID,必须唯一,yum 用它区分不同源;baseurl指向挂载点,file://后面跟绝对路径,三个斜杠不能少(file:///表示本地文件系统根路径);enabled=1启用该仓库;gpgcheck=0关闭 GPG 签名校验,内网环境通常不需要,如果开启需要提前导入 RPM-GPG-KEY;cost=1000是优先级权重,数值越大优先级越低,当有多个源时 yum 优先选 cost 小的,这里设大值确保本地源不会被其他源抢占。

如果 ISO 挂载在别的机器上,想通过 HTTP 共享给整个内网,把baseurl改成http://内网IP/centos79,然后在提供 ISO 的机器上起一个 Nginx 或python -m http.server即可。

3.3 刷新缓存并验证

repo 文件写好后,必须清缓存再重建,否则 yum 读的还是旧元数据:

# 清除所有缓存 yum clean all # 重建缓存,这一步会读取 repodata yum makecache # 查看仓库列表,确认 local-centos79 已加载 yum repolist all # 测试安装一个常用包 yum install -y net-tools

yum clean all清掉/var/cache/yum/下的旧数据,yum makecache重新解析 repodata 并生成缓存。yum repolist all输出里应该能看到local-centos79状态为enabled,包数量在 10000 左右。最后用net-tools这种小包做冒烟测试,安装成功说明整条链路通了。如果makecache报Cannot find a valid baseurl,九成是baseurl路径写错或 ISO 没挂载。

注意:yum makecache在包数量多时可能耗时 1-2 分钟,属正常现象,不要中途 Ctrl+C,否则缓存不完整会导致后续安装报元数据错误。

4. 离线源进阶玩法:HTTP 共享、reposync 增量同步与优先级控制

4.1 用 HTTP 把本地源共享给整个内网

单机挂 ISO 只能解决一台机器的问题。内网几十台机器都这么干,每台都要挂载 ISO,浪费磁盘和人力。更合理的做法是找一台机器做源服务器,把 ISO 内容解压到磁盘,用 HTTP 暴露出去。

# 在源服务器上创建仓库根目录 mkdir -p /var/www/centos79 # 把 ISO 内容同步到磁盘(保留权限和时间戳) rsync -av /mnt/centos79-iso/ /var/www/centos79/ # 用 Python 快速起一个 HTTP 服务(临时方案) cd /var/www/centos79 && python -m http.server 8080 & # 或者用 Nginx(长期方案) # 在 nginx.conf 的 server 块中配置 root /var/www/centos79;

rsync -av的-a保留权限、时间戳、符号链接,-v输出详细过程。同步完成后/var/www/centos79就是完整的仓库副本。Python 的http.server适合临时验证,生产环境用 Nginx,并发和稳定性更好。客户端机器的 repo 文件改成baseurl=http://源服务器IP:8080,其余配置不变。

4.2 reposync 做增量同步

如果不想每次下载完整 ISO,可以用reposync从归档站点按需同步,只拉新增或变更的包:

# 安装 reposync 工具(属于 yum-utils 包) yum install -y yum-utils # 创建一个指向归档的临时 repo 文件 cat > /etc/yum.repos.d/vault.repo << 'EOF' [vault-centos79] name=CentOS 7.9 Vault baseurl=http://归档地址/centos/7.9.2009/os/x86_64/ enabled=1 gpgcheck=0 EOF # 同步到本地目录,-n 只下载最新的包,-d 删除本地已不存在的包 reposync -n -d -p /var/www/centos79 -r vault-centos79 # 同步完成后重建 repodata createrepo -v /var/www/centos79

reposync -n表示只下载最新版本,避免拉一堆历史版本占空间;-d删除本地有但上游已移除的包,保持一致性;-p指定下载目录;-r指定仓库 ID。同步完成后必须用createrepo重新生成 repodata,因为 reposync 只拉 RPM,不会自动更新元数据。createrepo会扫描目录下所有 RPM,生成新的repodata,这一步在包多时可能跑几分钟。

4.3 多源优先级与 cost 参数

内网环境往往不止一个源:本地 Everything 源、自定义软件源、EPEL 镜像等。多个源同时启用时,同一个包可能在多个源里出现,yum 默认选版本最高的,但版本相同的情况下按cost值决定优先级。

[local-centos79] name=CentOS 7.9 Local baseurl=file:///mnt/centos79-iso enabled=1 gpgcheck=0 cost=1000 [custom-tools] name=Custom Tools baseurl=http://内网IP/custom-repo enabled=1 gpgcheck=0 cost=500

cost值越小优先级越高。上面配置里custom-tools的 cost 是 500,小于local-centos79的 1000,所以同名包优先从custom-tools取。这个机制在需要覆盖官方包版本时特别有用——比如自定义源里放了更新版的openssl,希望优先用它,就把 cost 调低。

提示:cost只在包版本相同或未指定版本时生效。如果yum install明确指定了版本号,yum 会直接找匹配版本,不受 cost 影响。

5. 离线源避坑实录:五个让我重装系统的血泪教训

5.1 现象:yum makecache报repomd.xml: [Errno 14] curl#37 - Couldn't open file

原因:baseurl路径写错,或者 ISO 挂载点被卸载了。常见的是file://后面只写了两个斜杠,或者路径末尾多了空格。

解决:mount | grep centos79确认挂载存在;ls /mnt/centos79-iso/repodata/repomd.xml确认文件可读;检查 repo 文件里baseurl是否写成file:///mnt/centos79-iso(三个斜杠)。如果路径没问题,用yum clean all && yum makecache重试。

5.2 现象:安装包时提示Error: Package xxx requires yyy, but none of the providers can be installed

原因:ISO 里缺少某个依赖包。Everything ISO 虽然全,但某些第三方软件依赖的包不在官方仓库里,比如nginx依赖的gd库在 Extras 里,如果只挂了 Base 仓库就会缺。

解决:先确认缺的包名,用yum provides '*/yyy'查哪个仓库提供;如果本地源确实没有,从归档单独下载该 RPM 放进Packages目录,然后createrepo --update /mnt/centos79-iso更新元数据。注意 ISO 挂载点是只读的,需要先rsync到可写目录再操作。

5.3 现象:yum install卡在Determining fastest mirrors不动

原因:默认的fastestmirror插件还在尝试探测公网镜像,即使本地源已配置,插件仍会先跑一遍网络探测,内网环境下超时很久。

解决:禁用 fastestmirror 插件。编辑/etc/yum/pluginconf.d/fastestmirror.conf,把enabled=1改成enabled=0。或者直接在 yum 命令加--disableplugin=fastestmirror。更彻底的方式是yum remove yum-plugin-fastestmirror,但离线环境下卸载可能引发依赖问题,改配置更安全。

5.4 现象:createrepo执行后 repodata 目录为空

原因:createrepo默认只扫描当前目录下的 RPM,如果 RPM 放在子目录里(比如Packages/),需要加-o指定输出目录或进入 RPM 所在目录执行。

解决:cd /var/www/centos79/Packages && createrepo -o ../ .,-o ../把 repodata 生成到上级目录。或者用createrepo --update /var/www/centos79,--update会基于已有 repodata 增量更新,速度更快。执行后ls /var/www/centos79/repodata/应该能看到repomd.xml。

5.5 现象:客户端yum repolist显示仓库已启用,但包数量为 0

原因:HTTP 服务没起,或者防火墙拦了端口。baseurl指向http://IP:8080,但源服务器上python -m http.server进程挂了,或者firewalld没放行 8080。

解决:在源服务器上curl http://localhost:8080/repodata/repomd.xml确认服务正常;firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload放行端口;客户端用curl http://源IP:8080/repodata/repomd.xml测试连通性。如果 curl 能通但 yum 不行,检查 repo 文件里baseurl是否写成了https(HTTP 服务不支持)。

6. 把离线源做成可迁移的 tar 包:一次制作,到处复用

内网环境经常遇到「这台机器配好了,那台机器还要再来一遍」的情况。与其每台重复挂载、写 repo,不如把整个离线源打包成一个自包含的 tar 包,拷到新机器解压即用。

# 在源服务器上打包(排除 ISO 挂载点,只打包实际文件) tar -czf centos79-offline-repo.tar.gz \ -C /var/www centos79 \ --exclude='*.iso' # 查看包大小 du -sh centos79-offline-repo.tar.gz # 在新机器上解压到 /opt mkdir -p /opt && tar -xzf centos79-offline-repo.tar.gz -C /opt # 生成对应的 repo 文件 cat > /etc/yum.repos.d/local-centos79.repo << 'EOF' [local-centos79] name=CentOS 7.9 Offline baseurl=file:///opt/centos79 enabled=1 gpgcheck=0 EOF # 清缓存并验证 yum clean all && yum makecache && yum repolist

tar -czf的-C /var/www先切换目录再打包,这样包内路径是centos79/...而不是绝对路径,解压时更灵活。--exclude='*.iso'排除 ISO 文件,因为 ISO 内容已经解压到目录里了,再打包一份浪费空间。解压后用file:///opt/centos79作为baseurl,整个流程不依赖任何外部网络。

这个 tar 包我一般会放在内网文件服务器上,新机器部署时wget下来解压,三分钟搞定。从那以后我每次配离线源,都强制走一遍「打包 → 解压 → makecache → 装 net-tools 验证」的流程,不再相信「上次配好了这次应该没问题」的玄学。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询