使用DNF工具创建本地DNF源仓库操作文档

一、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
gpgkeyGPG公钥文件路径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服务将本地仓库发布为网络源。