Fedora 44 里的 dnf 就是 dnf5

Fedora 44 上的 dnf 命令是 dnf5。可以这样确认:

dnf --version

我在 Fedora 44 的容器里看到的输出是 dnf5 version 5.4.3.0。本文的命令和输出都是在这个容器里跑出来的,架构是 aarch64。系统版本号用这条查:

rpm -E %fedora

输出 44 就是 Fedora 44。主配置文件是 /etc/dnf/dnf.conf,仓库定义放在 /etc/yum.repos.d/。哪些仓库处于启用状态,看这条的输出:

dnf repolist

我的容器里默认启用的是 fedora、fedora-cisco-openh264 和 updates,updates-testing 没有启用。你的机器上以自己的输出为准。

装机后的第三方仓库、驱动一类配置,本站的另一篇文章已经讲过,这里不重复,只讲装好之后日常怎么管软件,以及出了问题怎么退回去。

装、搜、查

安装要 sudo,搜索和查询不用:

sudo dnf install htop
dnf search htop
dnf info htop

dnf search 的结果会标出匹配的字段。Matched fields: name (exact) 是名字完全一致的包,Matched fields: name 是名字里带这个词的包,搜 htop 时后者会带出 pcp-htop。dnf info 会给出 Name、Version、Release、Architecture、Installed size、Source 这些字段。

软件组用 dnf group list 看,列出 ID、Name 和是否已安装,比如 office(Office/Productivity)、kde-education、kde-media。

日常升级:

sudo dnf upgrade

几个常用选项,都能在 dnf upgrade --help 里查到:

  • --minimal:只升级到能修复 bugfix、enhancement、security、newpackage 类公告的最低版本。
  • --allowerasing:允许删掉已安装的包来化解冲突。执行前先读事务摘要,确认要删的包你用不到。
  • --skip-unavailable:跳过不可用的包。
  • --from-repo=REPO_ID:只从指定仓库选包。

事务历史和回滚

dnf5 把每次安装、升级、删除记成一条事务:

dnf history list

列表里有事务 ID、当时的命令行、时间和改动数。我在容器里跑了一次 dnf -y install htop,它被记成一条事务,改动 2 项:htop 和依赖的 hwloc-libs。详情用:

dnf history info 3

会看到事务状态、使用的 Releasever,以及 Packages altered 里每个包的动作、原因和来源仓库。htop 的原因是 User,hwloc-libs 是 Dependency。

撤销一次操作用 undo:

sudo dnf history undo 3

我实际跑过:它把 htop 和 hwloc-libs 一起删了,系统回到安装前的样子。history 的子命令还有这几个:

  • redo:重复指定事务的动作。
  • rollback:撤销指定事务之后做过的所有事务。注意范围比 undo 大。
  • store:帮助里标着 experimental,不要在生产环境依赖它。

清理和重启检查

清掉不再被其他包依赖的包:

sudo dnf autoremove

它带 --offline 选项,把事务存起来,留到重启时再执行,原理和下面的系统升级一样。

升级了库之后,正在运行的进程用的还是旧库。needs-restarting 帮你找出这些进程和服务:

dnf needs-restarting
  • -s、--services:列出在依赖被更新之前就已经启动的 systemd 服务。
  • -p、--processes:列出在依赖被更新之前就已经启动的进程。
  • -e、--exclude-services:和 --processes 一起用,排除由 systemd 服务管理的进程。
  • -r、--reboothint:在 dnf5 里没有效果,只是为了兼容 DNF 4 保留的。DNF 4 里 needs-restarting -r 的功能,就是现在 dnf5 needs-restarting 的行为。

离线升级到新的大版本

DNF 4 时代要先装 dnf-plugin-system-upgrade 插件。在 Fedora 44 里,system-upgrade 已经内置在 DNF5 里,不用再装。离线升级的流程是三条命令:

sudo dnf upgrade --refresh
sudo dnf system-upgrade download --releasever=<VERSION>
sudo dnf system-upgrade reboot

第一条先把当前版本升到最新并刷新元数据。第二条下载升级到目标版本需要的所有内容,--releasever 后面填目标版本的数字。第三条准备好离线事务并重启,系统在重启后的启动阶段完成升级。

system-upgrade 还有三个辅助子命令:

  • status:显示当前离线事务的状态。没有的话,输出是 No offline transaction is stored.
  • log:显示过去离线事务的日志。
  • clean:清除已存储的离线事务和缓存的软件包。它会删掉已经下载的内容,执行前确认这次下载不需要保留。

大版本升级动手前,请对照 Fedora 官方的离线升级文档确认前提条件和注意事项。 上面的命令和子命令列表来自在 Fedora 44 容器里看到的帮助输出,没有引用官方文档的原文。

出错时怎么退回去

一次安装或升级之后觉得不对,先看历史找到那条事务的 ID,再 undo:

dnf history list
dnf history info <事务ID>
sudo dnf history undo <事务ID>

history info 能让你在撤销之前,看清楚这条事务动过哪些包。

--allowerasing 之后发现删多了,同样可以用 undo 撤回那条事务。想退回到更早的某个状态,用 rollback,它会撤销指定事务之后的所有事务,所以动手前先用 dnf history list 看清楚它会波及哪些记录。