.. _dnf: ================ DNF包管理器 ================ DNF是在基于RPM的Linux发布版本中提供软件包管理器,提供自动计算软件包依赖和安装卸载,并且容易维护服务器组。从Fedora 18开始,DNF被引入,并从Fedora 22开始成为默认包管理器,取代了YUM。由于Red Hat Enterprise Linux 8基于Fedora 28,将全面转向使用DNF管理RPM。 .. note:: 在 CentOS 8中检查 ``yum`` 命令,可以看到上是 ``dnf`` 命令的软链接:: $ ls -lh /usr/bin/yum lrwxrwxrwx. 1 root root 5 Dec 19 23:43 /usr/bin/yum -> dnf-3 DNF提供了YUM兼容的命令行以及为扩展和插件提供了精确的API。插件可以修改或者扩展DNF的功能或者提供附加的CLI命令。 DNF从Yum分支出来,使用专注于性能的C语言库hawkey进行依赖关系解析工作,大幅度提升包管理操作效率并降低内存消耗。DNF替代Yum的原因如下: - Yum不能"Python 3 as default",而DNF支持Python 2和Python3 - 启动DNF项目的原因是Yum的三个陷阱: ``undocumented API`` 、 ``broken dependency solving algorithm`` 和 ``inability to refactor internal functions`` 。Yum插件可以在Yum代码中使用任何method,这会造成Yum utility因一些细小变化而突然崩溃。 - DNF目标是为了避免Yum执行的错误。从一开始所有暴露的API都被适当的记录,且测试几乎包含了每一次新的提交。这个项目采用了敏捷开发,会提供用户一些优先级功能实现。 安装DNF包管理器 ================== - 在RHEL/CentOS 7中安装DNF需要先安装 ``epel-release`` : .. literalinclude:: dnf/yum_install_epel-release :language: bash :caption: yum命令安装EPEL仓库 release 或者参考 `Extra Packages for Enterprise Linux (EPEL) `_ : .. literalinclude:: dnf/yum_install_epel :language: bash :caption: yum命令安装EPEL仓库 - 然后安装 ``DNF`` 包:: yum install dnf DNF包管理器使用 ================== - 查看DNF包管理器的版本:: dnf --version - 查看系统中可用的DNF软件库:: dnf repolist - 查看系统中可用的和不可用的所有的DNF软件库:: dnf repolist all - 添加DNF Repository:: dnf config-manager --add-repo repository_url 举例:: dnf config-manager --add-repo http://www.example.com/example.repo - 激活DNF Repository:: dnf config-manager --set-enabled repository… - 也可以反向关闭:: dnf config-manager --set-disabled repository… 参考 `Adding, Enabling, and Disabling a DNF Repository `_ - 列出所有RPM包:: dnf list - 列出所哟安装了RPM包:: dnf list installed - 列出所有可供安装的RPM包(包括了所有可用软件库的可供安装的软件包):: dnf list available - 如果要查看多个版本,可以使用参数 ``--showduplicates`` :: dnf --showduplicates list openssl 此外,如果有多个release版本,还可以指定relase版本来展示。例如,同时在主机上启动用CentOS8和CentOS7的软件仓库,我们可以使用以下命令检查CentOS7的软件包:: dnf --relasever=7 --showduplicates list openssl 而使用Fedora 30版本,同时使用Fedora 29版本,则可以使用:: dnf --releasever=29 --showduplicates list $pkgname - 列出仓库中module (软件包组合) :: dnf module list 显示不同仓库中软件包组合套装,类似:: CentOS-8 - AppStream Name Stream Profiles Summary ... go-toolset rhel8 [d] common [d] Go httpd 2.4 [d] common [d], devel, minimal Apache HTTP Server ... 注意,module的状态: ``[d]efault, [e]nabled, [x]disabled, [i]nstalled`` ,如果是 ``[x]`` 状态,需要首先激活:: dnf module enable Name:Stream 安装module有以下几种模式:: dnf module install NAME dnf module install NAME:STREAM dnf module install NAME/PROFILE dnf module install NAME:STREAM/PROFILE 请注意,有些软件是有不同Stream的,例如nodejs:: nodejs 10 [d][e] common [d], development, minimal, s2i Javascript runtime nodejs 12 common [d], development, minimal, s2i Javascript runtime 则默认安装 ``dnf install nodejs`` 就会安装版本 ``10`` 。如果你要切换 Stream,需要使用 ``reset`` 指令:: dnf module reset nodejs dnf module install nodejs:10 注意,不推荐切换Stream,因为不是所有module都支持切换。 - 搜索软件库中的软件包:: dnf search syslog-ng - 查找某个文件的提供者:: dnf provides /bin/bash - 查看软件包的详情:: dnf info bash - 升级软件包:: dnf update systmed - 检查软件包的更新 - 检查系统中所有软件包的更新:: dnf check-update - 升级系统中所有可以升级的软件包:: dnf update # 或 dnf upgrade - 删除软件包:: dnf remove nano - 删除无用软件包:当没有软件再依赖时,某些用于解决特定软件依赖的软件包可以清理掉:: dnf autoremove - 删除缓存的无用软件包:: dnf clean all - 获取某条命令的使用帮助:: dnf help clean - 查看所有的DNF命令及用途:: dnf help - 查看DNF命令的执行历史:: dnf history - 查看所有的软件包组:: dnf grouplist - 安装一个软件包组:: dnf groupinstall 'Educational Software' - 升级一个软件包组中的软件包:: dnf groupupdate 'Educational Software' - 删除一个软件包组:: dnf groupremove 'EDucational Software' - 从特定的软件包安装特定的软件:: dnf --enablerepo=epel install phpmyadmin - 更新软件包都最新的稳定发行版:这个命令可以通过所有可用的软件源更新系统中所有已经安装的软件包到最新的稳定版本:: dnf distro-sync - 重装特定软件包:: def reinstall nano - 回滚某个特定的软件版本:: dnf downgrade acpid yum 和 dnf 命令差异 ==================== - :strike:`在 DNF 中没有 --skip-broken 命令,并且没有替代命令供选择` (感谢Aurorxa网友指正) - 在 DNF 中没有判断哪个包提供了指定依赖的 ``resolvedep`` 命令 - 在 DNF 中没有用来列出某个软件依赖包的 deplist 命令。 - 当你在 DNF 中排除了某个软件库,那么该操作将会影响到你之后所有的操作,不像在 YUM 下那样,你的排除操作只会在升级和安装软件时才起作用。 DNF插件和高级命令 ================== DNF通过一些插件提供了安装debuginfo包或下载仓库中RPM的功能 ====================== ============================== ================================ YUM command DNF command 提供的软件包 ====================== ============================== ================================ debuginfo-install dnf debuginfo-install dnf-plugins-core repoquery dnf repoquery dnf-plugins-core yum-builddep dnf builddep dnf-plugins-core yum-config-manager dnf config-manager dnf-plugins-core yumdownloader dnf download dnf-plugins-core repo-graph dnf repograph dnf-plugins-extras-repograph ====================== ============================== ================================ 代理 ======= .. _yum_proxy: YUM代理 ------------ 在部署 :ref:`kubernetes` 时,需要能够访问Google软件仓库,采用的方法是使用 :ref:`squid_socks_peer` 方案提供局域网内部服务器共享翻墙。这里涉及到如何配置yum/dnf使用代理服务器。 设置 **当前用户** 环境变量 ``http_proxy`` 来实现:: export http_proxy="http://PROXY_IP:8123" yum upgrade yum install XXXX 如果要一直使用代理服务器方式,则修改 ``/etc/yum.conf`` 配置文件,添加:: # The proxy server - proxy server:port number proxy=http://PROXY_IP:3128 # The account details for yum connections proxy_username=yum-user proxy_password=qwerty .. _dnf_proxy: DNF代理 --------- DNF配置代理方法类似YUM,不过配置已经迁移到 ``/etc/dnf/dnf.conf`` :: # The proxy server - proxy server:port number proxy=http://PROXY_IP:3128 # The account details for dnf connections proxy_username=dnf-user proxy_password=qwerty 参考 ======== - `DNF的命令使用教学 `_ - `Fedora的包管理器已从Yum切换到DNF `_ - `Managing packages on Fedora with DNF `_ - `Yum is dead, long live DNF `_ - `DNF Fedora文档 `_ - `Using yum with a Proxy Server `_ - `Fedora Linux – How to Use dnf Command With A Proxy Server `_