这里是普通文章模块栏目内容页
linux下yum和dnf使用介绍

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


栏目索引
相关内容