1、概述
DNF(Dandified YUM)是一个在基于 Red Hat 的 Linux 发行版(如 Fedora、CentOS、RHEL)上用于管理软件包的包管理器。它是 YUM 的下一代版本,提供了更多功能和改进。
RHEL8中默认使用的软件批量管理工具由原版本的yum换成了速度更快的dnf,原有的yum命令仅为dnf的软链接,当然依旧可以使用的。
dnf源文件所在目录依旧为/etc/yum.repos.d/下,但官方在发布Beta版本时并没有为此系统自带源文件,需要我们自行下载准备。
[root@kwephis47629719 bin]# cat /etc/dnf/dnf.conf [main] gpgcheck=1 installonly_limit=3 clean_requirements_on_remove=True best=True skip_if_unavailable=False sslverify=False [root@kwephis47629719 bin]# cd /etc/yum.repos.d/ [root@kwephis47629719 yum.repos.d]# ll total 4.0K -rw-r--r--. 1 root root 1.7K Jan 29 2022 openEuler.repo [root@kwephis47629719 yum.repos.d]# vi openEuler.repo [root@kwephis47629719 yum.repos.d]# echo "" > openEuler.repo [root@kwephis47629719 yum.repos.d]# uname -a Linux kwephis47629719 5.10.0-60.18.0.50.oe2203.x86_64 #1 SMP Wed Mar 30 03:12:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux [root@kwephis47629719 yum.repos.d]# cat /etc/os-release NAME="openEuler" VERSION="22.03 LTS" ID="openEuler" VERSION_ID="22.03" PRETTY_NAME="openEuler 22.03 LTS" ANSI_COLOR="0;31" [root@kwephis47629719 yum.repos.d]# vi openEuler.repo [root@kwephis47629719 yum.repos.d]# dnf clean all 0 files removed [root@kwephis47629719 yum.repos.d]# dnf makecache openEuler-everything 13 MB/s | 16 MB 00:01 openEuler-epol 4.9 MB/s | 2.6 MB 00:00 openEuler-update 14 MB/s | 85 MB 00:06 Metadata cache created. [root@kwephis47629719 yum.repos.d]#2、dnf常用命令介绍
语法基本和之前的yum命令没啥区别。一般情况下,操作系统中会存在两个dnf命令,分别是dnf和dnf-3。
[root@kwephis47629719 etc]# dnf dnf dnf-3但是本质上来说都是用的dnf-3,因为在执行文件中,dnf命令创建了软连接指向dnf-3
[root@kwephis47629719 bin]# ll | grep dnf lrwxrwxrwx. 1 root root 22 Jan 22 2022 debuginfo-install -> /usr/libexec/dnf-utils lrwxrwxrwx. 1 root root 5 Mar 21 2022 dnf -> dnf-3 -rwxr-xr-x. 1 root root 1.9K Mar 21 2022 dnf-3因此,平常使用dnf进行软件包管理的时候,只需要使用dnf命令即可,简化命令。
2.1、安装命令
# 安装软件包
[root@kwephis47629719 ~]# dnf install bash-completion.noarch Last metadata expiration check: 1:35:49 ago on Sun 17 Aug 2025 12:11:52 PM CST. Package bash-completion-1:2.11-3.oe2203.noarch is already installed. Dependencies resolved. Nothing to do. Complete!# 重新安装
[root@kwephis47629719 ~]# dnf reinstall -y bash-completion.noarch Last metadata expiration check: 1:36:29 ago on Sun 17 Aug 2025 12:11:52 PM CST. Dependencies resolved. ========================================================================================================================================================================================== Package Architecture Version Repository Size ========================================================================================================================================================================================== Reinstalling: bash-completion noarch 1:2.11-3.oe2203 openEuler-update 259 k Transaction Summary ========================================================================================================================================================================================== Total download size: 259 k Installed size: 874 k Downloading Packages: bash-completion-2.11-3.oe2203.noarch.rpm 914 kB/s | 259 kB 00:00 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Total 909 kB/s | 259 kB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Reinstalling : bash-completion-1:2.11-3.oe2203.noarch 1/2 Cleanup : bash-completion-1:2.11-3.oe2203.noarch 2/2 Verifying : bash-completion-1:2.11-3.oe2203.noarch 1/2 Verifying : bash-completion-1:2.11-3.oe2203.noarch 2/2 Reinstalled: bash-completion-1:2.11-3.oe2203.noarch Complete!2.2、更新软件包
# 更新单个软件包 dnf update -y packagename # 更新所有软件包 dnf update2.3、删除软件包
# 删除软件包 dnf remove # 删除不需要的依赖项 dnf autoremove2.4、查询操作
# 查询软件包 dnf search 关键字 [root@kwephis47629719 ~]# dnf search bash# 查询所有已经安装的软件包 dnf list installed 或者 dnf list installed | grep bash [root@kwephis47629719 ~]# dnf list installed | grep bash bash.x86_64 5.1.8-6.oe2203 @openEuler-update bash-completion.noarch 1:2.11-3.oe2203 @openEuler-update libvirt-bash-completion.x86_64 6.2.0-64.oe2203 @openEuler-update另外还有一些常用的查询操作,可以根据需要灵活选择。
# 列出所有可用软件包 dnf list available # 显示软件包信息 dnf info # 查看软件包提供的文件 dnf provides2.4、dnf 常用选项
| 选项 | 说明 |
|---|---|
-y | 自动回答"yes" |
-q | 安静模式,减少输出 |
-v | 详细输出 |
--refresh | 在操作前刷新仓库元数据 |
--nogpgcheck | 禁用 GPG 签名检查 |
--skip-broken | 跳过有问题的软件包 |
--best | 尝试安装最佳可用版本 |
3、dnf配置文件
dnf 的主要配置文件位于/etc/dnf/dnf.conf,常见的配置项包括:
[main] gpgcheck=1 # 是否检查GPG签名 installonly_limit=3 # 保留的内核版本数量 clean_requirements_on_remove=True # 删除时清理依赖 best=True # 总是尝试安装最佳版本dnf的配置文件跟yum的配置文件配置内容相同,一般修改了yum.conf配置文件,dnf.conf文件就自动修改了,因为yum.conf文件是一个软链接文件
[root@kwephis47629719 ~]# ll /etc/yum.conf lrwxrwxrwx 1 root root 12 Sep 6 2023 /etc/yum.conf -> dnf/dnf.conf [root@kwephis47629719 ~]#DNF下载离线安装包
下面以下载docker离线安装包为例进行操作演示,我们的目标是为 Docker CE 下载所有必要的 RPM 包,以便在没有网络连接的服务器上进行离线安装。这些包包括:
docker-ce
docker-ce-cli
containerd.io
准备工作
确保在线环境:执行下载操作的机器必须能够访问互联网,并且可以连接到你配置好的 DNF 软件源。
安装 DNF 插件:虽然 dnf core 已包含下载功能,但一些高级特性(如仓库管理)需要安装插件集。
dnf install -y dnf-plugins-core
创建下载目录:创建一个专门的目录用于存放下载下来的 RPM 包,保持文件系统整洁。
# 在用户主目录下创建一个名为 offline_pkgs 的文件夹 mkdir -p ~/offline_pkgs执行离线包下载命令
这是最关键的一步。我们将使用 dnf install 命令,并配合几个关键参数来实现离线下载。
# 切换到我们刚才创建的下载目录 cd ~/offline_pkgs # 执行核心下载命令 dnf install --downloadonly --downloadir=./ docker-ce docker-ce-cli containerd.io命令参数解释
- dnf install ...: dnf 的标准安装命令。
- --downloadonly: 这是魔法参数。它告诉 DNF 不要执行实际的安装过程,而是将所有需要下载的 RPM 包下载到指定的目录中。
- --downloadir=./: 指定下载 RPM 包的目标目录。./ 表示当前目录(也就是我们刚刚进入的 ~/offline_pkgs)。
- docker-ce docker-ce-cli containerd.io: 你想要下载的软件包列表。也可以指定版本号
在某些情况下,你可能需要添加以下参数来确保下载过程更稳定、更完整。会用到一些可选的但是推荐的参数
- --skip-brupted: 在复杂的依赖树中,有些包可能无法解析(比如测试包或不维护的旧包)。这个参数会跳过这些有问题的依赖,让 DNF 继续下载其他可以解析的包,避免整个过程因一个坏依赖而失败。对于离线安装,这通常很有用。
dnf install --downloadonly --downloaddir=./ --skip-brupted docker-ce docker-ce-cli containerd.io- --setopt=tsflags=test,dontinstall: 这个参数组合非常强大。
tsflags=test: DNF 的 ts (transaction script) 机制会给 RPM 包打上标记,如 test、``(空,代表正常)、dontinstall 等。tsflags=test 强制 DNF 将所有下载的包标记为 test 包,这样可以防止它们在后续导入后被意外执行 dnf update 更新。
tsflags=dontinstall: 这个标记会阻止 DNF 在导入这些 RPM 后,认为它们是“已安装”的。
综合效果:这两个标记可以确保你导入的离线 RPM 包包池干净,并被 DNF 识别为“外部安装”的,而不是由 DNF 管理的。这是进行离线安装时的最佳实践。
dnf install --downloadonly --downloadir=./ --setopt=tsflags=test,dontinstall docker-ce docker-ce-cli containerd.io命令执行后,你会看到一个熟悉的 DNF 依赖解析过程,所有需要的 RPM 文件(以及它们的依赖)都会被下载到 ~/offline_pkgs 目录中。
验证结果
下载完成后,检查一下目录里有什么。
# 列出下载目录中的内容 ls -F ~/offline_pkgs你应该能看到一堆 .rpm 文件,可能还会看到一个 repodata 目录。这个 repodata 目录非常重要,它包含了 RPM 包的元数据和索引,使得离线环境中的 DNF 能够知道这些包是什么,以及它们之间的依赖关系。
离线服务器安装
现在,你的离线 RPM 包已经准备好了。下一步就是将它们传输到目标(离线)服务器上。
# 假设目标服务器是 192.168.1.100,用户名是 root # 将整个下载目录打包,方便传输 cd ~ tar -czvf offline_docker_packages.tar.gz offline_pkgs/ # 使用 scp (安全拷贝) 命令传输打包文件 scp offline_docker_packages.tar.gz root@192.168.1.100:/root/ 在目标服务器上,解压这个包即可: # 在目标离线服务器上执行 cd /root tar -xzvf offline_docker_packages.tar.gz # 解压后,你将得到一个 /root/offline_pkgs 目录,里面就是所有需要的 RPM 文件最后一步,在目标(离线)服务器上,使用 DNF 的本地安装功能来安装这些包。
# 切换到解压后的 RPM 包目录 cd /root/offline_pkgs # 使用 DNF 从本地目录安装 # dnf 会自动解析 repodata 中的依赖关系并按正确顺序安装所有包 dnf localinstall ./*.rpm -ylocalinstall 命令非常智能,它会:
- 查看当前目录下的 repodata。
- 分析要安装的包及其依赖。
- 在当前目录中找到所有满足依赖的 RPM 包。
- 按照正确的依赖顺序依次安装它们。
FAQ
1、OpenEuler操作系统搜不到yum-utils工具包
你在 OpenEuler 操作系统的镜像源中搜索不到 yum-utils 工具包,最核心、最主要的原因是:OpenEuler 默认的包管理器和核心工具集是 DNF,而不是 YUM。
yum-utils 是 YUM 包管理器的工具集。它的命名已经清晰地表明了它的归属和定位。当你的操作系统从一个生态迁移到另一个生态时,底层的工具链往往会发生根本性的变化。
- 生态系统的变化:OpenEuler 是一个独立的、基于 Linux 内核的操作系统发行版,它由华为主导并捐赠给了开放原子开源基金会。它有自己的软件生态系统和构建标准,与 CentOS/RHEL 的生态系统虽然同源(都源于 Fedora/RPM),但已经分道扬镳。
- 默认包管理器:OpenEuler 及其衍生版本(如 AnolisOS)已经全面拥抱 DNF 作为下一代包管理器。DNF 是 YUM 的一个分支和现代化改进版,解决了 YUM 的一些性能、依赖解析和插件架构上的问题,是目前 Fedora、RHEL 8+ 及后续版本的默认选择。
- 包名的演变:由于默认管理器变成了 DNF,与之配套的工具集也相应地被 dnf-plugins-core 所取代。你试图在 OpenEuler 的源里找一个来自“竞争对手”(YUM 生态)的核心工具包,自然是找不到的。
解决方案就非常明确了:**放弃寻找 yum-utils,转而安装和使用 DNF 的对应工具 dnf-plugins-core
openEuler上面基本都是可以直接使用yumdownloader命令的,当然也可以使用dnf下载离线包的命令
dnf install -y dnf-plugins-core 或者 yum install -y dnf-plugins-core安装成功后,你会看到一系列 DNF 插件被安装,例如:
- config-manager: 用于管理仓库的启用和禁用。这对应于 yum-utils 里的 yum-config-manager。
- download-only: 用于只下载不安装。这对应于 yum-utils 里的yumdownloader。
- leaves: 用于查找系统中孤立的、没有被其他包依赖的包。
- 等等...
问题 | 原因 | 解决方案 |
|---|---|---|
在 OpenEuler 中找不到 | OpenEuler 默认使用 | 安装并使用 OpenEuler 生態中的对应工具:** |
核心命令 |
|
|
下载工具 |
|
|
源管理工具 |
|
|