dnf 实战
目标
用 dnf 确认软件仓库、安装软件包、根据文件反查软件包、回滚事务并锁定版本。
为什么重要
dnf 的决定性区别在于:每一次安装都会作为事务被记录,并且可以回退。apt 中没有对应的功能。这一区别改变了运维方式——“先装装看,不行再回退”成为可能。不过,如果仓库里没有之前的版本就会失败,而且内核、glibc 这类系统软件包不支持降级。
此外,dnf provides 比 dpkg -S 更强大。它会翻查软件仓库的元数据,所以连尚未安装的软件包也能找出来。在 RPM 中,依赖的单位不是软件包名称,而是能力(文件路径、库的 soname),所以这个工具必不可少。
步骤
- 创建目录
/root/rh,并把详细的软件仓库列表保存到/root/rh/repolist.txt。必须能看到指向/opt/localrepo的 baseurl。 - 查询软件包
tree的信息,把仅版本字符串写成一行,保存到/root/rh/tree-version.txt。 - 安装
tree和nano,并把两个软件包的 NEVRA(rpm -q的输出)各写一行,保存到/root/rh/installed.txt。 - 找出提供
/usr/bin/tree的软件包,把仅软件包名称写成一行,保存到/root/rh/provides.txt。 - 把 dnf 事务列表保存到
/root/rh/history.txt。至少要有一条事务。 - 回退(undo)安装
nano的那条事务。回退之后nano必须处于未安装状态,并把这一状态保存到/root/rh/after-undo.txt。 - 锁定
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 步中找到的软件包名称)
参考
- 顺序是
dnf repolist -v、dnf info tree、dnf provides '*/bin/tree'、dnf history、dnf history undo <ID> -y。 - 确认是否已安装用
rpm -q <패키지>(占位符为软件包名)。如果没有安装,会输出“is not installed”。 - 只提取版本,用
rpm -q --qf '%{VERSION}-%{RELEASE}\n' <패키지>(占位符为软件包名)比较方便。 - 常见错误 1:在第 6 步选错事务 ID,回退了不相干的事务。请先用
dnf history info <ID>确认。 - 常见错误 2:在第 4 步保存了
dnf provides的全部输出。只需要软件包的名称。
确认软件仓库
创建目录 /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 步中找到的软件包名称)
值必须是实际查询的结果。状态请以是否已安装来判断。