Rocky Linux 搭建软件同步源完整教程

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 上搭建一个功能完整的软件同步源。主要要点回顾:

  1. reposync 适合选择性同步,节省空间
  2. rsync 适合完整镜像,速度快
  3. createrepo_c 是构建仓库索引的关键工具
  4. Nginx 提供高效的 HTTP 服务
  5. 定时任务 保证仓库持续更新

搭建完成后,内网所有 Rocky Linux 服务器都可以从本地源高速安装和更新软件包,大大提升运维效率。

延伸阅读

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容