使用 DNF5 管理 Azure Linux 包

本文介绍 Azure Linux 上的常见包管理任务,包括:

  • 存储库配置所在的位置。
  • 旧包管理器命令如何映射到 DNF5。
  • DNF 如何缓存元数据并解析包。
  • 内核和其他仅安装的软件包的处理方式。
  • 如何启用无人参与更新。
  • 最常用的 DNF 命令。

Note

Azure Linux 4.0 现在位于 preview 中,严格限制为评估和测试目的。 它不适合生产用途。

存储库配置

DNF5 从 /etc/yum.repos.d/. 读取存储库定义。 目录名称从 YUM 保留,以便兼容;DNF5 从此目录读取。

该目录中的每个 .repo 文件都是一个纯文本配置文件,告知 DNF 在何处查找包、是否使用 GPG 验证它们,以及默认情况下是否启用存储库。 主 DNF 配置文件是 /etc/dnf/dnf.conf,它控制缓存设置、仅安装软件包数量限制和代理配置等全局行为。

Azure Linux 提供兼容性符号链接,因此旧版命令(yumdnf(DNF4)、microdnftdnf)都会调用 DNF5:

lrwxrwxrwx.  1 root root       4  yum -> dnf5
lrwxrwxrwx.  1 root root       4  microdnf -> dnf5
-rwxr-xr-x.  1 root root 1614408  dnf5
lrwxrwxrwx.  1 root root       4  dnf -> dnf5
lrwxrwxrwx.  1 root root       4  tdnf -> dnf5

通用子命令都通过符号链接工作。 依赖 DNF4 内部机制或 microdnf 特定行为的边缘情况可能不再适用。 有关更改的详细信息,请参阅以下资源:

DNF5 如何解析包

运行 DNF 命令时,DNF5 执行以下步骤来确定要安装、升级或删除的包:

  1. 加载每个.repo/etc/yum.repos.d/文件,并选择标记为已启用的存储库。
  2. 刷新存储库元数据,并将其缓存在本地的 /var/cache/libdnf5 下。 缓存的元数据包括包列表、版本和依赖项信息、校验和和签名。
  3. 根据启用的存储库解析请求的安装、删除或升级,选取包版本,并在应用事务之前验证完整性和签名。

已禁用的仓库将被忽略,除非你使用 --enablerepo=<repo-id> 为单个命令显式启用它们。

缓存 /var/cache/libdnf5 存在,因此 DNF 不必在每个调用上重新下载元数据。 运行 dnf clean all 以清空它(请参阅 常用 DNF 命令)。

仅安装的软件包和多个已安装版本

某些包(尤其是内核)并排安装,而不是就地升级。 DNF5 通过 /etc/dnf/dnf.conf 中的两个设置来控制这一点:

  • installonlypkgs:从未就地升级的包名称列表。 内核软件包是标准入口。
  • installonly_limit:可能共存于系统上的仅限安装包的最大版本数。 默认值为 3

安装新版本并超出限制后,DNF 会自动删除最早的版本。

对于内核来说,这会为你提供:

  • 回退:如果新内核无法启动,GRUB 仍可以启动以前的已知工作内核。
  • 验证:无需删除正在运行的内核即可安装和测试新内核。
  • 变体共存:可以同时安装不同的内核版本(例如,具有不同功能集)。

每个内核版本都是一个独立的 RPM,因此 DNF 会像处理其他任何软件包一样对其进行跟踪和删除。

无人参与的更新 dnf-automatic

dnf-automatic 是一项定期检查、下载并可选择是否应用软件包更新的服务。 它由系统计时器驱动,而不是作为长期守护程序运行。

安装 dnf-automatic

使用以下命令进行安装 dnf-automatic

sudo dnf install -y dnf-automatic

dnf5-automatic启用计时器

使用以下命令立即启用 dnf5-automatic 计时器,并使其在重新启动后仍然生效:

sudo systemctl enable --now dnf5-automatic.timer
  • enable 将计时器配置为在启动时启动。
  • --now 在当前会话中启动计时器。

检查计时器的状态dnf5-automatic

检查计时器是否处于活动状态,并使用以下命令查看计时器上次运行时:

systemctl status dnf5-automatic.timer

典型的输出如以下示例所示:

● dnf5-automatic.timer - dnf-automatic timer
     Loaded: loaded (/usr/lib/systemd/system/dnf5-automatic.timer; enabled; preset: disabled)
     Active: active (waiting) since Thu 2026-03-26 14:36:54 UTC; 13min ago
 Invocation: f6984eeceb7c40df99bca243f3da728c
    Trigger: Fri 2026-03-27 06:34:18 UTC; 15h left
   Triggers: ● dnf5-automatic.service

Active: active (waiting) 这是预期行为:底层服务是一次性服务,仅在定时器触发时运行,随后退出。 Trigger: 行显示了下一次计划运行时间。

列出 dnf5-automatic 定时器的下一次计划运行时间

使用以下命令列出下一次运行时间以及其他定时器:

systemctl list-timers dnf5-automatic.timer

示例输出:

NEXT                        LEFT LAST PASSED UNIT                 ACTIVATES
Fri 2026-03-27 06:34:18 UTC  15h -         - dnf5-automatic.timer dnf5-automatic.service

1 timers listed.
Pass --all to see loaded but inactive timers, too.

dnf-automatic 的可选配置

可以通过添加 /etc/dnf/automatic.conf 文件来配置自动更新行为。 此文件控制更新是仅下载、自动应用还是仅限于仅限安全的更新。 有关完整配置详细信息,请参阅 dnf5 自动文档

常用 DNF 命令

以下命令涵盖 Azure Linux 上的大量日常包管理。

dnf clean all

dnf clean all 删除 DNF 缓存下 /var/cache/libdnf5的所有内容。 使用它可执行以下操作:

  • 从由损坏或过时的元数据导致的事务错误中恢复。
  • 在同一 RUN 层中完成安装后删除包缓存,以缩小容器镜像。
  • 回收磁盘空间。

容器示例:

RUN dnf install -y package1 package2 \
    && dnf clean all

dnf search 将关键字与包名称和摘要进行匹配。 例如:

dnf search lsof

示例输出:

Updating and loading repositories:
 Azure Linux 4.0 - x86_64 - Microsoft                        100% |   7.6 KiB/s |   4.8 KiB |  00m01s
Repositories loaded.
Matched fields: name (exact)
 lsof.x86_64   A utility which lists open files on a Linux/UNIX system

dnf provides

dnf provides 查找拥有给定文件、命令或功能的包。 例如:

dnf provides lsof

示例输出:

Updating and loading repositories:
Repositories loaded.
lsof-4.98.0-8.azl4.20260303.x86_64 : A utility which lists open files on a Linux/UNIX system
Repo         : @System
Matched From :
Provide      : lsof = 4.98.0-8.azl4.20260303

dnf install

dnf install 安装一个或多个包及其运行时依赖项:

sudo dnf install lsof

示例输出:

Updating and loading repositories:
Repositories loaded.
Package           Arch     Version                  Repository    Size
Installing:
 lsof             x86_64   4.98.0-8.azl4.20260303   azurelinux  578.5 KiB

Transaction Summary:
 Installing:         1 package

Total size of inbound packages is 226 KiB. Need to download 226 KiB.
After this operation, 579 KiB extra will be used (install 579 KiB, remove 0 B).
Is this ok [y/N]: y
[1/1] lsof-0:4.98.0-8.azl4.20260303.x86_64                100% | 641.9 KiB/s | 226.0 KiB |  00m00s
[1/1] Total                                               100% | 640.1 KiB/s | 226.0 KiB |  00m00s
Running transaction
[1/3] Verify package files                                100% | 500.0   B/s |   1.0   B |  00m00s
[2/3] Prepare transaction                                 100% |  23.0   B/s |   1.0   B |  00m00s
[3/3] Installing lsof-0:4.98.0-8.azl4.20260303.x86_64     100% |   3.0 MiB/s | 580.2 KiB |  00m00s
Complete!

dnf remove

dnf remove 卸载某个包,以及仅因该包而安装的所有依赖项:

sudo dnf remove -y lsof

示例输出:

Package           Arch     Version                  Repository    Size
Removing:
 lsof             x86_64   4.98.0-8.azl4.20260303   azurelinux  578.5 KiB

Transaction Summary:
 Removing:           1 package

After this operation, 579 KiB will be freed (install 0 B, remove 579 KiB).
Is this ok [y/N]: y
Running transaction
[1/2] Prepare transaction                                 100% |  27.0   B/s |   1.0   B |  00m00s
[2/2] Removing lsof-0:4.98.0-8.azl4.20260303.x86_64       100% |  72.0   B/s |  11.0   B |  00m00s
Complete!

dnf upgrade

dnf upgrade 将已安装的包更新到其最新可用版本。

sudo dnf upgrade

当所有内容都是最新时,输出会很短。 例如:

Updating and loading repositories:
Repositories loaded.
Nothing to do.

Tip

在脚本、CI 管道和容器构建等非交互式上下文中,将 -y 传递给 installremoveupgrade。 任何会修改系统的 DNF 操作都需要 root 权限,因此请在 sudo 下运行,或以 root 身份运行。