另一个包管理工具——DNF
2016-10-17
更新(2017-06-01):repo 的 url 有变化,更新之。后附更新脚本。
DNF 起源于 YUM 的一个分支,最早用在
Fedora 18,在 Fedora 22 中默认安装,成为系统工具。
现在更是被广泛看作 YUM 的接班人。虽然 DNF 号称自己不错,但是幸好,至少从目前来看,都可以看做是对 YUM 的小修补。整体来说,DNF 对 YUM 的兼容做得很好,甚至于部分操作可以 yum
和 dnf
混合着来——当然,新旧掺杂绝对不是好习惯,我就这么一说,证明 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 的办法。
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