软件管理#

在Rocky 9/Redhat 9中,由 dnf 命令来管理软件。为了保持兼容性, dnf 的上一版本的命令 yum 仍然可以使用,只不过 yum 是个软连接,指向 dnf

../_images/1-125.png

提示

`command` 是命令替换的语法,该语法可以将一个命令的输出作为另一个命令的参数。

ls -l `which yum` ,将 which yum 的输出作为 ls -l 的参数,等同于先执行 which yum ,再用其结果执行 ls -l

另一种写法为 ls -l $(which yum) ,效果同上。

软件仓库#

Linux中有成千上万个软件,它们并不是全部安装在系统中,而是按需安装。

这些软件按照不同的分类存放在不同的仓库中:

../_images/1-218.png
  • BaseOS

    该仓库包含了系统基础功能的软件包,且发布时间比较早

  • AppStream

    该仓库包含了额外的用户空间的应用、程序语言(如 golangphp)和数据库以用于各种用途

重要

BaseOSAppStream 是系统不可或缺的两个软件仓库,包装软件时必须包含这两个仓库,否则在解决软件之间的依赖关系时会出现错误。

这两个软件仓库都经由上游(即Redhat)验证,软件包的安全性和稳定性得到了保证。

  • Extras

    该仓库提供了额外的功能性软件包,且不会破坏上游软件包的兼容性,但未经上游验证

  • 其它仓库

    Rocky Linux还有其它软件仓库,它们默认状态是 disabled ,需要手动启用。

    ../_images/1-37.png

    关于这些仓库的说明,可参见 官方文档

dnf的配置#

dnf 及相关工具的的配置位于 /etc/dnf/dnf.conf 文件中的 [main] 部分。

/etc/dnf/dnf.conf 只包含了一部分被指定的配置,其它未被明确写入到这里的配置项,会使用默认值。

所有的配置项及其当前值可通过以下命令查看:

dnf config-manager --dump
../_images/1-46.png

这些配置以键值对(等号左边为关键字或词key,等号右边为该关键字或词的值value)的形式存在,影响着 dnf 的行为。一般情况下无须修改这些配置,默认值就可以满足需求。

这些配置的作用可通过 man dnf.conf 命令查看,可按需修改配置并写入到 /etc/dnf/dnf.conf 文件中即可生效。

另一个值得关注的地方是 /etc/yum.repos.d/ 目录,该目录下存放着所有的软件仓库配置文件。默认情况下, dnf 会从 mirrorlist 中选择离自己最近的mirror源站点 [1] ,下载软件包进行安装。

../_images/1-96.png

但有时候系统自动挑选的mirror源站点可能会比较慢,此时可以手动修改 /etc/yum.repos.d/ 目录下的配置文件,将 mirrorlist 替换为 baseurl ,并指定一个更快的mirror源站点。

如将系统中的mirror地址指定为阿里云镜像站:

sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky*.repo

提示

sed 命令的作用与 vim 命令中的替换功能类似,但 sed 的替换功能更强大,后续章节会详细介绍。

上述命令中, -e 选项将 mirrorlist 添加注释符使其失效,同时将 baseurl 替换为阿里云镜像站的地址; -i.bak 选项将替换后的内容写入到原文件中,并在原文件后添加一个备份文件。

/etc/yum.repos.d/rocky*.repo 中的 * 是一个 通配符 ,用来匹配 /etc/yum.repos.d/ 目录下所有以rocky 开头的文件。

经此修改后, dnf 会从阿里云镜像站下载软件包进行安装。

修改后的配置文件如下:

../_images/1-106.png

在执行以下操作:

# 删除系统已有的缓存文件
dnf clean all
# 重新生成缓存文件
dnf makecache

软件搜索#

Linux软件仓库中有成千上万个软件包,如何快速搜索和查看自己需要的软件?

搜索软件包#

dnf 可以在所有的软件仓库中搜索自己需要的软件包:

  • 搜索软件名或软件概要,如搜索 nginx

    dnf search nginx
    
    ../_images/1-57.png
  • 在软件名、软件概要或软件描述中搜索,如搜索 nginx

    dnf search --all nginx
    
    ../_images/1-67.png

    备注

    使用 --all 选项进行搜索时,因为会在软件描述中额外进行搜索,因此速度会比正常搜索时慢。

  • 搜索软件名并显示其名字与版本号,如搜索 nginx

    dnf repoquery nginx
    
  • 搜索哪个软件包提供了特定文件,如搜索 vim 文件由哪个软件包提供:

    dnf provides vim
    

    使用通配符进行更深度的搜索:

    dnf provides "*/vim"
    

列出软件包#

dnf 可以列出所有的软件包,还可以对结果进行过滤,如只列出某个仓库的软件包、只列出可升级的软件包等。

  • 列出所有的软件包:

    dnf list --all
    
    ../_images/1-76.png

    提示

    由于 dnf list --all 输出的内容太多,因此可以使用管理符 | 将输出的结果传递给 less 命令,再使用 less 命令查看输出的结果: dnf list --all | less

    @ 开头的内容所在行,表示该软件包已经安装在系统上了。

  • repoquery 命令也可以列出所有的软件包:

    dnf repoquery
    
  • 分类列出所有的软件包:

    对已经安装,可安装,可升级的软件包分别进行分类列出:

    • 列出所有的可安装的软件包:

      dnf list --available
      
    • 列出所有的已安装的软件包:

      dnf list --installed
      
    • 列出所有的可升级的软件包:

      dnf list --upgrades
      
  • 使用通配符进行过滤:

    # 列出所有以 nginx 开头的软件包
    dnf list nginx*
    

查看软件仓库#

dnf 可以查看当前系统中已启用的软件仓库:

dnf repolist
  • 如果想查看禁用的仓库,可以使用 --disabled 选项:

    dnf repolist --disabled
    
  • 如果想查看所有的仓库,可以使用 --all 选项:

    dnf repolist --all
    

同时,也可查看仓库的详细信息:

# 查看 baseos 仓库的详细信息
dnf repoinfo baseos
../_images/1-86.png

查看仓库时,可以使用通配符进行过滤,如查看所有以 app 开头的仓库:

dnf repolist --all app*

显示软件包的详细信息#

dnf 可以通过查询仓库,来显示软件包的详细信息:

  • 版本号

  • 发布版本号

  • 架构

  • 软件包大小

  • 软件包描述

如查看 nginx 软件包的详细信息:

dnf info nginx

已安装的软件包也可以使用 info 命令查看其详细信息:

dnf info vim-enhanced

此处也可以使用通配符进行过滤,如查看所有以 nginx 开头的软件包的详细信息:

dnf info nginx*

通过 repoquery 命令也可以查看软件包的详细信息,效果与 info 命令相同:

dnf repoquery --info nginx

查看软件包组#

软件包组由多个软件包组成,通过软件包组可以一步安装多个软件包。

  • 列出已安装和可安装的软件包组:

    dnf group list
    

    此处可使用 --installed--available 选项进行过滤。如 dnf group list --installed 列出所有已安装的软件包组。

    --hidden 选项可以列出隐藏的软件包组。

  • 查看软件包组内有哪些软件包,如查看 Server 组的软件包:

    dnf group info Server
    

提示

Server 组是一个环境软件包组,它是由多个软件包组组成的,软件包组内又包含了多个软件包。

如果软件包组的名称是由多个单词组成的,需要用引号括起来,如 dnf group info "Development Tools"

此处也可以使用通配符进行过滤,如查看所有以 Server 开头的软件包组:

dnf group list Server*

查看所有以 Server 开头的软件包组的软件包:

dnf group info Server*

软件安装#

在了解完自己需要的软件包后,就可以开始安装自己需要的软件包了。

安装软件#

软件安装有依赖关系,如安装a软件之前,b软件必须先安装,而b软件又依赖于c软件,c软件又依赖于d软件,依此类推。

dnf 会自动解决这些依赖关系,安装软件时会自动安装所有依赖的软件包。

如安装 nginx

dnf install nginx

也可同时安装多个软件包, -y 可以自动同意安装时的所有询问:

dnf install -y nginx wget postfix

安装软件包组#

软件包组是由多个软件包组成的,通过软件包组可以一步安装多个软件包。

如安装 Standard 软件包组:

dnf group install Standard

软件升级#

软件安装后,可能会有新版本的软件包发布,会有缺陷修复,或功能增强等。此时,可以使用 dnf 进行软件升级,且软件升级时会将软件依赖的软件包也一并升级。

检查更新#

检查系统上有哪些软件包可以升级:

dnf check-update

该命令会列出可升级的软件包及其依赖软件包的升级版本。

升级软件#

可以升级单个软件包,也可以升级软件包组,或者升级所有可升级的软件包。

重要

内核是一个非常重要的软件包,某些软件会与内核版本绑定,内核升级后,这些软件往往会出现问题,因此升级内核时要注意此类问题。

查看内核软件包: dnf info kernel

  • 升级所有软件包:

    dnf upgrade
    
  • 升级单个软件包,如升级 nginx

    dnf upgrade nginx
    
  • 升级软件包组,如升级 Standard 软件包组:

    dnf group upgrade Standard
    

提示

部分软件包可能需要重启系统才能生效,因为升级软件包后可视情况为系统做一次重启。

软件自动更新#

软件升级也可以通过 dnf-automatic 来自动进行,它可用来检查更新以及执行以下操作:

  • 只检查更新

  • 检查并下载更新的软件包

  • 检查、下载并安装更新的软件包

当执行完操作后,会根据配置的通知机制将结果通知给管理员,如email或log。

安装dnf-automatic#

可通过 dnf 直接安装 dnf-automatic

dnf install dnf-automatic

确认 dnf-automatic 安装结果:

rpm -qi dnf-automatic
rpm -ql dnf-automatic

提示

rpm :RPM Package Manager,是Redhat Linux及其衍生发行版中用于管理软件包的工具。与 dnf 不同的是, rpm 需要手动下载软件包,然后再使用 rpm 命令进行安装,而 dnf 可以自动下载软件包并安装。

-q 选项用于查询软件包的信息, -i 选项用于显示软件包的安装信息, -l 选项用于显示软件包的文件列表。

更多信息可参见 man rpm

配置dnf-automatic#

dnf-automatic 的配置文件位于 /etc/dnf/automatic.conf ,配置文件分为以下几个部分:

  • [commands]

    配置 dnf-automatic 要执行的操作,如更新类型,是否自动重启系统等。

  • [emitters]

    配置 dnf-automatic 如何通知管理员,如email、stdio和motd。

  • [Email]

    配置email通知的相关信息,如email地址、发信信息等。

  • [command]

    配置要执行的命令

  • [command_email]

    配置命令执行email通知

  • [base]

    此处可配置 dnf 的配置用来覆盖 /etc/dnf/dnf.conf 中的配置。

该文件可按说明修改,不改动使用默认配置也可直接使用。

启用自动更新#

dnf-automatic 共有四个 timer unit

  • dnf-automatic-download.timer :只下载可用的软件包

  • dnf-automatic-install.timer : 下载并安装可用的软件包

  • dnf-automatic-notifyonly.timer : 只通知可用的安装包

  • dnf-automatic.timer : 下载、安装可用的软件包,或进行通知,取决于配置文件中的download_updatesapply_updates 选项。

按需启用 timer unit 即可启用相关功能,如启用 dnf-automatic.timer

systemctl enable --now dnf-automatic.timer
# 查看timer状态
systemctl status dnf-automatic.timer
# 查看系统上所有的timer
systemctl list-timers --all

软件卸载#

软件卸载使用 remove 来完成,用法与 install 命令相似。

如卸载多个软件:

dnf remove nginx wget

卸载软件包组,如删除 Development Tools 软件包组:

dnf group remove "Development Tools"

软件管理历史#

在软件安装、升级、卸载等操作时,系统都会记录相关的操作信息。通过 dnf history 命令可以查看以下信息:

  • dnf的操作时间线

  • 各个操作的日期和时间

  • 每次操作受影响的软件数量

  • 各个操作的结果,成功或取消

  • 每次操作之间的软件包数据库的变化

甚至可以撤回之前的操作。

列出操作历史#

dnf history 可以列出以下事项:

  • 最新的操作记录

    dnf history
    

    history 会显示所有的操作记录,有两个字段的信息值得关注:

    • Action(s) :表示该条记录在当时执行了哪种操作,如安装(install,I)、升级(upgrade,U)、卸载(remove,R)等。

    • Altered :本次操作影响了多少个软件包。

    更详细的说明,可在 man dnf 中搜索 History 进行查看。

  • 列出最近某个软件包的相关操作

    如查看 nginx 软件包的相关操作:

    dnf history list nginx
    
  • 列出某个操作的详细信息

    dnf history 列出的第一个字段为操作ID,可通过操作ID查看该操作的详细信信息,如查看操作ID为1的详细信息:

    dnf history info 1
    

dnf回退#

dnf 可以回退到之前的某个操作,如此前安装了数个软件,可通过回退到之前的操作,来删除这些软件。

dnf 有以下两种回退方式:

  • 回退单个操作: dnf history undo

  • 从某个操作ID回退到之前的另一个操作ID: dnf history undo

重要

系统软件不支持回退,如 selinuxselinux-policy-*kernelglibc 以及它们的依赖包等软件包不支持回退。

回退单个操作#

回退单个操作可以达到以下目的:

  • 安装了一个软件包, undo 可以删除该软件包

  • 卸载了一个软件包, undo 可以重新安装该软件包

  • 升级了一个软件包, undo 可以回退到升级前的版本

接下来实操一下:

  • 查看历史处理记录:

    # dnf history list
    ID | Command line    | Date and time    | Action(s)      | Altered
    -----------------------------------------------------------------------
    75 | remove iotop    | 2025-05-26 16:53 | Removed        |    1
    74 | install iotop   | 2025-05-26 16:53 | Install        |    1
    
  • ID为75的操作是删除了 iotop 软件包,我们可以使用 undo 来回退到该操作:

    dnf history undo 75
    

    此时, iotop 软件包会被重新发起安装。

  • history记录中也会记录此次操作:

    # dnf history list
    ID | Command line     | Date and time    | Action(s)      | Altered
    ----------------------------------------------------------------------
    76 | history undo 75  | 2025-05-26 17:04 | Install        |    1
    

提示

可依据自己系统内的history记录,来选择合适的操作ID进行回退,如先前安装的 nginx

从新版本回退到旧版本,如果旧版本的安装包无法下载,回退将失败(镜像站点通常只提供新版本的软件包)。

回退多个操作#

undo 是回退单个操作,而 rollback 是从最后一个操作ID到指定操作ID之间的所有操作都回退。

如下面的例子:

  • 当前的操作历史记录:

    ../_images/1-1110.png
  • 回退到ID为71的操作记录:

    ../_images/1-126.png

    rollback 会将75到71之间的所有操作都回退,因此系统会提示是否要删除在此期间安装的所有软件包。

提示

undo 可以回退指定的单条操作,而 rollback 可以回退指定操作ID与最新操作ID之间的所有操作。

但无论是 undo 还是 rollback ,都不能回退系统软件,如遇到涉及系统软件的回退操作,会提示无法找到旧版本的软件包而失败。

管理软件仓库#

尽管系统自带的软件仓库已经足够丰富,但某些时候,我们需要安装的软件包可能不在系统自带的软件仓库中,此时,我们可以在系统中添加其它的软件仓库,来安装我们需要的软件包。

软件仓库的定义文件位于 /etc/yum.repos.d/ 目录下,每个文件定义一个软件仓库,文件的后缀名为 .repo

软件仓库参数#

../_images/1-135.png

软件仓库中的常用配置参数如下:

  • [xxxx] :软件仓库的ID,名称必须唯一,如 [baseos]

  • name :软件仓库的名称,如 Rocky Linux $releasever - BaseOS

  • baseurl :软件仓库的 URL

  • mirrorlist :软件仓库的镜像列表,该地址会返回一个镜像列表,供系统选择。

  • gpgcheck :是否检查软件仓库的GPG签名,检查软件仓库的GPG签名可以防止软件包被篡改,1表示检查,0表示不检查。

  • enabled :是否启用该软件仓库,1表示启用,0表示禁用,可通过 dnf config-manager --enable/--disable 来启用或禁用软件仓库。

  • countme :是否添加特殊标识,1表示添加,0表示不添加,此参数方便软件仓库站点统计有多少系统在使用自己的软件仓库。

  • metadata_expire元数据 过期时间,如6h表示6小时后过期。

  • gpgkey :软件仓库的GPG密钥位置,用于验证软件仓库的GPG签名。

提示

更多参数可参见 man dnf.conf 中的 REPO OPTIONS 及以下的内容。

添加软件仓库#

系统中自带的nginx软件版本较低,但nginx官方提供了最新版本的软件包,我们可以通过添加软件仓库,来安装最新版本的nginx。

官方说明 ,在 /etc/yum.repos.d/ 目录下创建 nginx.repo 文件,并添加如下内容:

# 创建nginx.repo文件
vim /etc/yum.repos.d/nginx.repo
# 添加以下内容
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

此时在查看nginx信息时,发现有更新的版本提供:

../_images/1-145.png

nginx共提供了两个版本的软件仓库,一个是稳定版,一个是主线版,我们可以通过启用或禁用软件仓库,来选择我们需要的版本。

默认启动用的稳定版本,可以切换到主线版本:

  • 启用主线版本:

    dnf config-manager --enable nginx-mainline
    
  • 禁用稳定版本:

    dnf config-manager --disable nginx-stable
    
  • 安装最新版本的nginx:

    # 此前如安装了nginx,需要先卸载
    dnf remove nginx
    # 安装最新版本的nginx
    dnf install nginx
    

应用版本管理#

appstream 软件仓库中对于某一个软件会提供多个版本,系统默认安装的版本有时并不是最新的。

要查看这类内容,可使用以下命令:

dnf module list
../_images/1-155.png

作为对比,可以查看系统中提供的 php 版本:

dnf info php
../_images/1-165.png

可以看到,系统默认提供的php版本是8.0.30,而 appstream 软件仓库中提供的php版本有8.1和8.2两个更高的版本。

版本切换#

如果想要使用更高版本的php,就需要将系统中可用的php版本切换到更高版本,如切换到8.2版本:

dnf module enable php:8.2

备注

切换版本是以应用加版本号为目标的,如上述的php,就是 php:8.2 , 其它 dnf module list 中的应用都是按此方式来切换可用版本的。

切换完成后,此时再查看系统中提供的php版本:

dnf info php
../_images/1-175.png

原本系统默认提供的php版本是8.0,此时已经变为了8.2了。

重置版本#

如果想要将系统中可用的php版本重置为默认版本,可使用以下命令:

dnf module reset php

此时系统中提供的php版本又变回了8.0了。

提示

更多关于版本管理的内容可参见 man dnf 中的 Module Command 中的内容。

脚注