TT Lab
开始
学习 学习路径 课程

RHEL 系管理

dnf 实战

在 TT Lab 中继续学习

目标

用 dnf 确认软件仓库、安装软件包、根据文件反查软件包、回滚事务并锁定版本。

为什么重要

dnf 的决定性区别在于:每一次安装都会作为事务被记录,并且可以回退。apt 中没有对应的功能。这一区别改变了运维方式——“先装装看,不行再回退”成为可能。不过,如果仓库里没有之前的版本就会失败,而且内核、glibc 这类系统软件包不支持降级。

此外,dnf provides 比 dpkg -S 更强大。它会翻查软件仓库的元数据,所以连尚未安装的软件包也能找出来。在 RPM 中,依赖的单位不是软件包名称,而是能力(文件路径、库的 soname),所以这个工具必不可少。

步骤

  1. 创建目录 /root/rh,并把详细的软件仓库列表保存到 /root/rh/repolist.txt。必须能看到指向 /opt/localrepo 的 baseurl。
  2. 查询软件包 tree 的信息,把仅版本字符串写成一行,保存到 /root/rh/tree-version.txt。
  3. 安装 tree 和 nano,并把两个软件包的 NEVRA(rpm -q 的输出)各写一行,保存到 /root/rh/installed.txt。
  4. 找出提供 /usr/bin/tree 的软件包,把仅软件包名称写成一行,保存到 /root/rh/provides.txt。
  5. 把 dnf 事务列表保存到 /root/rh/history.txt。至少要有一条事务。
  6. 回退(undo)安装 nano 的那条事务。回退之后 nano 必须处于未安装状态,并把这一状态保存到 /root/rh/after-undo.txt。
  7. 锁定 tree 的版本。如果有 dnf versionlock 插件,就用它的命令;如果没有,就直接写入 /etc/dnf/plugins/versionlock.list。把锁定状态保存到 /root/rh/lock.txt。
  8. 把 /root/rh/report.txt 写成下面这 4 行。 TREE=<tree 의 설치 버전> / NANO=<removed 또는 installed> / PROVIDER=<4번에서 찾은 패키지 이름> / LOCKED=tree(前三项的占位符依次为 tree 的已安装版本、removed 或 installed、第 4 步中找到的软件包名称)

参考

确认软件仓库

创建目录 /root/rh,并把详细的软件仓库列表保存到 /root/rh/repolist.txt。必须能看到指向 /opt/localrepo 的 baseurl。

dnf repolist 有显示详细输出的选项。必须能看到本地软件仓库的 baseurl。

查询软件包信息

查询软件包 tree 的信息,把仅版本字符串写成一行,保存到 /root/rh/tree-version.txt。

dnf info 会显示版本、软件仓库、大小和摘要。请只提取版本值。

安装软件包

安装 tree 和 nano,并把两个软件包的 NEVRA(rpm -q 的输出)各写一行,保存到 /root/rh/installed.txt。

请养成安装后用 rpm -q 确认的习惯。输出格式是 名称-版本-release.架构。

根据文件反查软件包

找出提供 /usr/bin/tree 的软件包,把仅软件包名称写成一行,保存到 /root/rh/provides.txt。

dnf provides 会翻查软件仓库的元数据,所以连未安装的软件包也能找到。

确认事务

把 dnf 事务列表保存到 /root/rh/history.txt。至少要有一条事务。

用 dnf history 查看列表,用 history info 查看详情。ID 是数字。

回退事务

回退(undo)安装 nano 的那条事务。回退之后 nano 必须处于未安装状态,并把这一状态保存到 /root/rh/after-undo.txt。

undo 会执行指定事务的反向操作。要不经确认直接执行,需要加 -y。

锁定版本

锁定 tree 的版本。如果有 dnf versionlock 插件,就用它的命令;如果没有,就直接写入 /etc/dnf/plugins/versionlock.list。把锁定状态保存到 /root/rh/lock.txt。

有插件时用命令,没有时可以直接写入配置文件。

综合报告

把 /root/rh/report.txt 写成下面这 4 行。 TREE=<tree 의 설치 버전> / NANO=<removed 또는 installed> / PROVIDER=<4번에서 찾은 패키지 이름> / LOCKED=tree(前三项的占位符依次为 tree 的已安装版本、removed 或 installed、第 4 步中找到的软件包名称)

值必须是实际查询的结果。状态请以是否已安装来判断。