一、为什么需要自建YUM仓库镜像
很多运维同学都遇到过这样的尴尬:公司内网的服务器需要安装软件包,但官方源下载速度慢如蜗牛,清华、阿里等国内镜像源又经常出现部分包缺失的情况。这时候最好的解决方案就是——自己搭建一个本地YUM仓库镜像。
自建镜像的好处很明显:
- 内网下载速度飞起,再也不用忍受外网限速
- 可以自由选择稳定版本,避免自动更新带来的风险
- 完全掌控依赖关系,解决"这个包怎么又找不到"的问题
- 安全合规,所有软件包都经过内部审核
二、准备工作与环境搭建
(技术栈: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 磁盘空间不足
如果同步过程中报磁盘空间错误,可以通过以下方式解决:
- 使用
--newest-only参数只同步最新版本 - 添加
--delete参数删除本地已不存在的包 - 定期清理旧版本包(建议保留最近3个版本)
6.2 同步速度慢
优化方法:
- 选择离你最近的镜像站(阿里云/清华/腾讯云)
- 使用
--downloadcomps参数并行下载 - 限制带宽避免影响业务:
--limit-rate=2M
6.3 依赖关系错误
如果出现依赖问题:
- 确保同步了所有相关仓库(base、updates、extras等)
- 检查createrepo是否成功生成元数据
- 使用
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参数可以实现增量同步,只下载新增的包。
八、技术方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 完整镜像 | 包最全 | 占用空间大 | 需要完整环境 |
| 增量同步 | 节省空间 | 可能漏包 | 日常更新 |
| 选择性同步 | 最节省空间 | 依赖可能不全 | 特定软件需求 |
九、安全注意事项
- 仓库服务器应该放在内网,通过防火墙限制访问
- 定期检查软件包签名(虽然我们禁用了gpgcheck)
- 保留至少两份备份,防止误删
- 监控磁盘使用情况,设置自动告警
十、总结与建议
自建YUM仓库是个一劳永逸的解决方案,特别适合:
- 服务器数量超过20台的企业环境
- 需要严格管控软件版本的金融/政府机构
- 外网访问受限的生产环境
建议初次搭建时:
- 先做小规模测试(同步部分仓库)
- 记录完整的操作步骤
- 制定定期维护计划(清理、备份等)
最后提醒:记得定期更新你的本地镜像,建议至少每周同步一次,确保安全补丁能及时推送到所有服务器。
评论