另一个包管理工具——DNF

更新(2017-06-01):repo 的 url 有变化,更新之。后附更新脚本。


DNF 起源于 YUM 的一个分支,最早用在 Fedora 18,在 Fedora 22 中默认安装,成为系统工具。现在更是被广泛看作 YUM 的接班人。虽然 DNF 号称自己不错,但是幸好,至少从目前来看,都可以看做是对 YUM 的小修补。整体来说,DNF 对 YUM 的兼容做得很好,甚至于部分操作可以 yumdnf 混合着来——当然,新旧掺杂绝对不是好习惯,我就这么一说,证明 YUM 和 DNF 的关联之亲近。用惯了 YUM 的朋友们一定不会抗拒换到 DNF,它们的用法非常相似,而且 DNF 的更有现代语言风格。

我常用的系统是 CentOS,虽然已经被 RedHat 收购,但是 CentOS 的品质和定位都没有变,这很难得。最新(截至 2016-10-16)的 CentOS 是 7.2.1511。下面的步骤在 CentOS 上尝试,对 Fedora/RHEL 理论上同样适用。Fedora 上应该还更加简单,下面的问题好多都不会遇到。

闲话不说,安装步骤如下。

一、手动安装全新的 yum repo

新增一个 repo,从这个 repo 中用 yum 安装 DNF。这是因为 CentOS Base repo 中的 DNF 版本太低,只有 0.6.x,而最新的稳定版已经到 1.1.9。0.6.x 中的 libsolv 太低,导致不能处理 .bz2 压缩包,所以只能采用引入新 repo 来安装 DNF 的办法。


1
2
3
4
5
6
7
8
9
10
cat <<EOF > /etc/yum.repos.d/dnf-stack-el7.repo
[dnf-stack-el7]
name=Copr repo for dnf-stack-el7 owned by @rpm-software-management
baseurl=https://copr-be.cloud.fedoraproject.org/results/@rpm-software-management/dnf-stack-el7/epel-7-\$basearch/
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/@rpm-software-management/dnf-stack-el7/pubkey.gpg
enabled=1
enabled_metadata=1
EOF


Update (2017-06-03):
因为 rpm-software-management 提供的 repo 变更了 url,因此上述脚本也做了相应更新。如下。

1
2
3
4
5
6
7
8
9
10
cat <<EOF > /etc/yum.repos.d/dnf-stack-el7.repo
[dnf-stack-el7]
name=Copr repo for dnf-stack-el7 owned by @rpm-software-management
baseurl=https://copr-be.cloud.fedoraproject.org/results/@rpm-software-management/dnf-centos/epel-7-\$basearch/
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/@rpm-software-management/dnf-centos/pubkey.gpg
enabled=1
enabled_metadata=1
EOF

对于已经用旧的脚本安装过 dnf repo 的系统,可以使用下面的命令 fix。

1
2
[[ -f /etc/yum.repos.d/dnf-stack-el7.repo ]] && \
sed -i 's@/dnf-stack-el7/@/dnf-centos/@g' /etc/yum.repos.d/dnf-stack-el7.repo

二、安装 DNF

1
yum install dnf dnf-conf dnf-automatic

三、验证及状态检查

安装完成后检查 DNF 的版本(如果报错,请看下一节)。

1
dnf --version

截至现在(2016-10-16),通过 yum 安装的 DNF 最新的版本号是 1.1.9,也就是说,你安装的 DNF 不应该低于这个版本号,才是对了。

1
dnf repolist all

这可以查看当前 DNF 用到那些软件库的资源。按照使用 YUM 的习惯,最重要的无非 Base、EPEL、Updates 这三个。

1
dnf list installed

查看已经安装的应用。
PS:从第三列很容易看出,以前通过 YUM 安装的应用,都被划为 @System,即系统模块类别。这应该是为了能从 YUM 平滑过渡的一个折衷办法。

四、部分问题的解决(更新中)

1. 『Failed to open: …..updateinfo.xml.bz2』错误

这是由于低版本的 libsolv 库无法处理 bzip 压缩包形式的依赖关系造成的,解决的办法不是升级 libsolv 库,貌似库文件一起被封装成 python package,做到 rpm 里面了。所以正确的方法是,按照上面的步骤一、二重新安装 dnf。重新安装之前,必要的话应该删除旧的 DNF 及其依赖。

1
2
3
yum erase dnf dnf-conf dnf-automatic python-dnf && \
yum install dnf dnf-conf dnf-automatic
# python-dnf 会作为 dnf 的依赖自动被安装

2. DNF 无法使用 epel 库

1
yum erase -y epel-release && dnf install -y epel-release

通俗来讲就是让 DNF 来维护索引。

3. 『No such command: xxx. Please use /usr/bin/dnf –help』

通常遇到这种情况,是没有安装 DNF 扩展导致的。用下面的命令安装上 DNF 扩展之后,问题就能顺利解决。

1
dnf install -y dnf-plugins-core