欧拉OpenEuler/系统运维

构建离线 YUM 仓库:银河麒麟 V10 上构建 openEuler 25.03 离线 YUM 仓库

daimafengzi · 10月14日 · 2025年 · · · · · · · · 本文共2477个字 · 预计阅读9分钟 3次已读

支持 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
0 条回应