一、DNF本地仓库概述
1.1 什么是DNF仓库
DNF(Dandified YUM) 是新一代的RPM包管理工具,自Fedora 18、RHEL/CentOS 8起成为默认包管理器。它解决了YUM的一些遗留问题,在依赖解析、内存占用、事务处理等方面都有显著优化。
DNF仓库是集中存储软件包及其元数据的服务器或本地目录,当用户执行软件包安装、更新操作时,DNF工具会从配置的仓库中获取所需的软件包及其依赖关系信息。仓库核心由两部分组成:软件包(RPM)和仓库索引文件(repodata目录,记录包信息与依赖关系)。
1.2 适用场景
| 场景 | 说明 |
|---|---|
| 离线环境 | 服务器无法连接互联网,需要通过ISO镜像或本地目录提供软件安装源 |
| 企业内部 | 多台服务器需要统一软件版本和安装源,通过本地仓库统一管控 |
| 快速部署 | 局域网内通过HTTP/FTP/NFS共享仓库,实现快速批量安装 |
| 实验测试 | 在没有RHEL订阅的情况下,搭建本地仓库进行软件包安装测试 |
DNF仓库分为本地仓库(本地磁盘、NFS共享)和网络仓库(官方源、第三方源),本文聚焦于本地仓库的搭建。
二、环境准备
2.1 系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | RHEL/CentOS 8+、Fedora 18+、Rocky Linux、openEuler 等支持DNF的发行版 |
| 用户权限 | root 身份执行,或普通用户使用 sudo |
| 磁盘空间 | 根据软件包数量准备足够空间,完整ISO仓库建议预留 10GB 以上 |
2.2 安装必备工具
# 安装 createrepo 工具(用于生成仓库元数据)
dnf install -y createrepo
# 可选:安装 dnf-plugins-core(提供 config-manager 命令)
dnf install -y dnf-plugins-core
# 可选:安装 dnf-utils
dnf install -y dnf-utils
关键工具说明:
| 工具 | 说明 |
|---|---|
createrepo / createrepo_c | 扫描RPM包目录,生成 repodata 元数据文件,是仓库创建的核心工具。createrepo_c 是C语言实现的更快版本,RHEL 8+ 系统通常预装 |
dnf config-manager | 管理仓库配置(添加、启用、禁用) |
三、方法一:基于ISO镜像创建本地源(推荐离线场景)
3.1 操作步骤总览
| 步骤 | 操作 | 说明 |
|---|---|---|
| ① | 挂载ISO镜像 | 将系统安装ISO挂载到本地目录 |
| ② | 复制软件包 | 将ISO中的RPM包复制到仓库目录 |
| ③ | 生成元数据 | 使用createrepo生成repodata索引 |
| ④ | 配置仓库文件 | 在/etc/yum.repos.d/创建.repo文件 |
| ⑤ | 验证仓库 | 清理缓存并列出可用软件包 |
3.2 详细步骤
步骤①:挂载ISO镜像
# 创建ISO挂载目录和仓库根目录
mkdir -p /mnt/iso /data/dnf-repo
# 挂载系统ISO镜像(替换为实际ISO文件路径)
mount -o loop /path/to/CentOS-8-x86_64-dvd.iso /mnt/iso
其中 /path/to/CentOS-8-x86_64-dvd.iso 需替换为实际的ISO镜像文件路径。
步骤②:复制软件包到仓库目录
# 将ISO内所有包及元数据复制到仓库目录(避免ISO卸载后失效)
cp -r /mnt/iso/* /data/dnf-repo/
说明:将内容复制到仓库目录可以确保即使卸载ISO也能正常使用仓库。
步骤③:生成/更新仓库元数据
# 生成仓库元数据(repodata目录)
createrepo /data/dnf-repo/
如果ISO已经包含 repodata 目录,此步骤可以跳过。但如果是自定义混合包或更新了包内容,则必须执行。
步骤④:配置仓库文件
在 /etc/yum.repos.d/ 目录下创建 .repo 文件:
vim /etc/yum.repos.d/local-dvd.repo
文件内容如下:
[local-dvd]
name=Local DNF Repository - DVD ISO
baseurl=file:///data/dnf-repo
enabled=1
gpgcheck=0
仓库文件各参数含义:
| 参数 | 含义 | 示例 |
|---|---|---|
[仓库ID] | 仓库唯一标识,不可重复 | [local-dvd] |
name | 仓库描述性名称 | Local DNF Repository |
baseurl | 仓库URL地址 | file:///data/dnf-repo(本地绝对路径) |
enabled | 是否启用:1启用,0禁用 | 1 |
gpgcheck | 是否检查GPG签名:1启用,0禁用 | 0 |
gpgkey | GPG公钥文件路径 | file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS |
步骤⑤:验证仓库配置
# 清理DNF缓存
dnf clean all
# 列出所有可用仓库
dnf repolist
# 查看仓库详细信息
dnf repolist -v
# 列出仓库中的软件包
dnf list available --repo=local-dvd
3.3 注意事项
baseurl使用file://协议时需提供绝对路径,如file:///data/dnf-repo(三个斜杠)- 建议先在
/etc/yum.repos.d/下创建备份目录,将原有.repo文件移入备份,避免源冲突 - 如果系统原带多个repo文件,可先禁用不需要的仓库:
dnf config-manager --set-disable <仓库ID>
四、方法二:创建自定义软件包目录仓库(灵活管理)
4.1 操作步骤总览
| 步骤 | 操作 | 说明 |
|---|---|---|
| ① | 准备RPM包 | 收集所需RPM包到统一目录 |
| ② | 生成元数据 | 执行createrepo生成索引 |
| ③ | 配置仓库文件 | 创建.repo文件指向目录 |
| ④ | 验证测试 | 刷新并安装软件验证 |
4.2 详细步骤
步骤①:创建目录并放入RPM包
# 创建仓库目录
mkdir -p /data/local-repo
# 将RPM包复制到该目录
cp /path/to/*.rpm /data/local-repo/
步骤②:生成仓库元数据
# 进入目录并生成索引
cd /data/local-repo
createrepo -d .
-d 参数表示生成SQLite数据库文件,能加快包查询速度。
如果后续新增了RPM包,需要更新索引:
createrepo --update -d /data/local-repo/
步骤③:配置仓库文件
vim /etc/yum.repos.d/local-custom.repo
文件内容:
[local-custom]
name=Local Custom DNF Repository
baseurl=file:///data/local-repo
enabled=1
gpgcheck=0
步骤④:验证测试
# 清理缓存并刷新仓库
dnf clean all
dnf repolist -v
# 测试安装软件包
dnf -y install <package-name>
五、方法三:使用dnf local插件(自动收集已下载包)
5.1 插件简介
dnf local 插件可以自动将所有已下载的包复制到本地文件系统的仓库中,并生成仓库元数据。适合希望自动构建本地缓存仓库的场景。
5.2 配置步骤
① 安装插件
dnf install -y dnf-plugins-core
② 配置插件
编辑配置文件 /etc/dnf/plugins/local.conf:
[main]
enabled = true
[createrepo]
enabled = true
可指定仓库路径(默认为 /var/lib/dnf/plugins/local/):
[main]
enabled = true
repodir = /data/dnf-local-repo
[createrepo]
enabled = true
注意:生成元数据功能需要安装
createrepo_c包才能正常工作。
③ 验证
# 安装任意软件包后,检查仓库目录
ls /data/dnf-local-repo/
配置完成后,此后通过DNF安装的每一个RPM包都会被自动复制到本地仓库目录中,并自动更新仓库元数据。
六、扩展:配置网络共享仓库
如果希望局域网内多台服务器共享本地仓库,可通过HTTP、FTP或NFS发布。
6.1 HTTP方式发布
# 安装并启动httpd
dnf install -y httpd
systemctl start httpd && systemctl enable httpd
# 将仓库目录链接到Web目录
ln -s /data/dnf-repo /var/www/html/dnf-repo
# 客户端配置
# baseurl=http://<服务器IP>/dnf-repo
6.2 FTP方式发布
# 安装并配置vsftpd
dnf install -y vsftpd
vim /etc/vsftpd/vsftpd.conf # 设置 anonymous_enable=YES
systemctl start vsftpd && systemctl enable vsftpd
# 复制包到FTP目录
cp -r /data/dnf-repo /var/ftp/
# 客户端配置
# baseurl=ftp://<服务器IP>/dnf-repo
6.3 NFS方式共享
# 服务端:安装NFS服务
dnf install -y nfs-utils
echo "/data/dnf-repo 192.168.1.0/24(rw,sync,no_root_squash)" > /etc/exports
systemctl start nfs-server && systemctl enable nfs-server
exportfs -rv
# 客户端:挂载NFS
mkdir -p /mnt/nfs-dnf
mount -t nfs <服务器IP>:/data/dnf-repo /mnt/nfs-dnf
# baseurl=file:///mnt/nfs-dnf
以上配置参考了常见网络共享方式。
七、常用管理命令速查
| 操作 | 命令 |
|---|---|
| 清理DNF缓存 | dnf clean all |
| 列出所有仓库 | dnf repolist |
| 查看仓库详细信息 | dnf repolist -v |
| 查看仓库中的软件包 | dnf list available --repo=<仓库ID> |
| 搜索软件包 | dnf search <关键词> |
| 安装软件包 | dnf install -y <包名> |
| 卸载软件包 | dnf remove <包名> |
| 查看软件包信息 | dnf info <包名> |
| 添加仓库 | dnf config-manager --add-repo <URL> |
| 禁用仓库 | dnf config-manager --set-disable <仓库ID> |
| 启用仓库 | dnf config-manager --set-enable <仓库ID> |
| 更新元数据(自定义仓库) | createrepo --update -d <目录> |
八、常见问题与排错
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
dnf repolist 看不到新仓库 | 仓库文件未生效 | 检查 .repo 文件是否以 .repo 结尾,路径是否正确 |
| 安装包报找不到 | 元数据未生成或未刷新缓存 | 执行 createrepo <目录> 后再 dnf clean all |
baseurl 报错 | 路径格式错误 | 本地路径使用 file:///绝对路径(三个斜杠) |
| GPG签名检查失败 | 签名不匹配 | 可在 .repo 文件中设置 gpgcheck=0(仅限受信任的内部环境) |
| 多仓库冲突 | 多个仓库提供同名包 | 设置 priority 参数控制优先级,数值越小优先级越高 |
九、总结
创建本地DNF源仓库的整体流程可归纳为以下核心步骤:
flowchart TD
A[准备RPM包或ISO镜像] --> B[使用createrepo生成元数据]
B --> C[在/etc/yum.repos.d/创建.repo文件]
C --> D[清理缓存:dnf clean all]
D --> E[验证仓库:dnf repolist]
E --> F{需要网络共享?}
F -->|是| G[配置HTTP/FTP/NFS发布]
F -->|否| H[完成]
G --> H
关键要点回顾:
- 核心工具:
createrepo用于生成仓库元数据 - 配置位置:
/etc/yum.repos.d/目录下的.repo文件定义仓库 - 验证标准:执行
dnf repolist能正确显示仓库即为配置成功
三种方法的选择建议:
- 离线服务器 → 推荐方法一(ISO镜像)
- 自定义软件集 → 推荐方法二(自定义目录)
- 长期使用、自动积累 → 推荐方法三(local插件)
如果需要配置局域网内共享,可进一步搭建HTTP/FTP/NFS服务将本地仓库发布为网络源。