一、为什么需要自建YUM仓库镜像

很多运维同学都遇到过这样的尴尬:公司内网的服务器需要安装软件包,但官方源下载速度慢如蜗牛,清华、阿里等国内镜像源又经常出现部分包缺失的情况。这时候最好的解决方案就是——自己搭建一个本地YUM仓库镜像。

自建镜像的好处很明显:

  1. 内网下载速度飞起,再也不用忍受外网限速
  2. 可以自由选择稳定版本,避免自动更新带来的风险
  3. 完全掌控依赖关系,解决"这个包怎么又找不到"的问题
  4. 安全合规,所有软件包都经过内部审核

二、准备工作与环境搭建

(技术栈:CentOS 7 + reposync工具)

首先确保你的服务器满足以下条件:

  • 至少100GB可用磁盘空间(建议500GB以上)
  • 能正常访问外网(至少能连接阿里云/清华镜像站)
  • 已安装createrepo和yum-utils工具

安装基础工具包:

# 安装必要工具
sudo yum install -y yum-utils createrepo epel-release

# 创建存储目录(建议放在大容量分区)
sudo mkdir -p /data/yum_repo/centos/7/{os,updates,extras}

三、完整镜像同步实战

3.1 基础镜像同步

我们先从阿里云镜像站同步CentOS 7的基础仓库:

# 同步base源(约20GB)
sudo reposync --repoid=base --newest-only --download-metadata \
    --download-path=/data/yum_repo/centos/7/os/ \
    --norepopath

# 同步updates源(约15GB)  
sudo reposync --repoid=updates --newest-only --download-metadata \
    --download-path=/data/yum_repo/centos/7/updates/ \
    --norepopath

# 创建仓库元数据
sudo createrepo /data/yum_repo/centos/7/os/
sudo createrepo /data/yum_repo/centos/7/updates/

3.2 EPEL仓库同步

企业常用的EPEL仓库同步方法:

# 先添加EPEL源配置
sudo wget -O /etc/yum.repos.d/epel.repo \
    http://mirrors.aliyun.com/repo/epel-7.repo

# 同步EPEL仓库(约30GB)
sudo reposync --repoid=epel --newest-only --download-metadata \
    --download-path=/data/yum_repo/epel/7/ \
    --norepopath

# 生成元数据
sudo createrepo /data/yum_repo/epel/7/

3.3 定时同步脚本

为了避免手动操作,我们可以创建自动同步脚本:

#!/bin/bash
# 自动同步脚本:sync_yum.sh
REPO_DIR="/data/yum_repo"
LOG_FILE="/var/log/yum_sync.log"
MIRRORS=("base" "updates" "extras" "epel")

echo "$(date) 开始同步YUM仓库" >> $LOG_FILE

for repo in ${MIRRORS[@]}; do
    echo "$(date) 正在同步 $repo..." >> $LOG_FILE
    reposync --repoid=$repo --newest-only --download-metadata \
        --download-path=$REPO_DIR/centos/7/$repo/ \
        --norepopath >> $LOG_FILE 2>&1
    
    createrepo $REPO_DIR/centos/7/$repo/ >> $LOG_FILE 2>&1
done

echo "$(date) 同步完成" >> $LOG_FILE

设置定时任务(每天凌晨3点执行):

sudo chmod +x /root/sync_yum.sh
sudo crontab -e
# 添加以下内容
0 3 * * * /root/sync_yum.sh

四、配置Nginx提供HTTP访问

同步好的仓库需要通过Web服务共享:

# 安装Nginx
sudo yum install -y nginx

# 创建配置文件
sudo tee /etc/nginx/conf.d/yum.conf <<-'EOF'
server {
    listen       80;
    server_name  yum.yourcompany.com;
    root         /data/yum_repo;
    
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    
    location / {
        try_files $uri $uri/ =404;
    }
}
EOF

# 启动服务
sudo systemctl start nginx
sudo systemctl enable nginx

五、客户端配置使用本地源

其他服务器要使用这个本地源,只需修改repo文件:

# 备份原有repo文件
sudo mkdir /etc/yum.repos.d/bak
sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/

# 创建本地repo配置
sudo tee /etc/yum.repos.d/local.repo <<-'EOF'
[local-base]
name=Local CentOS Base
baseurl=http://yum.yourcompany.com/centos/7/os/
enabled=1
gpgcheck=0

[local-updates]
name=Local CentOS Updates
baseurl=http://yum.yourcompany.com/centos/7/updates/
enabled=1
gpgcheck=0

[local-epel]
name=Local EPEL
baseurl=http://yum.yourcompany.com/epel/7/
enabled=1
gpgcheck=0
EOF

# 测试使用
sudo yum clean all
sudo yum makecache

六、常见问题解决方案

6.1 磁盘空间不足

如果同步过程中报磁盘空间错误,可以通过以下方式解决:

  1. 使用--newest-only参数只同步最新版本
  2. 添加--delete参数删除本地已不存在的包
  3. 定期清理旧版本包(建议保留最近3个版本)

6.2 同步速度慢

优化方法:

  1. 选择离你最近的镜像站(阿里云/清华/腾讯云)
  2. 使用--downloadcomps参数并行下载
  3. 限制带宽避免影响业务:--limit-rate=2M

6.3 依赖关系错误

如果出现依赖问题:

  1. 确保同步了所有相关仓库(base、updates、extras等)
  2. 检查createrepo是否成功生成元数据
  3. 使用yum deplist命令检查具体依赖关系

七、进阶技巧

7.1 选择性同步

如果只需要特定软件包,可以使用--package参数:

# 只同步nginx相关包
reposync --repoid=epel --package=nginx* \
    --download-path=/data/yum_repo/custom/

7.2 版本锁定

为了防止自动更新导致问题,可以固定版本:

# 在客户端配置中添加
exclude=kernel* php* mysql*

7.3 增量同步

使用--newest-only--download-metadata参数可以实现增量同步,只下载新增的包。

八、技术方案对比

方案 优点 缺点 适用场景
完整镜像 包最全 占用空间大 需要完整环境
增量同步 节省空间 可能漏包 日常更新
选择性同步 最节省空间 依赖可能不全 特定软件需求

九、安全注意事项

  1. 仓库服务器应该放在内网,通过防火墙限制访问
  2. 定期检查软件包签名(虽然我们禁用了gpgcheck)
  3. 保留至少两份备份,防止误删
  4. 监控磁盘使用情况,设置自动告警

十、总结与建议

自建YUM仓库是个一劳永逸的解决方案,特别适合:

  • 服务器数量超过20台的企业环境
  • 需要严格管控软件版本的金融/政府机构
  • 外网访问受限的生产环境

建议初次搭建时:

  1. 先做小规模测试(同步部分仓库)
  2. 记录完整的操作步骤
  3. 制定定期维护计划(清理、备份等)

最后提醒:记得定期更新你的本地镜像,建议至少每周同步一次,确保安全补丁能及时推送到所有服务器。