支持 OpenEuler 22.03 / 23.09 / 25.03 等多个版本,标准化命名,便于长期维护
目标
在银河麒麟 V10 系统上,通过解析 OpenEuler 官方仓库元数据,自动化采集、下载、打包指定版本的 RPM 包,并制作成 标准化命名的离线 YUM 仓库,支持
✅ 多版本共存(22.03、23.09、25.03)
✅ 多架构支持(aarch64、x86_64)
✅ 多类型仓库(everything、baseos)
✅ 标准化命名与目录结构
✅ 离线部署一键配置
环境准备
- 操作系统:银河麒麟 V10(aarch64 或 x86_64)
- 网络环境:当前机器可联网(用于下载)
- 目标系统:openEuler / 银河麒麟 离线环境
- 存储空间:≥ 10GB(建议使用 /data 分区)
- 依赖工具:wget, zstd, createrepo_c, genisoimage(可选)
命名规范(核心!避免混淆)
为支持多版本管理,采用统一命名格式:
openeuler-{version}-{repo_type}-{arch}.{format}
| 字段 | 示例值 |
|---|---|
| {version} | 22.03, 23.09, 25.03 |
| {repo_type} | everything, baseos |
| {arch} | aarch64, x86_64 |
| {format} | tar.gz, iso |
✅ 示例:
| 含义 | 文件名 |
|---|---|
| openEuler 25.03 Everything aarch64 | openeuler-25.03-everything-aarch64.tar.gz |
| openEuler 25.03 BaseOS x86_64 | openeuler-25.03-baseos-x86_64.tar.gz |
| openEuler 22.03 Everything aarch64 | openeuler-22.03-everything-aarch64.iso |
推荐目录结构
/data/openeuler-offline/
├── 22.03/
│ └── openeuler-22.03-everything-aarch64.tar.gz
├── 23.09/
│ └── openeuler-23.09-everything-aarch64.tar.gz
└── 25.03/
├── openeuler-25.03-everything-aarch64.tar.gz
└── openeuler-25.03-everything-aarch64.iso
✅ 第一步:创建工作目录
VERSION="25.03"
REPO_TYPE="everything"
ARCH="aarch64"
WORK_DIR="/data/openeuler-offline/${VERSION}/${REPO_TYPE}-${ARCH}"
mkdir -p "$WORK_DIR"
cd "$WORK_DIR"
🔁 你可以修改 VERSION、REPO_TYPE、ARCH 来适配不同组合。
✅ 第二步:下载 repomd.xml
BASE_URL="https://repo.openeuler.org/openEuler-${VERSION}/${REPO_TYPE}/${ARCH}"
wget "${BASE_URL}/repodata/repomd.xml" -O repomd.xml
✅ 第三步:提取 primary.xml.zst 文件名
PRIMARY_FILE=$(grep -A2 "primary" repomd.xml | grep "location href" | grep -o 'href="[^"]*"' | cut -d'"' -f2) echo "Primary XML: $PRIMARY_FILE"
✅ 第四步:下载 primary.xml.zst
wget "${BASE_URL}/repodata/${PRIMARY_FILE##*/}" -O primary.xml.zst
✅ 第五步:解析出所有 RPM 包名
zstd -dc primary.xml.zst | \ grep -o 'location href="Packages/[^"]*\.rpm"' | \ sed 's/location href="Packages\///' | sed 's/"$//' | \ sort -u > rpm-list.txt # 验证 wc -l rpm-list.txt head rpm-list.txt
✅ 第六步:批量下载所有 RPM 包
cat rpm-list.txt | xargs -I {} -P 8 \
wget -c --show-progress \
"${BASE_URL}/Packages/{}"
⚠️ 如果网络不稳定,可改用 -P 4 减少并发。
✅ 第七步:创建本地 YUM 仓库(生成元数据)
1. 安装 createrepo_c
sudo dnf install -y createrepo_c || sudo yum install -y createrepo_c
2. 生成 repodata
createrepo_c .
✅ 成功后会生成 repodata/ 目录。
✅ 第八步:制作可移动离线包
1. 创建离线包目录
OFFLINE_DIR="${WORK_DIR}/../openeuler-offline-repo"
rm -rf "$OFFLINE_DIR"
mkdir -p "$OFFLINE_DIR/repo"
# 复制 RPM 和 repodata
cp *.rpm "$OFFLINE_DIR/repo/"
cp -r repodata "$OFFLINE_DIR/repo/"
2. 创建一键配置脚本 setup-repo.sh
cat > "$OFFLINE_DIR/setup-repo.sh" << 'EOF'
#!/bin/bash
# openEuler 离线仓库自动配置脚本
# 用法:chmod +x setup-repo.sh && ./setup-repo.sh
set -e
echo "🔍 正在查找仓库目录..."
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_DIR="$SCRIPT_DIR/repo"
if [ ! -d "$REPO_DIR" ]; then
echo "❌ 错误:未找到 repo 目录,请确保 repo/ 在同一路径下"
exit 1
fi
echo "✅ 找到仓库目录:$REPO_DIR"
# 转义路径中的 / 用于 sed
REPO_DIR_ESCAPED=$(echo "$REPO_DIR" | sed 's/\//\\\//g')
# 创建 YUM 源文件
cat > /etc/yum.repos.d/local-openeuler-offline.repo << REPOEOF
[local-openeuler-offline]
name=Local openEuler Offline Repository
baseurl=file://$REPO_DIR_ESCAPED
enabled=1
gpgcheck=0
priority=1
REPOEOF
echo "✅ 已创建 YUM 源:/etc/yum.repos.d/local-openeuler-offline.repo"
# 清理并重建缓存
sudo dnf clean all
sudo dnf makecache
echo "🎉 离线仓库配置成功!"
echo "📦 你现在可以使用 dnf 安装软件,例如:"
echo " dnf install nginx"
echo " dnf install docker"
echo " dnf groupinstall Base"
EOF
chmod +x "$OFFLINE_DIR/setup-repo.sh"
3. 创建说明文档 README.txt
cat > "$OFFLINE_DIR/README.txt" << EOF
openEuler ${VERSION} ${REPO_TYPE} ${ARCH} 离线仓库
用途:
用于无网络环境下安装 openEuler 软件包。
使用方法:
1. 将整个目录复制到目标机器
2. 进入目录并运行:./setup-repo.sh
3. 即可使用 dnf 安装软件
注意事项:
- 目标机器需为 openEuler 或银河麒麟 ${ARCH}
- 需 root 权限运行 setup-repo.sh
EOF
✅ 第九步:打包为标准命名格式
方式一:打包为 .tar.gz
cd "$WORK_DIR"
tar -czf "openeuler-${VERSION}-${REPO_TYPE}-${ARCH}.tar.gz" -C "$OFFLINE_DIR" .
方式二:打包为 .iso(推荐用于分发)
# 安装 genisoimage(若未安装)
sudo dnf install -y genisoimage || sudo yum install -y genisoimage
# 创建 ISO 工作目录
ISO_DIR="${WORK_DIR}/../openeuler-offline-iso"
rm -rf "$ISO_DIR"
mkdir -p "$ISO_DIR"
cp -r "$OFFLINE_DIR"/* "$ISO_DIR/"
# 生成 ISO
genisoimage \
-o "openeuler-${VERSION}-${REPO_TYPE}-${ARCH}.iso" \
-r -J -l \
-V "OE${VERSION}_${REPO_TYPE^^}_${ARCH}" \
"$ISO_DIR/"
✅ 第十步:拷贝到目标机器并使用
1. 拷贝文件
将生成的包拷贝到目标机器:
scp openeuler-25.03-everything-aarch64.tar.gz user@target:/opt/
2. 解压并配置
tar -xzf openeuler-25.03-everything-aarch64.tar.gz -C /opt cd /opt/openeuler-offline-repo sudo ./setup-repo.sh
3. 验证
dnf list available | head -5 dnf install -y nginx #如果需要安装指定版本,请使用 dnf list available nginx #然后再进行安装指定版本
✅ 批量构建脚本(可选)
保存为 build-offline-repo.sh:
#!/bin/bash
# 用法:./build-offline-repo.sh 25.03 everything aarch64 tar.gz
VERSION="$1"
REPO_TYPE="$2"
ARCH="$3"
FORMAT="${4:-tar.gz}"
[[ -z "$VERSION" || -z "$REPO_TYPE" || -z "$ARCH" ]] && {
echo "用法:$0 [format]"
echo "示例:$0 25.03 everything aarch64 tar.gz"
exit 1
}
WORK_DIR="/data/openeuler-offline/${VERSION}/${REPO_TYPE}-${ARCH}"
mkdir -p "$WORK_DIR"
cd "$WORK_DIR"
echo "🚀 开始构建 openEuler ${VERSION} ${REPO_TYPE} ${ARCH}"
# (此处插入上述完整流程命令,略)
echo "✅ 构建完成:openeuler-${VERSION}-${REPO_TYPE}-${ARCH}.${FORMAT}"
✅ 最终成果示例
/data/openeuler-offline/25.03/ ├── openeuler-25.03-everything-aarch64.tar.gz ├── openeuler-25.03-everything-aarch64.iso ├── openeuler-25.03-baseos-aarch64.tar.gz └── 20250405-build.log
📌 总结
| 步骤 | 输出 |
|---|---|
| 采集包名 | rpm-list.txt |
| 下载 RPM | *.rpm |
| 生成元数据 | repodata/ |
| 打包输出 | openeuler-{ver}-{type}-{arch}.tar.gz 或 .ISO |
| 目标使用 | ./setup-repo.sh |
