1. 为什么需要离线共享YUM源?
在企业级Linux运维中,我们经常会遇到这样的场景:生产环境服务器由于安全要求无法连接互联网,但同时又需要安装或更新大量软件包。这时候,离线共享YUM源就成了救命稻草。我曾在某金融机构的数据中心遇到过这样的情况——300多台CentOS 7服务器需要统一部署安全补丁,而它们都位于严格隔离的内网环境中。
传统做法是给每台服务器挂载ISO镜像,但这存在几个致命问题:首先,ISO中的软件包版本通常较旧;其次,当需要添加自定义RPM包时,需要在每台服务器重复操作;最后,存储空间浪费严重。而搭建共享YUM源可以完美解决这些问题:
- 集中管理:所有软件包统一存放在一台服务器上
- 版本可控:可以自由组合官方源和自定义包
- 带宽节省:内网传输速度远快于从公网下载
- 安全合规:完全断绝与外网的连接需求
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础规划
2.1 硬件与网络需求
根据我的经验,搭建共享YUM源的服务器配置不需要很高,但有几个关键点需要注意:
- 存储空间:至少预留50GB空间(完整Base源约需30GB,加上EPEL等常用源)
- 内存:2GB足够,主要消耗在nginx等Web服务上
- 网络:建议千兆内网,百兆网络在大量客户端同时更新时会出现瓶颈
提示:如果企业有现成的文件服务器,可以直接利用其剩余空间,不必单独部署新服务器。
2.2 软件包收集策略
在离线环境下,我们需要提前准备好所有必要的软件包。通常有三种获取途径:
- 官方ISO镜像:从CentOS官网下载DVD镜像(约4.4GB)
- 公网同步:在有网络的环境中使用reposync工具同步官方源
- 自定义包:业务需要的特殊RPM包(如Oracle客户端等)
我推荐采用组合方案:以官方ISO为基础,补充必要的更新包。具体操作如下:
bash复制# 在有网络的临时机器上执行同步(示例)
mkdir -p /data/yum_repo/centos7
reposync -n -p /data/yum_repo/centos7 --repoid=base --repoid=updates --repoid=extras
createrepo /data/yum_repo/centos7/base
createrepo /data/yum_repo/centos7/updates
createrepo /data/yum_repo/centos7/extras
3. 服务端详细搭建过程
3.1 基础环境配置
首先在作为YUM源的服务器上执行以下操作:
bash复制# 安装必要工具
yum install -y createrepo yum-utils nginx
# 创建仓库目录结构
mkdir -p /var/www/html/yum/{base,updates,extras,custom}
# 挂载ISO镜像(如果有)
mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt
cp -rv /mnt/Packages/* /var/www/html/yum/base/
umount /mnt
3.2 仓库元数据生成
这是最关键的步骤,直接影响客户端能否正确识别软件包:
bash复制# 为每个仓库生成元数据
createrepo -v /var/www/html/yum/base
createrepo -v /var/www/html/yum/updates
createrepo -v /var/www/html/yum/extras
# 添加自定义包时需更新元数据
cp some-package.rpm /var/www/html/yum/custom/
createrepo --update /var/www/html/yum/custom
3.3 Nginx配置优化
默认的Nginx配置可能不适合大文件传输,需要针对性优化:
nginx复制server {
listen 80;
server_name yum.internal.company.com;
root /var/www/html/yum;
autoindex on;
# 大文件传输优化
client_max_body_size 1024M;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 缓存设置
location ~* ^/yum/.*\.(rpm)$ {
expires 30d;
add_header Cache-Control "public";
}
# 禁止访问上级目录
location ^~ /../ {
deny all;
}
}
配置完成后启动服务并设置开机自启:
bash复制systemctl enable --now nginx
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
4. 客户端配置指南
4.1 基础repo文件配置
在客户端服务器上创建新的repo文件:
bash复制cat > /etc/yum.repos.d/local.repo <<'EOF'
[local-base]
name=Local CentOS Base
baseurl=http://yum-server-ip/base
enabled=1
gpgcheck=0
[local-updates]
name=Local CentOS Updates
baseurl=http://yum-server-ip/updates
enabled=1
gpgcheck=0
[local-extras]
name=Local CentOS Extras
baseurl=http://yum-server-ip/extras
enabled=1
gpgcheck=0
[local-custom]
name=Local Custom Packages
baseurl=http://yum-server-ip/custom
enabled=1
gpgcheck=0
EOF
4.2 验证与测试
执行以下命令验证配置是否生效:
bash复制# 清除缓存
yum clean all
# 列出可用仓库
yum repolist
# 测试安装软件包
yum install -y telnet
如果遇到"Could not resolve host"错误,请检查DNS设置或直接在/etc/hosts中添加YUM服务器的IP解析。
5. 高级维护技巧
5.1 定期更新策略
离线环境下的YUM源需要定期手动更新。我建议建立以下维护流程:
- 季度更新:每季度从官方源同步安全更新
- 紧急更新:出现重大漏洞时立即更新
- 版本冻结:生产环境更新前先在测试环境验证
更新脚本示例:
bash复制#!/bin/bash
REPO_DIR="/var/www/html/yum"
LOCK_FILE="/tmp/yum_repo_update.lock"
if [ -f $LOCK_FILE ]; then
echo "Another update is in progress"
exit 1
fi
touch $LOCK_FILE
# 同步更新仓库
reposync -n -p $REPO_DIR --repoid=updates --newest-only
createrepo --update $REPO_DIR/updates
# 清理旧包(保留最近3个版本)
find $REPO_DIR/updates -name "*.rpm" | sort -V | head -n -3 | xargs rm -f
rm -f $LOCK_FILE
5.2 常见问题排查
问题1:客户端执行yum命令时报错"Error: Cannot retrieve repository metadata (repomd.xml)"
解决方案:
- 检查nginx服务是否正常运行
- 验证客户端能否访问http://yum-server-ip/base/repodata/repomd.xml
- 确认服务端createrepo执行成功
问题2:软件包依赖关系解析失败
解决方案:
- 确保所有相关仓库都已启用
- 检查是否有重复的repo文件冲突
- 使用
yum deplist package-name分析依赖关系
问题3:传输速度慢
优化建议:
- 在nginx中启用gzip压缩
- 调整TCP内核参数
- 考虑使用rsync定期同步到各区域的本地镜像
6. 安全加固措施
在生产环境中,我们需要对YUM源服务器进行额外加固:
-
访问控制:
nginx复制location /yum { allow 192.168.1.0/24; deny all; } -
认证保护(可选):
bash复制# 生成密码文件 htpasswd -c /etc/nginx/htpasswd yumuser # nginx配置 auth_basic "YUM Repository"; auth_basic_user_file /etc/nginx/htpasswd; -
日志监控:
nginx复制log_format yumlog '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; access_log /var/log/nginx/yum-access.log yumlog; -
定期完整性检查:
bash复制# 检查RPM包是否被篡改 find /var/www/html/yum -name "*.rpm" -exec rpm -K {} \;
7. 性能优化实践
根据我管理大型企业环境的经验,当客户端超过50台时,需要考虑以下优化:
- 分级缓存:在各部门机房部署二级缓存节点
- 负载均衡:使用多台YUM源服务器做负载均衡
- DNS轮询:为yum.internal.company.com配置多个A记录
- 定时同步:非高峰时段执行更新操作
一个实用的二级缓存方案示例:
bash复制# 在区域中心节点上设置rsync同步
rsync -avz --delete yum-primary-server::yum /data/yum_mirror/
# 配合crontab每天凌晨同步
0 2 * * * /usr/bin/rsync -avz --delete yum-primary-server::yum /data/yum_mirror/
8. 扩展功能实现
8.1 集成EPEL仓库
企业环境中经常需要EPEL仓库的软件包,离线集成方法:
bash复制# 在有网络的机器上同步EPEL
reposync -n -p /data/yum_repo --repoid=epel
# 拷贝到YUM服务器
rsync -av /data/yum_repo/epel yum-server:/var/www/html/yum/
# 生成元数据
createrepo /var/www/html/yum/epel
客户端repo配置示例:
ini复制[local-epel]
name=Local EPEL
baseurl=http://yum-server-ip/epel
enabled=1
gpgcheck=0
8.2 软件包版本锁定
生产环境通常需要锁定关键软件包版本,防止意外升级:
bash复制# 查看可用版本
yum --showduplicates list httpd
# 锁定特定版本
yum install -y httpd-2.4.6-97.el7.centos
# 添加到排除列表
echo "exclude=httpd-2.4.6-9*" >> /etc/yum.conf
8.3 自动化部署集成
结合Ansible实现自动化配置管理:
yaml复制- name: Configure local YUM repo
hosts: all
tasks:
- name: Install local repo file
copy:
src: files/local.repo
dest: /etc/yum.repos.d/local.repo
owner: root
group: root
mode: 0644
- name: Clean YUM cache
command: yum clean all
- name: Verify repo availability
command: yum repolist
register: yum_repo
changed_when: false
- debug:
var: yum_repo.stdout_lines
这套方案在某大型制造企业成功部署,管理着超过500台CentOS 7服务器,每年节省带宽成本约15万元,同时将软件部署效率提升了70%。关键在于前期做好仓库规划,后期严格执行更新流程。
