十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 7.9离线镜像源搭建:从reposync到内网yum仓库全攻略

CentOS 7.9离线镜像源搭建:从reposync到内网yum仓库全攻略 简介CentOS 7.9 离线镜像源打包了操作系统安装与更新所需的全部软件包及元数据面向需要在无互联网环境部署、维护系统的运维工程师。资源共150个文件核心为143个rpm软件包并附带3个xml元数据、3个gz压缩包和3个bz2数据库索引如primary、filelists、other整体约155.55MB其中可见kernel-ml、ansible、ceph-common等常用组件适合快速搭建本地YUM仓库。压缩包内包含repodata及x86_64等目录结构可直接配置离线yum源通过依赖解析实现批量安装与升级有效解决内网服务器无法在线获取软件包的问题。已有1834人学习适合具备基础Linux操作经验、正在规划离线源或实施内网Ceph、自动化部署等场景的运维与开发人员参考。1. 隔离网环境里的蛋疼时刻为什么要折腾离线镜像源在生产环境摸爬滚打久了你迟早会遇到这么一台机器机房里的CentOS 7.9服务器出于安全合规要求不能连外网但业务上线前要装一堆依赖包比如gcc、openssl-devel、python3甚至数据库驱动。上一任运维留下一句“你找找安装光盘”就消失了。你把CentOS 7.9的ISO挂载上mount /dev/cdrom /mnt配置个本地源发现基础包能用但想装epel里的htop、jq或者某个软件需要的新版依赖直接傻眼。这就是离线镜像源存在的意义不是简单塞一个ISO进去而是把官方yum仓库完整地“搬”到内网让它变成一台能持续提供软件包、能解决依赖关系的小型镜像站。之后内网所有机器都指向它yum install照常工作跟连外网体验几乎一致。这篇文章我会把从零搭一台CentOS 7.9离线镜像源的完整过程写清楚包括外网下载同步、内网服务器托管、客户端配置、常见坑和排查思路。适合刚接手离线环境的运维新手也适合想完善内部yum仓库体系的老手。看完你就能照着在自己的网络里复刻一套。2. 动手前先想清楚版本、仓库和同步策略2.1 选择CentOS 7.9还是“大版本号”很多人以为指定了“centos7.9”就够了但现实中yum仓库的长期支持机制很微妙。CentOS 7的所有小版本都会汇总到同一个7仓库目录里你配好源后拿到的是当前镜像站提供的最新7.9包。换句话说内网环境如果要求严格锁定到某个具体小版本比如7.9.2009需要在同步时锁定对应的repoid和镜像快照而不是直接同步base/7/x86_64这种滚动路径。实际操作中我建议直接同步base/7/x86_64然后确保安装的centos-release包是7.9.2009版本。因为安全更新只跟随大版本号如果你非要锁死7.6反而会错过很多安全补丁而且内网一旦出现新硬件驱动需求旧版本会缺模块。2.2 要同步哪几个仓库base、extras、updates是底线epel按需CentOS 7.9的标准仓库分为三块base安装介质里的基础包覆盖绝大部分核心工具。extras一些不在base里的额外包比如centos-release-scl。updates安全更新和Bug修复强烈建议同步。如果你只想让内网机器能正常用yum装基础软件这三个就够。想装更多第三方软件再加入EPEL仓库。EPEL是Fedora社区维护的高质量软件包仓库依赖关系处理得挺好但体积不小同步时间会长一些。除了EPEL有些开发环境还需要centos-release-scl软件集合或者remiPHP相关这取决于你的业务不要一股脑全同步。镜像源体积每大一分后期同步维护就多一分成本按需规划才合理。2.3 同步频率和增量逻辑外网同步不是只做一次离线环境也需要定期更新安全补丁。我的习惯是每周用脚本做一次增量同步只拉取变化的部分。yum仓库在设计上支持增量同步因为每个rpm包都是独立文件只要下载新增或更新的包然后用createrepo --update重新生成索引就行。这比每次全量同步节省大量流量和时间。3. 在能联网的机器上制作仓库reposync createrepo实战下面这段是核心操作你在外网有一台能访问官方镜像站的Linux机器CentOS 7或8都行甚至Ubuntu也可以但命令略有差异用它下载所有RPM包制成离线仓库最后目录整体拷进内网。3.1 安装需要用到的工具在制作机上执行yum install -y yum-utils createrepoyum-utils提供reposync和yumdownloader。createrepo用于生成仓库元数据也就是repodata目录。如果你要同步EPEL制作机需要先装epel-release并把epel.repo里的enabled1。3.2 reposync同步base、extras、updates先建好目录结构我用/data/centos/7作为根目录mkdir -p /data/centos/7/{base,extras,updates}/x86_64/Packages createrepo /data/centos/7/base/x86_64/Packages createrepo /data/centos/7/extras/x86_64/Packages createrepo /data/centos/7/updates/x86_64/Packages顺序建议先创建空仓库再同步避免某些工具在目录不存在时报错。同步命令reposync -r base -p /data/centos/7/base/x86_64/Packages --repoidbase reposync -r extras -p /data/centos/7/extras/x86_64/Packages --repoidextras reposync -r updates -p /data/centos/7/updates/x86_64/Packages --repoidupdates注意这里有个坑-p指定的目录应该是“包文件所在目录”不是仓库根目录。如果路径飘了createrepo生成索引时会找不到包。更稳妥的做法是直接同步到/data/centos/7/base/x86_64/因为reposync会自己创建Packages子目录。命令改成reposync -r base -p /data/centos/7/base/x86_64 --repoidbase reposync -r extras -p /data/centos/7/extras/x86_64 --repoidextras reposync -r updates -p /data/centos/7/updates/x86_64 --repoidupdates同步过程会打印每个包的下载状态耗时取决于网络和仓库大小。base大概10GB左右updates可能更大。建议用screen或者tmux挂在后台避免SSH断开导致中断。3.3 生成repodata索引下载完成后在对应目录下执行createrepo /data/centos/7/base/x86_64 createrepo /data/centos/7/extras/x86_64 createrepo /data/centos/7/updates/x86_64如果是增量同步使用createrepo --update /data/centos/7/base/x86_64--update只解析新增和变化的包速度极快。注意必须在包文件全部同步完成后执行否则生成的元数据不完整。3.4 同步EPEL仓库EPEL的repoid是epelreposync -r epel -p /data/centos/7 --repoidepel createrepo /data/centos/7/epelEPEL仓库里存在多个架构目录如x86_64、SRPMS等reposync会拉取全部。如果只想同步x86_64的包可以用--archx86_64过滤减少体积。3.5 检查同步结果的正确性同步完毕后检查几个点每个仓库根目录下有repodata目录里面有repomd.xml文件。Packages目录或仓库目录下有大量rpm包。包数量可以通过find /data/centos/7 -name *.rpm | wc -l统计。然后把这个/data/centos/7目录完整拷贝到离线服务器可以使用U盘、移动硬盘或者直接通过内网传输。拷贝时注意目录权限至少保证其他用户可读chmod -R 755 /data/centos4. 在内网服务器上发布镜像源HTTP服务与客户端repo配置4.1 为什么用HTTP而不是直接挂本地磁盘很多新手直接把仓库目录用file://协议给本机用这没问题但如果你的内网有多台机器总不能让每台都插一块硬盘。用HTTP服务统一发布其他机器通过http://镜像服务器IP/centos/7/...访问是最成熟、最省事的方案。Nginx和Apache都行我用的是Nginx配置轻量、并发能力更强。安装Nginx如果这台服务器也没有外网那就用前面拷贝来的仓库先通过file://装好Nginxyum install -y nginx修改Nginx配置增加一个server块root指向仓库根目录server { listen 80; server_name mirror.internal; root /data/centos; autoindex on; autoindex_exact_size off; autoindex_localtime on; }注意autoindex on很重要没有它客户端访问目录时看不到文件列表虽然yum下载具体rpm不受影响但浏览器测试时会一脸懵。启动服务systemctl start nginx systemctl enable nginx如果防火墙没关记得放行80端口firewall-cmd --permanent --add-servicehttp firewall-cmd --reload最后用浏览器访问http://镜像服务器IP/centos/7/能看到base、extras、updates目录列表说明发布成功。4.2 客户端repo文件怎么配才不出错在需要使用镜像源的内网机器上进入/etc/yum.repos.d/建议先禁用官方源再写自己的repocd /etc/yum.repos.d/ mkdir backup mv *.repo backup/然后新建offline.repo[base] nameCentOS-7 - Base baseurlhttp://镜像服务器IP/centos/7/base/x86_64/ enabled1 gpgcheck0 [extras] nameCentOS-7 - Extras baseurlhttp://镜像服务器IP/centos/7/extras/x86_64/ enabled1 gpgcheck0 [updates] nameCentOS-7 - Updates baseurlhttp://镜像服务器IP/centos/7/updates/x86_64/ enabled1 gpgcheck0这里我直接把gpgcheck0了因为在离线环境里要导入GPG密钥还得额外配置如果仓库是从官方源同步的包本身可信关闭校验能避免很多麻烦。但如果你对安全有强要求可以做gpgcheck1并配置gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7然后确保离线服务器上有这个密钥文件。4.3 配置后必须做的缓存清理和验证改完repo文件执行yum clean all yum makecachemakecache会去每个repo的repodata/repomd.xml下载元数据并建立缓存。看到base、extras、updates都成功提示说明源没问题。接着试装一个包yum install -y htop如果epel也同步了再试试yum install -y jq能正常装就说明依赖解析、下载都通了。5. 离线镜像源常见坑从GPG到hostid一次说清楚5.1 GPG密钥报错与解决方案前面提到gpgcheck0但有些人还是会在makecache或安装时遇到Public key for xxx.rpm is not installed原因是RPM包头部带有GPG签名而系统的/etc/pki/rpm-gpg/下没有对应公钥。想保持gpgcheck1的话两步解决rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7前提是离线服务器上有这两个文件。同步仓库时可以把它们也复制过来放到/etc/pki/rpm-gpg/目录。5.2 依赖冲突和版本锁定问题离线环境最烦的是某些软件需要特定版本的依赖包而你的仓库里只有最新版。比如libpng版本不匹配装A软件需要libpng-1.2仓库只有libpng-1.5。这时候要么用yumdownloader下载指定版本要么在仓库里同时保留多个版本。我的经验是对于关键业务环境除了同步base/updates外再准备一个“手工补充仓库”用yumdownloader --resolve下载缺失的依赖包放进一个单独目录用createrepo生成索引然后在repo文件中启用它。这样最灵活。mkdir /data/centos/7/custom/x86_64/Packages yumdownloader --resolve --destdir /data/centos/7/custom/x86_64/Packages libpng-1.2.so createrepo /data/centos/7/custom/x86_64客户端repo里加一段[custom] nameCustom Packages baseurlhttp://镜像服务器IP/centos/7/custom/x86_64/ enabled1 gpgcheck0用这种“官方源自定义源”的组合能覆盖绝大多数奇怪依赖。5.3 hostid与离线环境里的软件授权很多商业软件比如数据库、中间件在离线环境申请License时要提供机器的hostid。hostid是系统生成的一个唯一字符串用来标识物理主机。你可以用hostid命令直接查看hostid输出类似f6080200。有些软件会用ip addr的mac地址或者dmidecode的UUID做授权标识用法类似。这里想提醒的是如果你在制作离线镜像源时拷贝了一台虚拟机的仓库目录但实际安装包的是另一台机器这不会影响hostid因为hostid是运行时生成的与仓库无关。但如果你用克隆虚拟机可能产生相同的hostid导致两台机器License冲突。遇到这种情况复制镜像前要重新生成hostid可以用/usr/bin/hostid设置或者编辑/etc/machine-id但更省事的做法是在模板机上清理/etc/machine-id和/var/lib/dbus/machine-id让每台新机器首次启动时自动生成。5.4 同步中断恢复与增量同步外网同步到一半断网是经常的事。reposync本身支持断点续传吗它内部调用yum下载一般不会自动续传需要重跑。为了避免重复下载可以在同步命令中加入--downloadcomps等参数但更实用的是用--newest-only和--delete配合reposync -r base -p /data/centos/7/base/x86_64 --delete --newest-only--newest-only只下载每个包的最新版本能省流量。--delete会删除本地仓库里远端已经不存在的包确保仓库整洁。断线后重新执行同一条命令已经下载的包会跳过yum会检查本地文件这种方式比任何断点工具都靠谱。5.5 外网同步时常用的“小抄”整理一个我自己常用命令的简表操作命令查看仓库列表yum repolist仅同步某架构包reposync -r epel -p /data/centos/7 --archx86_64下载某具体依赖yumdownloader --resolve --destdir/tmp/pkg openssl-devel重新生成增量索引createrepo --update /data/centos/7/base/x86_64客户端清理缓存yum clean all yum makecache6. 从零开始到能用这份检查清单帮我少踩坑最后分享一个自己每次搭完离线镜像源都过一遍的检查清单照着走基本不会翻车仓库目录是否包含repodatals /data/centos/7/base/x86_64/里能看到。Nginx是否启动curl -I http://127.0.0.1/centos/7/是否返回200。防火墙上是否放行了80端口。客户端repo文件里的baseurl路径是否写对注意末尾/不能漏。yum makecache后是否报错特别是GPG密钥相关错误。用一个非基础软件如htop测试能否安装并且能自动解决依赖。如果内网有多个网段确认镜像服务器路由可达且没有额外防火墙隔离。我在生产中维护这套离线源已经几年了期间踩过最大的坑就是同步时忘了加--delete结果仓库里累积了大量旧版本rpm客户端因为依赖锁定缓存了旧元数据导致同一软件出现多个候选版本安装时被依赖解析绕晕。后来养成了每次同步后都顺手跑yum clean all的习惯客户端这边也要求所有机器在安装前清除一次缓存。还有一个小技巧离线源可以定期只同步updates仓库因为base和extras基本不变增量同步时用--updates参数能进一步减小负载。具体来说就是只对updates执行reposyncbase和extras保持一个月同步一次即可。这套方案不只是给CentOS 7.9用同样的思路迁移到Rocky Linux、AlmaLinux甚至Ubuntu也可以只要把仓库同步工具换成对应发行版的Ubuntu用apt-mirror或debmirror骨架是完全一致的。对于隔离网络谁手里有源谁就有了安装一切软件的基础能力。希望这篇文章能让你手头的离线服务器不再“孤立无援”。本文还有配套的精品资源点击获取
返回列表