普通网友 2026-02-26 11:30 采纳率: 98.7%
浏览 0
已采纳

Rocky 9.4 Minimal 镜像制作时网络源不可达如何解决?

在基于 Rocky 9.4 Minimal ISO 制作自定义镜像(如 PXE、Kickstart 或容器化基础镜像)时,常因默认网络源(baseos/appstream)配置为在线仓库(如 `mirror.rockylinux.org`),导致离线环境、内网隔离或 DNS/代理未就绪时 `dnf install` 或 `%packages` 阶段失败,报错如“Failed to download metadata”或“Unable to resolve host”。该问题并非安装介质本身损坏,而是 Kickstart 或 chroot 环境中未正确配置本地/可用的软件源。典型诱因包括:Minimal ISO 不含本地 repo、`--noverifyssl` 缺失、`--disablerepo=* --enablerepo=...` 未显式指定、或 `/etc/yum.repos.d/` 中默认 repo 仍指向不可达地址。解决关键在于制作阶段主动替换为可信源(如本地 HTTP 仓库、挂载 ISO 的 `BaseOS/AppStream` 目录,或启用 `--mirrorlist` 回退机制),并验证 `dnf makecache` 可通。需注意 Rocky 9.4 默认启用 dnf5,其 repo 解析逻辑与 dnf4 存在细微差异。
  • 写回答

1条回答 默认 最新

  • 三月Moon 2026-02-26 11:31
    关注
    ```html

    一、现象定位:从错误日志反推源配置失效根源

    在 Rocky 9.4 Minimal ISO 的 Kickstart 安装或 chroot 构建阶段,dnf install%packages 报错典型为:

    • Failed to download metadata for repo 'baseos': Cannot prepare internal mirrorlist
    • Unable to resolve host mirror.rockylinux.org
    • Curl error (6): Couldn't resolve host name

    这些非网络设备故障,而是 /etc/yum.repos.d/rocky.repobaseurl 仍硬编码指向公网镜像,且未被覆盖。Minimal ISO 不自带本地 repo 元数据,dnf5 默认禁用 mirrorlist 回退(因 SSL 验证失败即终止),加剧了首请求失败率。

    二、机制剖析:Rocky 9.4 dnf5 与 repo 解析逻辑的三大差异

    维度dnf4(RHEL8/Rocky8)dnf5(Rocky9.4 默认)
    默认启用 mirrorlist是(自动 fallback)否(需显式配置 mirrorlist=... 且证书有效)
    SSL 验证行为可被 --noverifyssl 全局抑制仅对单 repo 生效(sslverify=0 in .repo),全局参数已弃用
    仓库启用优先级--enablerepo 覆盖 enabled=0强制要求 enabled=1 + 显式 --enablerepo 才生效

    三、实战方案:四类可信源适配策略及验证闭环

    根据部署场景选择以下任一路径,并**必须执行 dnf makecache --refresh 验证通路**:

    1. ISO 挂载本地源(适用于 PXE/Kickstart):
      mount -o loop /path/to/Rocky-9.4-x86_64-minimal.iso /mnt/iso && cat > /etc/yum.repos.d/local.repo <<'EOF'
      [baseos-local]
      name=Rocky Linux 9.4 BaseOS (Local)
      baseurl=file:///mnt/iso/BaseOS
      enabled=1
      gpgcheck=0
      repo_gpgcheck=0
      EOF
    2. 内网 HTTP 仓库(推荐生产):
      sed -i 's|mirror.rockylinux.org|internal-repo.example.com|g' /etc/yum.repos.d/rocky.repo && sed -i '/^gpgcheck/s/1/0/' /etc/yum.repos.d/rocky.repo
    3. Mirrorlist 回退增强(兼顾弹性与安全):
      替换 baseurlmirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-9,并添加 sslverify=1 + 内网 CA 证书到 /etc/pki/ca-trust/source/anchors/ 后运行 update-ca-trust
    4. 容器化构建专用策略(如 buildah/podman):
      Dockerfile 中使用 RUN microdnf --setopt=tsflags=nodocs install -y ... && rm -rf /var/cache/dnf,配合 --add-host=mirror.rockylinux.org:10.10.10.10 绑定内网镜像 IP。

    四、自动化加固:Kickstart 与构建脚本中的防御性模板

    %pre 阶段注入源健康检查,避免静默失败:

    %pre --erroronfail
    #!/bin/bash
    # 强制清理旧 repo 并注入本地源
    rm -f /etc/yum.repos.d/*.repo
    cat > /etc/yum.repos.d/rocky.repo <<'EOF'
    [baseos]
    name=Rocky Linux 9.4 BaseOS
    baseurl=file:///run/install/repo/BaseOS
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    
    [appstream]
    name=Rocky Linux 9.4 AppStream
    baseurl=file:///run/install/repo/AppStream
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    EOF
    
    # 验证缓存生成(dnf5 语义)
    if ! dnf5 makecache --timer --refresh > /dev/null 2>&1; then
      echo "[ERROR] DNF cache generation failed. Check repo path and permissions." >> /tmp/install-error.log
      exit 1
    fi
    

    五、深度验证:构建可观测性诊断流水线

    使用 Mermaid 流程图定义源可用性验证状态机:

    graph TD A[启动 chroot 或 %post] --> B{dnf5 makecache --refresh} B -->|Success| C[记录 repo URL + timestamp 到 /var/log/dnf-source.log] B -->|Fail| D[触发告警:curl -s http://monitor.internal/api/alert?msg=RepoUnreachable] D --> E[回滚至预置离线 repo 备份 /etc/yum.repos.d/backup.repo] E --> F[重试 makecache] F -->|Still fail| G[exit 1 with debug info]

    该流程嵌入 CI/CD 构建阶段,结合 dnf repoquery --available --latest-limit=1 --qf '%{name}-%{version}-%{release}' 抽样校验包存在性,形成“配置→连通→元数据→内容”四级验证。

    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 2月27日
  • 创建了问题 2月26日