DNF包管理器

DNF是在基于RPM的Linux发布版本中提供软件包管理器,提供自动计算软件包依赖和安装卸载,并且容易维护服务器组。从Fedora 18开始,DNF被引入,并从Fedora 22开始成为默认包管理器,取代了YUM。由于Red Hat Enterprise Linux 8基于Fedora 28,将全面转向使用DNF管理RPM。

备注

在 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 APIbroken dependency solving algorithminability to refactor internal functions 。Yum插件可以在Yum代码中使用任何method,这会造成Yum utility因一些细小变化而突然崩溃。

  • DNF目标是为了避免Yum执行的错误。从一开始所有暴露的API都被适当的记录,且测试几乎包含了每一次新的提交。这个项目采用了敏捷开发,会提供用户一些优先级功能实现。

安装DNF包管理器

  • 在RHEL/CentOS 7中安装DNF需要先安装 epel-release :

yum命令安装EPEL仓库 release
yum install epel-release

或者参考 Extra Packages for Enterprise Linux (EPEL) :

yum命令安装EPEL仓库
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • 然后安装 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 命令差异

  • 在 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代理

在部署 Kubernetes Atlas 时,需要能够访问Google软件仓库,采用的方法是使用 Squid父级socks代理 方案提供局域网内部服务器共享翻墙。这里涉及到如何配置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代理

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

参考