1. 为什么需要自定义本地yum源
在企业级Linux运维中,yum源配置是基础中的基础。我见过太多新手运维在断网环境下对着"Could not resolve host"的错误束手无策。本地yum源的价值在于:
- 离线环境支持:生产服务器通常禁止直接连接外网,通过内网镜像源可解决90%的软件依赖问题
- 版本控制:外网源版本随时可能更新,而本地源可以固化特定版本,避免自动升级导致的服务异常
- 加速部署:内网千兆传输比公网下载快10倍不止,批量部署时尤为明显
- 安全审计:所有rpm包经过内部审核后再入库,杜绝第三方源的安全隐患
提示:CentOS 7.9默认的官方源已于2021年停止维护,现在连yum update都会报错,这就是为什么需要掌握本地源配置
2. 搭建本地yum仓库的完整流程
2.1 基础环境准备
先确认系统已安装必要工具:
# 检查createrepo工具 rpm -q createrepo || yum install -y createrepo # 安装httpd用于提供web访问 yum install -y httpd systemctl enable --now httpd目录结构建议如下:
/var/www/html/yumrepo/ ├── centos7.9 │ ├── base │ ├── epel │ └── nginx └── rpms ├── custom_packages └── third_party2.2 获取基础rpm包
对于CentOS 7.9系统,需要先下载官方ISO:
wget http://vault.centos.org/7.9.2009/isos/x86_64/CentOS-7-x86_64-Everything-2009.iso mount -o loop CentOS-7-x86_64-Everything-2009.iso /mnt cp -rv /mnt/Packages/* /var/www/html/yumrepo/centos7.9/base/第三方源推荐阿里云镜像:
rsync -avz rsync://mirrors.aliyun.com/epel/7/x86_64/ /var/www/html/yumrepo/centos7.9/epel/2.3 创建仓库元数据
关键命令是createrepo_c(比老版createrepo快3倍):
cd /var/www/html/yumrepo/centos7.9 for repo in base epel; do createrepo_c -g comps.xml $repo # 生成压缩元数据节省空间 gzip $repo/repodata/*.xml donecomps.xml示例(定义软件组):
<?xml version="1.0" encoding="UTF-8"?> <comps> <group> <id>development</id> <name>Development Tools</name> <description>Basic dev tools (gcc, make, etc)</description> <default>true</default> <packagelist> <packagereq type="mandatory">gcc</packagereq> <packagereq type="mandatory">make</packagereq> </packagelist> </group> </comps>3. 客户端配置详解
3.1 基础repo文件配置
在/etc/yum.repos.d/local.repo中写入:
[local-base] name=Local CentOS 7.9 Base baseurl=http://yum-server-ip/yumrepo/centos7.9/base enabled=1 gpgcheck=0 priority=1 [local-epel] name=Local EPEL Repo baseurl=http://yum-server-ip/yumrepo/centos7.9/epel enabled=1 gpgcheck=0 priority=23.2 优先级控制技巧
当多个源存在相同软件时,yum-plugin-priorities插件可解决冲突:
yum install -y yum-plugin-priorities然后在repo文件中添加:
priority=数字 # 数值越小优先级越高3.3 测试与验证
执行以下命令验证配置:
yum clean all yum makecache yum repolist # 测试安装 yum install -y --disablerepo="*" --enablerepo="local*" telnet4. 高级维护技巧
4.1 增量更新策略
使用--update参数只同步新增rpm:
rsync -avz --delete --update rsync://mirrors.aliyun.com/epel/7/x86_64/ /var/www/html/yumrepo/centos7.9/epel/ # 增量更新元数据 createrepo_c --update /var/www/html/yumrepo/centos7.9/epel4.2 自动同步脚本
创建/etc/cron.weekly/yum_sync.sh:
#!/bin/bash LOG=/var/log/yum_sync.log echo "Sync started at $(date)" >> $LOG # 同步EPEL源 rsync -avz --delete rsync://mirrors.aliyun.com/epel/7/x86_64/ \ /var/www/html/yumrepo/centos7.9/epel/ >> $LOG 2>&1 # 重建元数据 for repo in base epel; do createrepo_c --update /var/www/html/yumrepo/centos7.9/$repo >> $LOG 2>&1 done # 清理旧日志 find /var/log/yum_sync.log -mtime +30 -delete4.3 常见问题排查
问题1:Error: Cannot retrieve metalink for repository: epel
解决方案:
# 检查网络连通性 curl -I http://yum-server-ip # 验证仓库路径 ls /var/www/html/yumrepo/centos7.9/epel/repodata # 临时禁用问题源 yum --disablerepo=epel update问题2:RPMDB altered outside of yum
解决方法:
rm -f /var/lib/rpm/__db* rpm --rebuilddb yum clean all5. 企业级实践方案
5.1 多版本仓库管理
对于需要同时维护CentOS 7/8的场景,建议目录结构:
/yumrepo/ ├── centos7 │ ├── os │ └── updates └── centos8 ├── BaseOS └── AppStream对应的repo配置示例:
[centos7-base] name=CentOS 7 - Base baseurl=http://yum-server/yumrepo/centos7/os gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [centos8-AppStream] name=CentOS 8 - AppStream baseurl=http://yum-server/yumrepo/centos8/AppStream gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial5.2 与Ansible集成
通过ansible yum模块批量配置:
- name: Configure local yum repo hosts: all tasks: - name: Install yum priorities plugin yum: name: yum-plugin-priorities state: present - name: Add local repo file copy: dest: /etc/yum.repos.d/local.repo content: | [local-base] name=Local Base baseurl=http://yum-server/yumrepo/centos$releasever/base enabled=1 gpgcheck=0 priority=1 owner: root group: root mode: 0644 - name: Clean yum cache command: yum clean all5.3 性能优化建议
- 启用httpd的压缩传输:
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css AddOutputFilterByType DEFLATE application/x-javascript application/javascript </IfModule>- 使用Nginx替代httpd:
server { listen 80; server_name yum.example.com; root /yumrepo; location / { autoindex on; sendfile on; tcp_nopush on; } # 启用gzip gzip on; gzip_types application/x-rpm; }- 添加CDN缓存层(适用于多地分支机构)