YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RHEL、CentOS、OEL中的Shell前端软件包管理器。
YUM本身基于RPM包管理,能够从指定的YUM源服务器(一个或多个)自动下载RPM包并且进行安装和更新,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
要成功的使用 YUM 工具安装更新软件或系统,就需要有一个包含各种RPM软件包的repository(软件仓库),这个软件仓库我们习惯称为YUM源 (可以是本地源、网络源)。
就好像你要吃个回锅肉,只买肉回来肯定不行,你还得有油盐酱醋锅碗瓢盆等,传统的RPM安装方式就相当于你去超市一样一样的买全,而YUM则会在你买肉的同时把你所依赖的其他东西一次打包完成。
DNF (全称为Dandified yum)是新一代的rpm软件包管理器,他首先出现在 Fedora 18 这个发行版中。而最近,它取代了yum,正式成为 Fedora 22 的包管理器。
DNF在RHEL、CentOS、OEL等系统中,从版本8开始出现,目前和YUM共存。
DNF克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。
DNF使用Hawkey库,该库解析RPM依赖性以在客户端计算机上运行查询。 它们基于libsolv构建,libsolv是一种使用可满足性算法的程序包相关性求解器。 您可以在libsolv的GitHub存储库中找到有关该算法的更多详细信息。
YUM和DNF对比
以下操作环境为centos stream 9
软件版本对比
DNF和YUM的版本相同,而且软件包的名字竟然都是DNF。
[root@localhost home]# dnf --version 4.14.0 已安装: dnf-0:4.14.0-8.el9.noarch 在 2023年10月28日 星期六 07时52分41秒 构建 :builder@centos.org 在 2023年06月29日 星期四 08时27分49秒 已安装: rpm-0:4.16.1.3-25.el9.x86_64 在 2023年10月28日 星期六 07时52分29秒 构建 :builder@centos.org 在 2023年06月30日 星期五 14时49分47秒 [root@localhost home]# yum --version 4.14.0 已安装: dnf-0:4.14.0-8.el9.noarch 在 2023年10月28日 星期六 07时52分41秒 构建 :builder@centos.org 在 2023年06月29日 星期四 08时27分49秒 已安装: rpm-0:4.16.1.3-25.el9.x86_64 在 2023年10月28日 星期六 07时52分29秒 构建 :builder@centos.org 在 2023年06月30日 星期五 14时49分47秒
帮助对比
[root@localhost home]# dnf --help usage: dnf [options] COMMAND 主要命令列表: alias 列出或创建命令别名 autoremove 删除所有原先因为依赖关系安装的不需要的软件包 check 在包数据库中寻找问题 check-update 检查是否有软件包升级 clean 删除已缓存的数据 deplist [已弃用,请使用 repoquery --deplist] 列出软件包的依赖关系和提供这些软件包的源 distro-sync 同步已经安装的软件包到最新可用版本 downgrade 降级包 group 显示或使用组信息 help 显示一个有帮助的用法信息 history 显示或使用事务历史 info 显示关于软件包或软件包组的详细信息 install 向系统中安装一个或多个软件包 list 列出一个或一组软件包 makecache 创建元数据缓存 mark 在已安装的软件包中标记或者取消标记由用户安装的软件包。 module 与模块交互。 provides 查找提供指定内容的软件包 reinstall 重装一个包 remove 从系统中移除一个或多个软件包 repolist 显示已配置的软件仓库 repoquery 搜索匹配关键字的软件包 repository-packages 对指定仓库中的所有软件包运行命令 search 在软件包详细信息中搜索指定字符串 shell 运行一个交互式的 DNF shell swap 运行一个交互式的 DNF mod 以删除或安装 spec updateinfo 显示软件包的参考建议 upgrade 升级系统中的一个或多个软件包 upgrade-minimal 升级,但只有“最新”的软件包已修复可能影响你的系统的问题 插件命令列表: builddep Install build dependencies for package or spec file changelog 查看软件包的改变日志数据 config-manager 管理 dnf 配置选项和软件仓库 copr 与 Copr 仓库交互。 debug-dump 转储已安装的 RPM 软件包信息至文件 debug-restore 恢复调试用转储文件中的软件包记录 debuginfo-install 安装调试信息软件包 download 下载软件包至当前目录 groups-manager 创建并编辑组元数据文件 needs-restarting 判断所升级的二进制文件是否需要重启 offline-distrosync 准备系统的离线 distrosync offline-upgrade 准备系统的离线升级 playground 与 Playground 仓库交互。 repoclosure 显示仓库中未被解决的依赖关系的列表 repodiff 列出两组仓库中的不同 repograph 以点线图方式输出完整的软件包依赖关系图 repomanage 管理 RPM 软件包目录 reposync 下载远程仓库中的全部软件包 system-upgrade 准备系统以升级到新版本 General DNF options: -c [config file], --config [config file] 配置文件位置 -q, --quiet 静默执行 -v, --verbose 详尽执行 --version 显示 DNF 的版本并退出 --installroot [path] 设置目标根目录 --nodocs 不要安装文档 --noplugins 禁用所有插件 --enableplugin [plugin] 启用指定名称的插件 --disableplugin [plugin] 禁用指定名称的插件 --releasever RELEASEVER 覆盖在配置文件和仓库文件中 $releasever 的值 --setopt SETOPTS 设置任意配置和仓库选项 --skip-broken 通过跳过软件包来解决依赖问题 -h, --help, --help-cmd 显示命令帮助 --allowerasing 允许解决依赖关系时删除已安装软件包 -b, --best 在事务中尝试最佳软件包版本。 --nobest 不将事务限制在最佳候选 -C, --cacheonly 完全从系统缓存运行,不升级缓存 -R [minutes], --randomwait [minutes] 最大命令等待时间 -d [debug level], --debuglevel [debug level] 调试输出级别 --debugsolver 转储详细解决结果至文件 --showduplicates 在 list/search 命令下,显示仓库里重复的条目 -e ERRORLEVEL, --errorlevel ERRORLEVEL 错误输出级别 --obsoletes 对 upgrade 启用 dnf 的过期处理逻辑,或对 info、list 和 repoquery 启用软件包过期的显示功能 --rpmverbosity [debug level name] rpm调试输出等级 -y, --assumeyes 全部问题自动应答为是 --assumeno 全部问题自动应答为否 --enablerepo [repo] 为当前 dnf 命令临时启用仓库。接受一个 id、以逗号分隔的多个 id 列表,或 ids glob。此选项可多次指定。 --disablerepo [repo] 为当前 dnf 命令临时禁用仓库。接受一个 id、以逗号分隔的多个 id 列表,或 ids glob。此选项可多次指定,但它与 `--repo` 是相互排斥的。 --repo [repo], --repoid [repo] 启用指定 id 或 glob 的仓库,可以指定多次 --enable 使用 config-manager 命令启用 repos (自动保存) --disable 使用 config-manager 命令禁用 repos (自动保存) -x [package], --exclude [package], --excludepkgs [package] 用全名或通配符排除软件包 --disableexcludes [repo], --disableexcludepkgs [repo] 禁用 excludepkgs --repofrompath [repo,path] 附加仓库所要使用的标签和路径(与 baseurl 中的路径一致),可以指定多次。 --noautoremove 禁用删除不再被使用的依赖软件包 --nogpgcheck 禁用 gpg 签名检查 (如果 RPM 策略允许) --color COLOR 配置是否使用颜色 --refresh 在运行命令之前将元数据标记为过期 -4 仅解析 IPv4 地址 -6 仅解析 IPv6 地址 --destdir DESTDIR, --downloaddir DESTDIR 设置软件包要复制到的目录 --downloadonly 仅下载软件包 --comment COMMENT 为事务添加一个注释 --bugfix 在更新中包括与 bug 修复有关的软件包 --enhancement 在更新中包括与功能增强有关的软件包 --newpackage 在更新中包括与新软件包有关的软件包 --security 在更新中包括与安全有关的软件包 --advisory ADVISORY, --advisories ADVISORY 在更新中包括修复指定公告所必须的软件包 --bz BUGZILLA, --bzs BUGZILLA 在更新中包括修复给定 BZ 所必须的软件包 --cve CVES, --cves CVES 在更新中包括修复给定 CVE 所必须的软件包 --sec-severity {Critical,Important,Moderate,Low}, --secseverity {Critical,Important,Moderate,Low} 在更新中包括匹配给定安全等级的安全相关的软件包 --forcearch ARCH 强制使用一个架构
[root@localhost home]# yum help usage: yum [options] COMMAND 主要命令列表: alias 列出或创建命令别名 autoremove 删除所有原先因为依赖关系安装的不需要的软件包 check 在包数据库中寻找问题 check-update 检查是否有软件包升级 clean 删除已缓存的数据 deplist [已弃用,请使用 repoquery --deplist] 列出软件包的依赖关系和提供这些软件包的源 distro-sync 同步已经安装的软件包到最新可用版本 downgrade 降级包 group 显示或使用组信息 help 显示一个有帮助的用法信息 history 显示或使用事务历史 info 显示关于软件包或软件包组的详细信息 install 向系统中安装一个或多个软件包 list 列出一个或一组软件包 makecache 创建元数据缓存 mark 在已安装的软件包中标记或者取消标记由用户安装的软件包。 module 与模块交互。 provides 查找提供指定内容的软件包 reinstall 重装一个包 remove 从系统中移除一个或多个软件包 repolist 显示已配置的软件仓库 repoquery 搜索匹配关键字的软件包 repository-packages 对指定仓库中的所有软件包运行命令 search 在软件包详细信息中搜索指定字符串 shell 运行一个交互式的 YUM shell swap 运行一个交互式的 YUM mod 以删除或安装 spec updateinfo 显示软件包的参考建议 upgrade 升级系统中的一个或多个软件包 upgrade-minimal 升级,但只有“最新”的软件包已修复可能影响你的系统的问题 插件命令列表: builddep Install build dependencies for package or spec file changelog 查看软件包的改变日志数据 config-manager 管理 yum 配置选项和软件仓库 copr 与 Copr 仓库交互。 debug-dump 转储已安装的 RPM 软件包信息至文件 debug-restore 恢复调试用转储文件中的软件包记录 debuginfo-install 安装调试信息软件包 download 下载软件包至当前目录 groups-manager 创建并编辑组元数据文件 needs-restarting 判断所升级的二进制文件是否需要重启 offline-distrosync 准备系统的离线 distrosync offline-upgrade 准备系统的离线升级 playground 与 Playground 仓库交互。 repoclosure 显示仓库中未被解决的依赖关系的列表 repodiff 列出两组仓库中的不同 repograph 以点线图方式输出完整的软件包依赖关系图 repomanage 管理 RPM 软件包目录 reposync 下载远程仓库中的全部软件包 system-upgrade 准备系统以升级到新版本 显示一个有帮助的用法信息 General YUM options: -c [config file], --config [config file] 配置文件位置 -q, --quiet 静默执行 -v, --verbose 详尽执行 --version 显示 YUM 的版本并退出 --installroot [path] 设置目标根目录 --nodocs 不要安装文档 --noplugins 禁用所有插件 --enableplugin [plugin] 启用指定名称的插件 --disableplugin [plugin] 禁用指定名称的插件 --releasever RELEASEVER 覆盖在配置文件和仓库文件中 $releasever 的值 --setopt SETOPTS 设置任意配置和仓库选项 --skip-broken 通过跳过软件包来解决依赖问题 -h, --help, --help-cmd 显示命令帮助 --allowerasing 允许解决依赖关系时删除已安装软件包 -b, --best 在事务中尝试最佳软件包版本。 --nobest 不将事务限制在最佳候选 -C, --cacheonly 完全从系统缓存运行,不升级缓存 -R [minutes], --randomwait [minutes] 最大命令等待时间 -d [debug level], --debuglevel [debug level] 调试输出级别 --debugsolver 转储详细解决结果至文件 --showduplicates 在 list/search 命令下,显示仓库里重复的条目 -e ERRORLEVEL, --errorlevel ERRORLEVEL 错误输出级别 --obsoletes 对 upgrade 启用 yum 的过期处理逻辑,或对 info、list 和 repoquery 启用软件包过期的显示功能 --rpmverbosity [debug level name] rpm调试输出等级 -y, --assumeyes 全部问题自动应答为是 --assumeno 全部问题自动应答为否 --enablerepo [repo] 为当前 dnf 命令临时启用仓库。接受一个 id、以逗号分隔的多个 id 列表,或 ids glob。此选项可多次指定。 --disablerepo [repo] 为当前 dnf 命令临时禁用仓库。接受一个 id、以逗号分隔的多个 id 列表,或 ids glob。此选项可多次指定,但它与 `--repo` 是相互排斥的。 --repo [repo], --repoid [repo] 启用指定 id 或 glob 的仓库,可以指定多次 --enable 使用 config-manager 命令启用 repos (自动保存) --disable 使用 config-manager 命令禁用 repos (自动保存) -x [package], --exclude [package], --excludepkgs [package] 用全名或通配符排除软件包 --disableexcludes [repo], --disableexcludepkgs [repo] 禁用 excludepkgs --repofrompath [repo,path] 附加仓库所要使用的标签和路径(与 baseurl 中的路径一致),可以指定多次。 --noautoremove 禁用删除不再被使用的依赖软件包 --nogpgcheck 禁用 gpg 签名检查 (如果 RPM 策略允许) --color COLOR 配置是否使用颜色 --refresh 在运行命令之前将元数据标记为过期 -4 仅解析 IPv4 地址 -6 仅解析 IPv6 地址 --destdir DESTDIR, --downloaddir DESTDIR 设置软件包要复制到的目录 --downloadonly 仅下载软件包 --comment COMMENT 为事务添加一个注释 --bugfix 在更新中包括与 bug 修复有关的软件包 --enhancement 在更新中包括与功能增强有关的软件包 --newpackage 在更新中包括与新软件包有关的软件包 --security 在更新中包括与安全有关的软件包 --advisory ADVISORY, --advisories ADVISORY 在更新中包括修复指定公告所必须的软件包 --bz BUGZILLA, --bzs BUGZILLA 在更新中包括修复给定 BZ 所必须的软件包 --cve CVES, --cves CVES 在更新中包括修复给定 CVE 所必须的软件包 --sec-severity {Critical,Important,Moderate,Low}, --secseverity {Critical,Important,Moderate,Low} 在更新中包括匹配给定安全等级的安全相关的软件包 --forcearch ARCH 强制使用一个架构
从上面dnf和yum帮助命令输出可以看出,两者的区别很小,使用方法大致相同,常用命令并无区别。
软件仓库对比
DNF和YUM命令所列出的YUM/DNF源相同。
[root@localhost home]# dnf repolist 仓库 id 仓库名称 appstream CentOS Stream 9 - AppStream baseos CentOS Stream 9 - BaseOS docker-ce-stable Docker CE Stable - x86_64 extras-common CentOS Stream 9 - Extras packages [root@localhost home]# yum repolist 仓库 id 仓库名称 appstream CentOS Stream 9 - AppStream baseos CentOS Stream 9 - BaseOS docker-ce-stable Docker CE Stable - x86_64 extras-common CentOS Stream 9 - Extras packages
清除缓存中的RPM软件包列表,重新获取缓存,YUM和DNF的操作相同,结果也相同。
[root@localhost home]# yum makecache CentOS Stream 9 - BaseOS 717 kB/s | 7.9 MB 00:11 CentOS Stream 9 - AppStream 6.3 MB/s | 18 MB 00:02 CentOS Stream 9 - Extras packages 16 kB/s | 15 kB 00:00 Docker CE Stable - x86_64 61 kB/s | 32 kB 00:00 元数据缓存已建立。 [root@localhost home]# yum clean all 28 个文件已删除 [root@localhost home]# dnf makecache CentOS Stream 9 - BaseOS 2.5 MB/s | 7.9 MB 00:03 CentOS Stream 9 - AppStream 3.8 MB/s | 18 MB 00:04 CentOS Stream 9 - Extras packages 18 kB/s | 15 kB 00:00 Docker CE Stable - x86_64 83 kB/s | 32 kB 00:00 元数据缓存已建立。 [root@localhost home]# dnf clean all 28 个文件已删除
总的来说dnf在软件仓库方面的配置和使用,和yum并无太大区别。
dnf的优势
dnf使用C语言库hawkey进行软件包依赖关系解析,从而大幅度提升包管理操作效率
dnf降低了内存消耗,从而提升用户体验。
dnf如果配置和启用的库没有响应,dnf将跳过它并使用可用的repos继续事务,而不会像yum,如果配置库不可用,yum将立即停止工作。
dnf的不足
dnf 包管理器作为 yum 包管理器的升级替代品,它能自动完成更多的操作,但不足之处还是有的,举例如下:
在 dnf 中没有 –skip-broken 命令,并且没有替代命令供选择。
在 dnf 中没有判断哪个包提供了指定依赖的 resolvedep 命令。
在 dnf 中没有用来列出某个软件依赖包的 deplist 命令。
当你在 dnf 中排除了某个软件库,那么该操作将会影响到你之后所有的操作,不像在 yum 下那样,你的排除操作只会咋升级和安装软件时才起作用。
yum/dnf常用命令
下面主要体现dnf命令操作,如无特别说明,yum命令同样适用。
查看系统中可用的软件仓库
# dnf repolist
查看系统中可用和不可用的所有的软件仓库
# dnf repolist all
列出软件仓库中的所有RPM软件包
# dnf list
列出软件仓库中所有已安装的 RPM软件包
# dnf list installed
列出软件仓库中所有可供安装的RPM软件包
# dnf list available
搜索软件仓库中的RPM软件包
# dnf search httpd
查找某一文件的提供者
# dnf provides httpd
查看软件包详情
# dnf info httpd
安装软件包及其依赖的其他软件包
# dnf install httpd
# dnf install httpd -y
删除软件包
# dnf remove httpd
删除无用孤立的软件包
# dnf autoremove
删除缓存的无用软件包
# dnf clean all
获取有关某条命令的使用帮助
# dnf help clean
获取软件仓库中的软件包列表到缓存中
# dnf makecache
更新软件仓库中的软件包列表
# dnf check- update
查看 dnf 命令的执行历史
# dnf history
查看所有的软件包组
# dnf grouplist
安装一个软件包组
# dnf groupinstall ‘System Tools’
# dnf groupinstall ‘System Tools’ -y
卸载一个软件包组
# dnf groupremove ‘System Tools’
# dnf groupremove ‘System Tools’ -y
从特定的软件包库安装特定的软件
# dnf -enablerepo=epel install httpd
重新安装特定软件包
# dnf reinstall httpd
更新系统中所有需要更新的包
# dnf update
更新一个特定的软件包
# dnf update httpd
列出所有命令及其用途
# dnf help