目 录
[第一章 概述](#第一章 概述)
[1.1 适用场景](#1.1 适用场景)
[1.2 技术架构](#1.2 技术架构)
[1.3 为什么保留官方 repodata](#1.3 为什么保留官方 repodata)
[第二章 环境准备](#第二章 环境准备)
[2.1 服务器要求](#2.1 服务器要求)
[2.2 安装所需软件](#2.2 安装所需软件)
[2.3 检查 SELinux 状态](#2.3 检查 SELinux 状态)
[第三章 镜像源选型](#第三章 镜像源选型)
[3.1 常用国内镜像站对比](#3.1 常用国内镜像站对比)
[3.2 USTC rsync 地址](#3.2 USTC rsync 地址)
[第四章 目录规划与仓库创建](#第四章 目录规划与仓库创建)
[4.1 规划目录结构](#4.1 规划目录结构)
[4.2 创建 Rocky 目录](#4.2 创建 Rocky 目录)
[第五章 使用 rsync 同步各仓库](#第五章 使用 rsync 同步各仓库)
[5.1 同步 BaseOS 仓库](#5.1 同步 BaseOS 仓库)
[5.2 同步 AppStream 仓库](#5.2 同步 AppStream 仓库)
[5.3 同步 extras 仓库](#5.3 同步 extras 仓库)
[5.4 参数说明](#5.4 参数说明)
[第六章 一体化同步脚本](#第六章 一体化同步脚本)
[6.1 编写同步脚本](#6.1 编写同步脚本)
[6.2 赋予执行权限并试运行](#6.2 赋予执行权限并试运行)
[6.3 后台执行与进度查看](#6.3 后台执行与进度查看)
[6.4 校验 repodata 就绪](#6.4 校验 repodata 就绪)
[第七章 客户端 repo 配置](#第七章 客户端 repo 配置)
[7.1 创建客户端 repo 文件](#7.1 创建客户端 repo 文件)
[7.2 一键切换(移动原源并下载本地源)](#7.2 一键切换(移动原源并下载本地源))
[7.3 生成可供客户端下载的 repo 文件](#7.3 生成可供客户端下载的 repo 文件)
[第八章 验证与日常维护](#第八章 验证与日常维护)
[8.1 客户端验证源可用](#8.1 客户端验证源可用)
[8.2 实际安装软件包验证](#8.2 实际安装软件包验证)
[8.3 配置定时增量同步](#8.3 配置定时增量同步)
[8.4 常见问题排查](#8.4 常见问题排查)
第一章 概述
在企业内网环境中,出于网络隔离、带宽节省与安装速度的考虑,通常需要搭建本地软件源服务器。本指南以 CentOS 7.9 服务器为基础,完整演示如何部署一套 Rocky Linux 9 的本地 yum(dnf)源,使内网中的 Rocky 客户端能够脱离公网、稳定高效地完成软件包安装与更新。
1.1 适用场景
- 内网环境无法直连公网,或公网带宽受限的机房与实验室
- 需要统一管控多台 Rocky Linux 主机软件包来源与版本
- 为 Kubernetes、OpenStack 等大规模集群批量安装依赖软件
1.2 技术架构
本方案的整体架构如下:以一台 CentOS 7.9 服务器作为 yum 源服务器,安装 httpd 提供 Web 访问,通过 rsync 从中科大(USTC)镜像站同步 Rocky 9 的三个核心仓库(BaseOS、AppStream、extras),并保留官方 repodata 元数据,然后向内网 Rocky 客户端提供 http 访问。
|------------|--------------------|---------------------------|
| 角色 | 组件 | 说明 |
| 源服务器 | CentOS 7.9 + httpd | 提供 HTTP 仓库访问,监听 80 端口 |
| 同步工具 | rsync | 从 USTC 镜像站增量同步 Rocky 源 |
| 客户端 | Rocky Linux 9 | 通过 dnf 配置本地源并安装软件包 |
| 镜像源 | 中科大 USTC | rsync.mirrors.ustc.edu.cn |
1.3 为什么保留官方 repodata
Rocky Linux 9 的 AppStream 仓库采用模块化设计,包含 dnf module 元数据(modules.yaml),支持同一软件多版本共存。若使用老版本 createrepo(如 CentOS 7 自带的 0.9.9)重建元数据,会丢失这些模块信息,导致客户端无法使用 dnf module 功能。因此本方案采用 rsync 整树同步,直接保留官方 repodata,不做二次生成。
关键结论:
第二章 环境准备
2.1 服务器要求
|------------|---------------------------------|--------------------|
| 项目 | 要求 | 说明 |
| 操作系统 | CentOS 7.9 或任意可安装 rsync 的 Linux | 本例为 CentOS 7.9 |
| 内存 | 建议 2G 以上 | 同步与 httpd 服务开销 |
| 磁盘 | 预留 80G 以上 | Rocky 9 三仓库合计约 40G |
| 网络 | 源服务器可访问公网镜像站 | 仅同步阶段需要 |
2.2 安装所需软件
需要安装 httpd 提供 Web 服务,rsync 用于同步镜像,以及 wget、curl 等工具用于验证。
yum install -y httpd rsync wget curl
systemctl enable --now httpd
systemctl status httpd
确认 httpd 已启动并监听 80 端口:
ss -tlnp | grep :80
输出类似: LISTEN 0 128 *:80 *:* users:(("httpd",pid=xxxx))
2.3 检查 SELinux 状态
若服务器开启了 SELinux 且为 Enforcing 模式,可能影响 httpd 读取仓库目录。建议确认当前状态,必要时放行或临时关闭:
getenforce
若输出 Enforcing,可临时设为 Permissive:
setenforce 0
生产环境建议通过配置 httpd 的文件上下文来放行仓库目录,而非直接关闭 SELinux。
第三章 镜像源选型
搭建本地 Rocky 源前,需要选择一个稳定、支持 rsync 同步的国内镜像站。不同镜像站在 Rocky 仓库的支持情况差异较大,需要实测确认。
3.1 常用国内镜像站对比
|-------------|-------------------|--------------------|
| 镜像站 | Rocky 源支持 | rsync 可用性 |
| 清华 TUNA | 无 Rocky 仓库 | 不支持(无 rocky 模块) |
| 阿里云 | HTTP 可用 | rsync 不可用(SIGTERM) |
| 中科大 USTC | 支持(推荐) | 支持 rsync 同步 |
| 上海交大 SJTU | 支持 | 需实测确认 |
| 浙江大学 ZJU | 支持 | 需实测确认 |
本方案推荐:
3.2 USTC rsync 地址
USTC 镜像站的 rsync 服务使用专用域名 rsync.mirrors.ustc.edu.cn。先列出 Rocky 仓库目录确认结构:
rsync rsync://rsync.mirrors.ustc.edu.cn/rocky/9/
应看到 BaseOS、AppStream、extras 等子目录
Rocky 9 的核心仓库为 BaseOS、AppStream、extras,目录结构如下:
rocky/9/
├── BaseOS/x86_64/os/ # 核心系统组件
├── AppStream/x86_64/os/ # 应用软件与运行时
└── extras/x86_64/os/ # 额外补充包
注意:USTC 要求使用 rsync 专用域名同步,且每个仓库的同步频率不宜超过每天一次,请勿使用 while 循环频繁同步。
第四章 目录规划与仓库创建
在 httpd 的 Web 根目录 /var/www/html 下,为 Rocky 源单独创建目录,与既有 CentOS 仓库保持平级,避免混放、保证客户端 baseurl 规范。
4.1 规划目录结构
最终目录结构如下,客户端将通过 http://服务器IP/rocky/9/... 访问:
/var/www/html/
├── centos/ # 已有 CentOS 仓库
└── rocky/ # 新增 Rocky 仓库
└── 9/
├── BaseOS/x86_64/os/
├── AppStream/x86_64/os/
└── extras/x86_64/os/
4.2 创建 Rocky 目录
mkdir -p /var/www/html/rocky/9/BaseOS/x86_64/os
mkdir -p /var/www/html/rocky/9/AppStream/x86_64/os
mkdir -p /var/www/html/rocky/9/extras/x86_64/os
ls -la /var/www/html/rocky/9/
目录创建完成后,即可开始从 USTC 同步各仓库内容。
第五章 使用 rsync 同步各仓库
使用 rsync 从 USTC 同步三个仓库。必须使用 -a 参数以保留时间戳、权限等属性,并支持增量同步。三个仓库建议逐个串行同步,避免同时占用过多带宽与磁盘 IO。
5.1 同步 BaseOS 仓库
rsync -av --delete \
rsync://rsync.mirrors.ustc.edu.cn/rocky/9/BaseOS/x86_64/os/ \
/var/www/html/rocky/9/BaseOS/x86_64/os/
5.2 同步 AppStream 仓库
rsync -av --delete \
rsync://rsync.mirrors.ustc.edu.cn/rocky/9/AppStream/x86_64/os/ \
/var/www/html/rocky/9/AppStream/x86_64/os/
5.3 同步 extras 仓库
rsync -av --delete \
rsync://rsync.mirrors.ustc.edu.cn/rocky/9/extras/x86_64/os/ \
/var/www/html/rocky/9/extras/x86_64/os/
5.4 参数说明
|------------|----------------------|
| 参数 | 说明 |
| -a | 归档模式,保留权限、时间戳、软链接等属性 |
| -v | 显示同步过程详情 |
| --delete | 删除目标端多余文件,保证与源一致 |
| \ | 行尾续行符,用于将长命令分行书写 |
提示:
第六章 一体化同步脚本
为避免手工逐条执行,可将三个仓库的同步整合为一个脚本,串行执行并输出完成标志,便于定时任务调用。
6.1 编写同步脚本
创建 /root/sync_rocky_all.sh,内容如下:
#!/bin/bash
Rocky Linux 9 本地源一体化同步脚本
BASE=/var/www/html/rocky/9
SRC=rsync://rsync.mirrors.ustc.edu.cn/rocky/9
for repo in BaseOS AppStream extras; do
echo "==== 开始同步 {repo} (date) ===="
rsync -av --delete \
{SRC}/{repo}/x86_64/os/ \
{BASE}/{repo}/x86_64/os/
echo "==== {repo} 同步完成 (date) ===="
done
echo "ALL_DONE $(date)"
6.2 赋予执行权限并试运行
chmod +x /root/sync_rocky_all.sh
/root/sync_rocky_all.sh 2>&1 | tee /root/sync_rocky_all.log
6.3 后台执行与进度查看
由于三仓库合计约 40G,同步耗时较长。在低配服务器(如 1 核)上建议使用 nohup 放入后台执行,避免 SSH 会话断开导致中断:
setsid nohup /root/sync_rocky_all.sh > /root/sync_rocky_all.log 2>&1 < /dev/null &
查看同步日志末尾:
tail -f /root/sync_rocky_all.log
完成标志:
6.4 校验 repodata 就绪
同步完成后,确认三个仓库的官方元数据均已就位:
ls /var/www/html/rocky/9/BaseOS/x86_64/os/repodata/repomd.xml
ls /var/www/html/rocky/9/AppStream/x86_64/os/repodata/repomd.xml
ls /var/www/html/rocky/9/extras/x86_64/os/repodata/repomd.xml
三个文件都存在,说明同步成功。
第七章 客户端 repo 配置
在 Rocky Linux 9 客户端上,创建指向内网源服务器的 repo 文件,即可脱离公网使用本地源。
7.1 创建客户端 repo 文件
在客户端 /etc/yum.repos.d/ 下新建本地源配置文件(以服务器 IP 10.10.10.10 为例):
cat > /etc/yum.repos.d/local-rocky.repo << 'EOF'
local-rocky-baseos
name=Local Rocky Linux 9 - BaseOS
baseurl=http://10.10.10.10/rocky/9/BaseOS/x86_64/os/
enabled=1
gpgcheck=0
local-rocky-appstream
name=Local Rocky Linux 9 - AppStream
baseurl=http://10.10.10.10/rocky/9/AppStream/x86_64/os/
enabled=1
gpgcheck=0
local-rocky-extras
name=Local Rocky Linux 9 - Extras
baseurl=http://10.10.10.10/rocky/9/extras/x86_64/os/
enabled=1
gpgcheck=0
EOF
提示:
7.2 一键切换(移动原源并下载本地源)
为避免与原源冲突,可将原 repo 文件备份后,再从源服务器下载本地源配置文件。以下命令在客户端执行:
mkdir -p /etc/yum.repos.d/repo.bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo.bak/ 2>/dev/null
wget -P /etc/yum.repos.d/ http://10.10.10.10/rocky/9/tommypeng-rocky.repo
dnf clean all
dnf makecache
7.3 生成可供客户端下载的 repo 文件
上述一键切换命令依赖源服务器上存在 tommypeng-rocky.repo 文件。将其放置在源服务器的 rocky/9 目录下,即可被客户端 wget 下载:
在源服务器 10.10.10.10 上执行
cat > /var/www/html/rocky/9/tommypeng-rocky.repo << 'EOF'
local-rocky-baseos
name=Local Rocky Linux 9 - BaseOS
baseurl=http://10.10.10.10/rocky/9/BaseOS/x86_64/os/
enabled=1
gpgcheck=0
local-rocky-appstream
name=Local Rocky Linux 9 - AppStream
baseurl=http://10.10.10.10/rocky/9/AppStream/x86_64/os/
enabled=1
gpgcheck=0
local-rocky-extras
name=Local Rocky Linux 9 - Extras
baseurl=http://10.10.10.10/rocky/9/extras/x86_64/os/
enabled=1
gpgcheck=0
EOF
第八章 验证与日常维护
8.1 客户端验证源可用
在客户端确认本地源可识别并建立缓存:
dnf repolist
应列出 local-rocky-baseos / local-rocky-appstream / local-rocky-extras
dnf makecache
8.2 实际安装软件包验证
从本地源实际安装一个软件包,验证端到端可用(例如安装 git-subtree):
dnf install -y git-subtree
显示下载地址应为内网服务器 IP,且安装成功
验证要点:
8.3 配置定时增量同步
为保持本地源与上游同步,可配置 cron 定时任务(USTC 建议每个仓库每天最多同步一次):
crontab -e
每天凌晨 2 点执行同步,写入以下一行:
0 2 * * * /root/sync_rocky_all.sh >> /root/sync_rocky_all.log 2>&1
8.4 常见问题排查
|------------------------------------|-------------------------------------------------------|
| 现象 | 排查与处理 |
| 客户端 makecache 失败,报 repomd.xml 无法下载 | 确认源服务器 httpd 运行、目录路径正确、防火墙放行 80 端口 |
| 报 Cannot find a valid baseurl | 检查 repo 文件 baseurl 是否指向正确的 /rocky/9/xxx/x86_64/os/ 路径 |
| dnf module 功能异常 | 确认使用的是官方 repodata,未用旧版 createrepo 重建 |
| 同步速度慢 | 确认使用 rsync 而非 HTTP 大规模同步;串行同步避免 IO 打满 |