1. 为什么需要离线共享YUM源?
在企业级Linux运维中,CentOS 7仍然是许多关键业务系统的首选平台。当遇到以下场景时,离线共享YUM源就成为了刚需:
- 生产环境安全要求:金融、政务等行业的服务器通常禁止直接连接互联网
- 批量部署需求:数十台服务器重复下载相同软件包会浪费带宽和时间
- 版本一致性控制:确保所有服务器使用完全相同的软件版本
- 特殊环境限制:隔离网络、内网开发测试环境等
提示:虽然CentOS 7已停止维护,但大量传统业务系统仍依赖该版本,掌握其离线源搭建技术仍是运维人员的必备技能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础规划
2.1 硬件资源评估
建议准备:
- 源服务器:至少50GB可用空间(/var/www/html目录)
- 客户端:正常配置即可
- 网络:千兆内网环境为佳
存储空间估算示例:
code复制基础软件包:~8GB
常用工具集:~15GB
开发环境:~20GB
预留空间:~7GB
总计:50GB
2.2 软件资源获取
需要提前下载:
- CentOS 7完整ISO镜像(约4.4GB)
- 额外需要的RPM包(如nginx、mysql等)
- EPEL仓库包(如需要)
推荐下载方式:
bash复制# 在有网络的环境中使用wget
wget http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
3. 搭建本地YUM仓库服务器
3.1 挂载ISO镜像
bash复制mkdir /mnt/centos7
mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt/centos7
永久挂载配置:
bash复制echo "/path/to/CentOS-7-x86_64-DVD-2009.iso /mnt/centos7 iso9660 loop 0 0" >> /etc/fstab
3.2 安装并配置Nginx
bash复制# 安装nginx
yum localinstall -y /mnt/centos7/Packages/nginx-1.20.1-9.el7.x86_64.rpm
# 配置nginx
cat > /etc/nginx/conf.d/yum.conf <<EOF
server {
listen 80;
server_name yum.local;
root /var/www/html/centos7;
autoindex on;
location / {
try_files \$uri \$uri/ =404;
}
}
EOF
# 创建仓库目录结构
mkdir -p /var/www/html/centos7/{base,updates,extras,epel}
cp -r /mnt/centos7/Packages /var/www/html/centos7/base/
3.3 创建仓库元数据
bash复制# 安装createrepo工具
yum localinstall -y /mnt/centos7/Packages/createrepo-0.9.9-28.el7.noarch.rpm
# 生成元数据
createrepo /var/www/html/centos7/base/Packages/
4. 客户端配置指南
4.1 基础仓库配置
创建客户端repo文件:
bash复制cat > /etc/yum.repos.d/local.repo <<EOF
[local-base]
name=Local CentOS 7 Base
baseurl=http://yum-server-ip/centos7/base
enabled=1
gpgcheck=0
[local-updates]
name=Local CentOS 7 Updates
baseurl=http://yum-server-ip/centos7/updates
enabled=1
gpgcheck=0
EOF
4.2 验证配置
bash复制yum clean all
yum makecache
yum repolist
预期输出应显示配置的仓库和可用包数量。
5. 高级维护技巧
5.1 增量更新策略
当需要添加新软件包时:
bash复制# 将新RPM包放入对应目录
cp new-package.rpm /var/www/html/centos7/base/Packages/
# 增量更新元数据
createrepo --update /var/www/html/centos7/base/Packages/
5.2 仓库同步脚本示例
bash复制#!/bin/bash
REPO_DIR="/var/www/html/centos7"
LOCK_FILE="/tmp/yum-repo-sync.lock"
if [ -f "$LOCK_FILE" ]; then
echo "Another sync is running"
exit 1
fi
touch $LOCK_FILE
rsync -avz --delete \
rsync://mirror.example.com/centos/7/os/x86_64/Packages/ \
$REPO_DIR/base/Packages/
createrepo --update $REPO_DIR/base/Packages/
rm -f $LOCK_FILE
5.3 常见问题排查
问题1:客户端提示"Could not resolve host"
- 检查DNS解析或直接使用IP地址
- 验证网络连通性:
ping yum-server-ip
问题2:仓库元数据损坏
bash复制# 在服务端重新生成
rm -rf /var/www/html/centos7/base/repodata
createrepo /var/www/html/centos7/base/Packages/
问题3:Nginx访问权限问题
bash复制chown -R nginx:nginx /var/www/html/centos7
semanage fcontext -a -t httpd_sys_content_t "/var/www/html/centos7(/.*)?"
restorecon -Rv /var/www/html/centos7
6. 安全加固建议
- 访问控制:
nginx复制location /centos7 {
allow 192.168.1.0/24;
deny all;
}
- 定期清理旧版本包:
bash复制# 保留最近3个版本
package-cleanup --oldkernels --count=3
- 仓库签名验证:
bash复制# 生成GPG密钥
gpg --gen-key
# 签名仓库
gpg --detach-sign --armor repodata/repomd.xml
7. 性能优化方案
- 启用Nginx缓存:
nginx复制proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=yum_cache:10m inactive=60m;
server {
location /centos7 {
proxy_cache yum_cache;
proxy_cache_valid 200 302 12h;
}
}
- 使用lighttpd替代方案(低资源环境):
bash复制yum localinstall -y /mnt/centos7/Packages/lighttpd-1.4.54-1.el7.x86_64.rpm
- 客户端yum缓存优化:
bash复制# 修改/etc/yum.conf
keepcache=1
8. 扩展应用场景
8.1 集成EPEL仓库
- 下载EPEL RPM:
bash复制wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
- 提取包文件:
bash复制rpm2cpio epel-release-latest-7.noarch.rpm | cpio -idmv
- 同步EPEL仓库:
bash复制rsync -avz --delete \
rsync://mirror.example.com/epel/7/x86_64/ \
/var/www/html/centos7/epel/
8.2 自定义软件包分组
创建comps.xml文件:
xml复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE comps PUBLIC "-//Red Hat, Inc.//DTD Comps info//EN" "comps.dtd">
<comps>
<group>
<id>my-tools</id>
<name>My Custom Tools</name>
<description>常用运维工具集</description>
<default>false</default>
<packagelist>
<packagereq type="mandatory">htop</packagereq>
<packagereq type="mandatory">iotop</packagereq>
</packagelist>
</group>
</comps>
生成带分组的仓库:
bash复制createrepo -g comps.xml /var/www/html/centos7/base/Packages/
9. 实际运维经验分享
- 空间监控脚本:
bash复制#!/bin/bash
THRESHOLD=90
USAGE=$(df -h /var/www/html | awk 'NR==2 {print $5}' | cut -d'%' -f1)
if [ $USAGE -gt $THRESHOLD ]; then
echo "仓库空间使用超过${THRESHOLD}%,当前使用率:${USAGE}%" | mail -s "YUM仓库空间告警" admin@example.com
fi
- 客户端自动切换脚本:
bash复制#!/bin/bash
SERVER_IP="192.168.1.100"
PING_RESULT=$(ping -c 1 -W 1 $SERVER_IP >/dev/null 2>&1; echo $?)
if [ $PING_RESULT -eq 0 ]; then
sed -i 's|^mirrorlist|#mirrorlist|g' /etc/yum.repos.d/*
sed -i 's|^#baseurl=http://mirror|baseurl=http://'$SERVER_IP'|g' /etc/yum.repos.d/*
else
sed -i 's|^#mirrorlist|mirrorlist|g' /etc/yum.repos.d/*
sed -i 's|^baseurl=http://'$SERVER_IP'|#baseurl=http://mirror|g' /etc/yum.repos.d/*
fi
- 仓库健康检查:
bash复制#!/bin/bash
REPO_DIR="/var/www/html/centos7"
for repo in base updates extras; do
if [ ! -f "$REPO_DIR/$repo/repodata/repomd.xml" ]; then
echo "仓库 $repo 元数据缺失" >> /var/log/yum-repo-check.log
fi
done
