另一个包管理工具——DNF

另一个包管理工具——DNF

2016-10-17
运维

更新(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 的办法。

```bash cat < /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,因此上述脚本也做了相应更新。如下。

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。

[[ -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 #

yum install dnf dnf-conf dnf-automatic

三、验证及状态检查 #

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

dnf --version

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

dnf repolist all

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

dnf list installed

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

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

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

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

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

2. DNF 无法使用 epel 库 #

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

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

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

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

dnf install -y dnf-plugins-core