RHEL 8 基于 DNF 的 YUM v4 管理软件包,仓库配置通过 .repo 文件或 yum-config-manager 完成。
仓库配置文件格式
DNF 默认读取 /etc/dnf/dnf.conf 和 /etc/yum.repos.d/ 下的所有 .repo 文件,后者通常用于仓库配置并覆盖全局设置 [1]。配置文件采用 INI 格式,分为 main 和 repository 两类 section。
仓库 section 的 ID 必须唯一,允许字符为字母、数字、-、_、.、:。最小配置需要 repo ID 加上 baseurl、metalink 或 mirrorlist 之一 [1]。
典型 .repo 文件结构如下:
[myrepo]
name=My Custom Repository
baseurl=https://example.com/repo/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-myrepo
$basearch 会被 DNF 替换为系统架构(如 x86_64),$releasever 替换为发行版版本号。全局 [main] section 只应出现一次,定义影响所有仓库的默认选项。
yum-config-manager 添加与管理
Red Hat 官方推荐使用 yum-config-manager 命令添加仓库 [2]:
yum-config-manager --add-repo https://example.com/repo/
该命令会在 /etc/yum.repos.d/ 下创建一个以 URL 命名的 .repo 文件,仓库默认启用。创建后应检查并调整生成的配置。启用或禁用仓库使用 --enable 和 --disable 参数 [2]:
yum-config-manager --enable myrepo
yum-config-manager --disable myrepo
手动创建 .repo 文件
当需要更精细控制时,直接在 /etc/yum.repos.d/ 下创建 .repo 文件 [2]。所有 .repo 扩展名的文件都会被 YUM 读取,因此推荐将仓库定义放在这个目录而非 /etc/yum.conf。
一个完整的仓库定义通常包含以下字段:
name:仓库描述名称baseurl:仓库地址,支持file://、http://、https://、ftp://enabled:1 启用,0 禁用gpgcheck:1 启用 GPG 验证,0 禁用gpgkey:GPG 公钥路径,可为本地文件或 URLcost:仓库优先级成本,数值越小优先级越高priority:仓库优先级,数值越小越优先
多仓库定义可以放在同一个 .repo 文件中,每个以 [repo_id] 开头。使用 exclude 字段排除特定软件包,includepkgs 只允许安装指定包,metadata_expire 控制元数据缓存过期时间(默认 48 小时)。多仓库共存时,DNF 选择 cost 最低的仓库;cost 相同时,priority 最小的仓库优先。
本地仓库与 GPG 验证
在离线环境或内部镜像场景,可使用 createrepo_c 创建本地仓库 [3]:
cd /srv/repo/
createrepo_c .
生成的 repodata/ 目录包含仓库元数据。本地仓库的 .repo 文件指向该目录:
[localrepo]
name=Local Repository
baseurl=file:///srv/repo/
enabled=1
gpgcheck=0
对于生产环境,应启用 GPG 签名验证。导入公钥后设置 gpgcheck=1 和 gpgkey 路径 [2]:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-example
GPG 验证可防止安装被篡改的软件包,官方建议不要在生产环境禁用。
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
| 仓库 metadata 下载失败 | baseurl 不可达或网络不通 | 检查 URL 和网络,或切换 mirrorlist |
| GPG 验证失败 | 公钥未导入或密钥不匹配 | rpm --import 导入正确公钥 |
| 仓库未生效 | .repo 文件权限或语法错误 | 检查文件权限和 INI 格式 |
| 包安装仍从其他仓库获取 | priority/cost 设置不当 | 调整仓库优先级或使用 --repo 指定 |
| createrepo_c 报错 | repodata 目录损坏 | 删除 repodata/ 重新生成 |
局限性
- 本文基于 RHEL 8 官方文档和 DNF man page 编写,WSL2 环境为 Ubuntu 24.04(非 RPM 发行版),dnf config-manager 和 createrepo_c 已在 WSL2 上验证基本功能,但 RHEL 8 特有的仓库(如 AppStream、BaseOS)未实际测试
- RHEL 8 的 subscription-manager 和 CDN 仓库配置(/etc/yum.repos.d/redhat.repo)仅适用于注册的 RHEL 系统,未在 WSL2 中验证
- 本地仓库 createrepo_c 生成的元数据格式需与目标发行版的 DNF 版本兼容
附录
yum-config-manager --add-repo <URL>成功创建 .repo 文件,格式为[repo_id]+name+baseurl+enabled=1createrepo_c .在空目录成功生成 repodata/ 元数据目录- dnf config-manager
--enable/--disable参数可切换仓库状态 - RHEL 8 使用 YUM v4(基于 DNF),
yum命令为dnf的兼容别名
参考资料
- [1] dnf.conf(5) – DNF Configuration Reference(dnf-conf-man)
- [2] Managing custom software repositories | RHEL 8(rhel-repo-doc)
- [3] Managing repositories | RHEL 8 Edge images(rhel-createrepo)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。