支持 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