超越光盘:构建企业级本地YUM源全攻略
在企业实际应用场景中,仅仅依赖操作系统安装光盘里的RPM软件包,往往捉襟见肘。一个更完善的方案是:将外网YUM源的全部软件包同步至本地。这不仅能极大地丰富本地软件仓库的包数量和完整性,更能让内网服务器在安装软件时彻底摆脱对外部网络的依赖,无需再临时申请开通网络权限。
一、同步外网YUM源概述
之前我们探讨过如何使用ISO光盘镜像在局域网内通过HTTP构建统一的YUM源服务器。对于软件版本要求不高或网络限制极为严格的封闭环境,光盘镜像方案简单可靠,完全可以投入生产。
然而,当面对更复杂的应用需求时,光盘自带的软件包就显得力不从心了。这时,将外网YUM源同步至本地就成了必然选择。它不仅能补齐软件生态,更关键的是,为内网环境提供了持续、稳定的软件供给能力。
获取外网YUM源软件包,常见方法有Rsync、Wget和Reposync三种。它们各有侧重:Rsync方式效率高,但要求外网源支持RSYNC协议;Wget则更为直接通用;而Reposync工具,可以说是为同步YUM源“量身打造”,能够兼容几乎所有的远程YUM仓库。下面,我们就以Reposync为例,手把手演示如何将阿里云YUM源同步到本地服务器。

二、服务器端构建YUM源操作步骤
1. 准备环境
本次操作基于CentOS 7.9操作系统进行演示。需要明确的是,以下步骤对于红帽系(RHEL、CentOS、Fedora等)操作系统是通用的。服务器端需要能够访问互联网,而客户端则模拟为无外网访问权限的内网服务器。
2. 添加阿里云YUM源
(1) 备份原有repo文件
[root@localhost ~]# mkdir /etc/yum.repos.d/backup
[root@localhost ~]# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
(2) 添加阿里云yum源
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
# 清除缓存并重新生成缓存
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache
简单说明一下:Centos-7.repo是基础软件仓库的配置文件,而epel-7.repo则提供了额外的扩展软件包(EPEL源),能极大丰富可安装软件的范围。
3. 安装相关软件
[root@localhost ~]# yum install -y httpd yum-utils createrepo
这几个软件的作用很关键:
- yum-utils:这是yum的工具包集合,如果不安装它,后续关键的
reposync同步工具将无法使用。 - createrepo:这个工具堪称本地仓库的“编目员”。它会对指定目录下的所有RPM文件进行扫描,并创建索引数据库。没有这个索引,yum命令就无法知晓仓库里有什么软件、以及它们的依赖关系。
- httpd:也就是Apache Web服务器,用于将我们同步好的软件目录通过HTTP协议发布出去,供内网客户端访问。当然,你也可以用Nginx来替代。
4. 创建repodata目录
[root@localhost ~]# mkdir /var/www/html/centos
这个目录用于存放同步下来的软件包。请注意,如果自定义了其他目录(而非/var/www/html/),别忘了同步修改Apache的配置文件httpd.conf中的DocumentRoot指令,指向你自定义的路径。
5. 同步阿里云yum源软件包到repodata目录
[root@localhost ~]# reposync -n --repoid=extras --repoid=updates --repoid=base --repoid=epel -p /var/www/html/centos/
......(1764/1766): zlib-static-1.2.7-21.el7_9.i686.rpm | 58 kB 00:00:00
(1765/1766): zlib-static-1.2.7-21.el7_9.x86_64.rpm | 58 kB 00:00:00
(1766/1766): zenity-3.28.1-2.el7_9.x86_64.rpm | 4.0 MB 00:00:01
这个过程需要一些耐心。由于需要同步的软件包数量庞大(以万计),耗时相对较长。根据服务器性能和网络状况,通常需要等待半小时或更久。配置更高的服务器自然会快一些。
参数简要解读:
-n:仅下载最新的软件包。-p:指定软件包下载到本地的目标目录。--repoid:指定要同步的仓库ID,可以指定多个。如果不指定,则会尝试同步本地配置的所有源。
同步完成后,可以查看一下成果:
[root@localhost ~]# du -sh /var/www/html/centos/*
9.0G /var/www/html/centos/base
16G /var/www/html/centos/epel
323M /var/www/html/centos/extras
3.4G /var/www/html/centos/updates
6. 运行createrepo来创建仓库索引
[root@localhost ~]# createrepo /var/www/html/centos/base
[root@localhost ~]# createrepo /var/www/html/centos/epel
[root@localhost ~]# createrepo /var/www/html/centos/extras
[root@localhost ~]# createrepo /var/www/html/centos/updates
7. 更新数据源
[root@localhost ~]# createrepo --update /var/www/html/centos/base
[root@localhost ~]# createrepo --update /var/www/html/centos/epel
[root@localhost ~]# createrepo --update /var/www/html/centos/extras
[root@localhost ~]# createrepo --update /var/www/html/centos/updates
对于首次搭建,这一步可以省略。它的主要用途在于后期维护:当阿里云源上的软件包有更新时,我们可以重新同步软件包,然后执行--update命令来更新本地仓库的索引,使其指向最新的软件版本。
8. 制作repo文件
这一步主要是为了方便客户端快速配置,属于“锦上添花”的操作,并非必须。
[root@localhost ~]# mkdir -p /var/www/html/repos/
[root@localhost ~]# cat >> /var/www/html/repos/CentOS.repo << EOF
[base]
name=CentOS-Base
failovermethod=priority
baseurl=https://10.10.10.100/centos/base/
enable=1
gpgcheck=0
[epel]
name=CentOS-Epel
failovermethod=priority
baseurl=https://10.10.10.100/centos/epel/
enable=1
gpgcheck=0
[extras]
name=CentOS-Extras
failovermethod=priority
baseurl=https://10.10.10.100/centos/extras/
enable=1
gpgcheck=0
[updates]
name=CentOS-Updates
failovermethod=priority
baseurl=https://10.10.10.100/centos/updates/
enable=1
gpgcheck=0
EOF
注意,请将上述配置中的IP地址10.10.10.100替换为你实际YUM源服务器的地址。
9. 启动HTTP服务
(1) 启动httpd服务
# 启动HTTP并设置开机自启动
[root@localhost ~]# systemctl enable --now httpd
# 查看httpd状态
[root@localhost ~]# systemctl status httpd
(2) 关闭防火墙和Selinux
为了保证客户端能正常访问,通常需要处理防火墙和SELinux。
# 关闭防火墙(生产环境请谨慎评估)
[root@localhost ~]# systemctl disable --now firewalld
# 或者,更安全的方式是只开放Apache使用的80端口
[root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
# 关闭Selinux(同样,生产环境需评估)
[root@localhost ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
# 临时关闭SeLinux(立即生效,无需重启)
[root@localhost ~]# setenforce 0
三、客户端使用yum源
1. 备份原有repo文件
[root@localhost ~]# mkdir /etc/yum.repos.d/backup
[root@localhost ~]# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
2. 获取yum源的两种方法
方法一:直接获取服务器端做好的repo文件
这是最快捷的方式,前提是服务器端已经完成了第8步。
# curl方式
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS.repo https://10.10.10.100/repos/CentOS.repo
# wget方式
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# wget https://10.10.10.100/repos/CentOS.repo
# 任选一种即可
方法二:在客户端手动创建repo文件
如果服务器端没有提供现成的repo文件,可以手动创建:
[root@localhost ~]# cat >> /etc/yum.repos.d/CentOS.repo << EOF
[base]
name=CentOS-Base
failovermethod=priority
baseurl=https://10.10.10.100/base/
enable=1
gpgcheck=0
[epel]
name=CentOS-Epel
failovermethod=priority
baseurl=https://10.10.10.100/epel/
enable=1
gpgcheck=0
[extras]
name=CentOS-Extras
failovermethod=priority
baseurl=https://10.10.10.100/extras/
enable=1
gpgcheck=0
[updates]
name=CentOS-Updates
failovermethod=priority
baseurl=https://10.10.10.100/updates/
enable=1
gpgcheck=0
EOF
日常工作中,强烈推荐使用方法一,简单、统一且不易出错,尤其适合批量部署。
3. 检查YUM仓库并测试
# 检查yum仓库
[root@localhost ~]# yum repolist
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
base | 2.9 kB 00:00:00
epel | 2.9 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/4): extras/primary_db | 136 kB 00:00:00
(2/4): base/primary_db | 6.1 MB 00:00:00
(3/4): epel/primary_db | 6.9 MB 00:00:00
(4/4): updates/primary_db | 2.1 MB 00:00:00
repo id repo name status
base CentOS-Base 10,072
epel CentOS-Epel 13,790
extras CentOS-Extras 278
updates CentOS-Updates 1,766
# 上面可以看到yum仓库信息说明已经设置成功了
# 安装软件包进行测试
[root@localhost ~]# yum install -y telnet
当软件能够成功安装时,就标志着你的内部YUM源已经构建成功,可以投入使用了。
至此,局域网内的其他服务器都可以通过上述两种方法之一,轻松配置并使用这个功能完整、包罗万象的本地YUM源了。
最后,分享两个实用的外网源使用技巧:
- 按需联网:构建仓库时服务器需要连接互联网,一旦同步完成,即可断开外网。这完全不影响内网客户端对本地仓库的使用,是兼顾便利与安全的好方法。
- 定期更新:可以制定计划任务,定期(例如每周或每月)让服务器联网,执行同步和索引更新操作,以获取安全补丁和新版本软件。更新完毕后再次断开外网,这样可以最大程度降低来自互联网的安全风险。
