Rocky Linux 搭建软件同步源完整教程
前言
在企业内网或实验室环境中,多台 Rocky Linux 服务器需要安装和更新软件包时,如果每台都从外网下载,不仅速度慢,还浪费带宽。搭建一个本地软件同步源(镜像站),可以让所有内网服务器从本地高速获取软件包,同时还能控制软件版本、提高安全性。
本教程将详细介绍如何在 Rocky Linux 上搭建一个完整的软件同步源,包括 BaseOS、AppStream、EPEL 等常用仓库的同步。
环境说明
- 操作系统:Rocky Linux 9.x(同样适用于 Rocky Linux 8.x)
- 同步方式:reposync + createrepo(适合定制化同步) / rsync(适合完整镜像)
- Web 服务:Nginx
- 存储空间:建议至少 200GB(完整镜像需要 500GB+)
方案选择
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| reposync | 选择性同步部分仓库 | 节省空间,灵活 | 速度较慢 |
| rsync | 完整镜像 | 速度快,完整性高 | 占用空间大 |
| dnf reposync | 新一代同步工具 | 原生支持 DNF | 功能仍在完善 |
本教程以 reposync 方案为主,兼顾 rsync 方案。
第一步:安装必要软件包
# 安装同步和创建仓库所需的工具
dnf install -y dnf-utils createrepo_c rsync nginx
# dnf-utils 提供 reposync 命令
# createrepo_c 提供 createrepo 命令(C 语言实现,速度更快)
# rsync 用于增量同步
# nginx 用于对外提供 HTTP 服务
第二步:创建目录结构
# 创建仓库根目录
mkdir -p /data/repos/rocky
# 为每个仓库创建子目录
mkdir -p /data/repos/rocky/{baseos,appstream,extras,powertools,epel,epel-next}
第三步:配置上游镜像源
编辑 Rocky Linux 仓库配置文件,指定上游镜像源:
# 查看当前配置的仓库
dnf repolist
编辑 /etc/yum.repos.d/rocky.repo,确保仓库已启用:
[baseos]
name=Rocky Linux $releasever - BaseOS
baseurl=http://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9
[appstream]
name=Rocky Linux $releasever - AppStream
baseurl=http://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9
[extras]
name=Rocky Linux $releasever - Extras
baseurl=http://mirrors.aliyun.com/rockylinux/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9
提示:Rocky Linux 9 中 PowerTools 仓库已更名为 CRB(CodeReady Builder),可通过
dnf config-manager --set-enabled crb启用。
添加 EPEL 仓库:
# 安装 EPEL 仓库
dnf install -y epel-release
# 编辑 EPEL 配置,修改为阿里云镜像
sed -i 's|^metalink=|#metalink=|g' /etc/yum.repos.d/epel*.repo
sed -i 's|^#baseurl=|baseurl=|g' /etc/yum.repos.d/epel*.repo
sed -i 's|download.example/pub|mirrors.aliyun.com|g' /etc/yum.repos.d/epel*.repo
第四步:使用 reposync 同步仓库
同步 BaseOS 仓库
# 同步 BaseOS 仓库(首次同步时间较长)
reposync --repo=baseos \
--download-metadata \
-p /data/repos/rocky/baseos \
--newest-only
# 参数说明:
# --repo=baseos 指定要同步的仓库
# --download-metadata 同时下载仓库元数据
# -p 指定本地保存路径
# --newest-only 只下载最新版本的包(节省空间)
同步 AppStream 仓库
reposync --repo=appstream \
--download-metadata \
-p /data/repos/rocky/appstream \
--newest-only
同步 EPEL 仓库
reposync --repo=epel \
--download-metadata \
-p /data/repos/rocky/epel \
--newest-only
同步 EPEL Next 仓库
reposync --repo=epel-next \
--download-metadata \
-p /data/repos/rocky/epel-next \
--newest-only
第五步:创建本地仓库索引
同步完成后,需要为每个仓库创建元数据索引:
# 为每个仓库创建 repodata
createrepo_c --update /data/repos/rocky/baseos
createrepo_c --update /data/repos/rocky/appstream
createrepo_c --update /data/repos/rocky/epel
createrepo_c --update /data/repos/rocky/epel-next
说明:
--update参数表示增量更新,如果已有 repodata 则只更新变化的部分,速度更快。
第六步:配置 Nginx 对外提供服务
安装和启动 Nginx
# 启动 Nginx 并设置开机自启
systemctl enable nginx --now
配置 Nginx 虚拟主机
创建配置文件 /etc/nginx/conf.d/repo.conf:
server {
listen 80;
server_name repo.yourdomain.com;
# 仓库根目录
root /data/repos/rocky;
# 开启目录浏览
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
# 访问日志
access_log /var/log/nginx/repo-access.log;
error_log /var/log/nginx/repo-error.log;
# 对 RPM 包启用缓存
location ~* \.(rpm|xml|gz|bz2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# 允许所有内网访问
location / {
allow 192.168.0.0/16;
allow 10.0.0.0/8;
allow 172.16.0.0/12;
deny all;
}
}
重载 Nginx 配置:
# 检查配置语法
nginx -t
# 重载配置
systemctl reload nginx
防火墙配置
# 开放 HTTP 端口
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
第七步:客户端配置
在内网其他 Rocky Linux 服务器上,创建 /etc/yum.repos.d/local.repo:
[local-baseos]
name=Local Rocky Linux $releasever - BaseOS
baseurl=http://repo.yourdomain.com/baseos/
gpgcheck=0
enabled=1
[local-appstream]
name=Local Rocky Linux $releasever - AppStream
baseurl=http://repo.yourdomain.com/appstream/
gpgcheck=0
enabled=1
[local-epel]
name=Local EPEL for Rocky Linux $releasever
baseurl=http://repo.yourdomain.com/epel/
gpgcheck=0
enabled=1
客户端验证:
# 清理缓存
dnf clean all
# 重建缓存
dnf makecache
# 测试安装
dnf install -y vim
第八步:使用 rsync 实现完整镜像(可选)
如果需要完整镜像整个 Rocky Linux 仓库,可以使用 rsync:
# 同步 BaseOS(完整镜像)
rsync -avzP --delete \
rsync://mirrors.aliyun.com/rockylinux/9.5/BaseOS/x86_64/os/ \
/data/repos/rocky/baseos/
# 同步 AppStream
rsync -avzP --delete \
rsync://mirrors.aliyun.com/rockylinux/9.5/AppStream/x86_64/os/ \
/data/repos/rocky/appstream/
# 参数说明:
# -a 归档模式(保留权限、时间戳等)
# -v 详细输出
# -z 传输时压缩
# -P 显示进度并支持断点续传
# --delete 删除本地存在但远程已删除的文件
第九步:配置定时同步
使用 crontab 设置定时同步任务:
# 编辑 crontab
crontab -e
添加以下内容:
# 每天凌晨 2 点同步仓库
0 2 * * * /usr/local/bin/sync-repos.sh >> /var/log/repo-sync.log 2>&1
同步脚本
创建 /usr/local/bin/sync-repos.sh:
#!/bin/bash
#
# Rocky Linux 仓库自动同步脚本
#
set -e
LOG_FILE="/var/log/repo-sync.log"
REPO_BASE="/data/repos/rocky"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
sync_repo() {
local repo_name=$1
local repo_path=$2
log "开始同步 ${repo_name} 仓库..."
reposync --repo="${repo_name}" \
--download-metadata \
-p "${repo_path}" \
--newest-only
log "更新 ${repo_name} 元数据..."
createrepo_c --update "${repo_path}/${repo_name}"
log "${repo_name} 同步完成"
}
log "========== 开始同步任务 =========="
# 同步各个仓库
sync_repo "baseos" "$REPO_BASE"
sync_repo "appstream" "$REPO_BASE"
sync_repo "epel" "$REPO_BASE"
sync_repo "epel-next" "$REPO_BASE"
# 清理旧版本的包
log "清理旧版本包..."
dnf clean packages --repodir="$REPO_BASE"
log "========== 同步任务结束 =========="
设置脚本权限:
chmod +x /usr/local/bin/sync-repos.sh
第十步:监控与维护
检查磁盘空间
# 查看仓库占用空间
du -sh /data/repos/rocky/*
# 设置磁盘告警
df -h /data
查看同步日志
tail -f /var/log/repo-sync.log
访问统计
通过 Nginx 访问日志查看客户端使用情况:
# 查看最近访问的客户端 IP
awk '{print $1}' /var/log/nginx/repo-access.log | sort | uniq -c | sort -rn | head -10
# 查看最常请求的 RPM 包
awk '{print $7}' /var/log/nginx/repo-access.log | grep '\.rpm$' | sort | uniq -c | sort -rn | head -10
常见问题与排错
Q1:同步速度太慢怎么办?
# 方案一:使用 rsync 代替 reposync
# 方案二:限制带宽或调整并发
# 方案三:更换离自己更近的上游镜像源
# 测试各镜像源速度
curl -o /dev/null -s -w '%{speed_download}\n' http://mirrors.aliyun.com/rockylinux/9.5/BaseOS/x86_64/os/repodata/repomd.xml
Q2:客户端提示 404 错误
# 检查 Nginx 配置中的 root 路径是否正确
# 确认仓库目录中 repodata 已生成
ls -la /data/repos/rocky/baseos/repodata/
# 检查 Nginx 错误日志
tail -20 /var/log/nginx/repo-error.log
Q3:GPG 密钥验证失败
# 导入 Rocky Linux GPG 密钥
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9
# 或者临时跳过 GPG 检查
dnf install --nogpgcheck <package-name>
Q4:createrepo_c 报错 “Directory must be empty”
# 如果遇到此错误,先删除旧的 repodata
rm -rf /data/repos/rocky/baseos/repodata
createrepo_c /data/repos/rocky/baseos
总结
通过本教程,你已经可以在 Rocky Linux 上搭建一个功能完整的软件同步源。主要要点回顾:
- reposync 适合选择性同步,节省空间
- rsync 适合完整镜像,速度快
- createrepo_c 是构建仓库索引的关键工具
- Nginx 提供高效的 HTTP 服务
- 定时任务 保证仓库持续更新
搭建完成后,内网所有 Rocky Linux 服务器都可以从本地源高速安装和更新软件包,大大提升运维效率。















暂无评论内容