14.Rocky Linux 软件管理

软件安装与更新是系统管理的基础工作之一。在这一章中,我们系统性地讨论 Rocky Linux 中软件管理的相关内容,包括:

管理软件包仓库及签名

软件安装、更新、卸载及事务回退

创建和同步软件包仓库

RPM 包内部结构介绍

14.1 管理软件包存储库及签名

和其他 Linux 发行版一样,Rocky Linux 同样基于 repos 机制提供软件。其中包括软件包列表、包之间的依赖关系列表、以及其他有用的元数据。

我们可以使用dnfyum命令查看系统中可用的 repos:

两者的输出完全相同。在 Rocky Linux 8 中,yum是指向dnf命令的符 链接:

虽然两者结果相同,但在整个系列文章中,我会使用dnf命令完成相关操作。

YUM 是 Yellowdog Updater Modified 的首字母缩写,该项目最初是为 mac 电脑开发 Linux 发行版,名为 Yellowdog。DNF 是 Dandified YUM 的缩写。

定义 repos 的文件在 目录下。我们看一下 文件的内容:

在Rocky Linux 高级安装选项一章中,为了加快软件包的安装速度,我把官 默认的源修改成了南京大学的源。

中的内容是节的名称,表示每节的开始,在这个示例中节名是 。包含以下选项:

name:repos (仓库) 名称。使用dnf repolist列出仓库时显示的名称。

baseurl:提供软件包资源的位置。在这个示例中,它是一个 https 源。包含的变量,在访问时会被替换成对应值。其他提供软件包资源的方式有 NFS、HTTP 和 FTP。

enabled:定义了在系统中启用或禁用该仓库。当值为 时,启用仓库,值为 时,禁用仓库。

gpgcheck:验证软件包的机制。当值为 时被启用,所有使用 dnf/yum 安装在系统中的软件包将被使用它们的 gpg 签名与提供的密钥进行验证。

gpgkey:一个使用 gpg 验证下载的软件包的密钥。

使仓库正常运行的最小配置是:name、baseurl、gpgcheck (需要把 gpgcheck 的值设置为 )。

14.1.1 列出所有仓库

要查看系统中的所有仓库,可以使用dnf repolist –all命令,它同时还显示了仓库的状态:

14.1.2 启用或禁用仓库

可以通过以下两条命令启用或禁用指定的仓库,repoName 表示仓库名称:

这两条命令会修改对应仓库 repo 文件中的 enabled 值。

14.1.3 添加仓库

可以通过仓库的 URL 添加仓库,比如 EPEL repo。EPEL 包含“企业版 Linux 附加包”,是专为 Linux 建立的,被广泛使用,并且在 https://mirrors.bfsu.edu.cn/epel/8/Everything/x86_64/ 有一个国内镜像。我们可以使用dnf config-manager –add-repo=”url”命令添加这个仓库:

更多镜像仓库,可以在 https://admin.fedoraproject.org/mirrormanager/mirrors/EPEL 查询。

查看 文件的内容:

可以看到新添加的 repo 缺少了选项,不过我们依然能够安装 EPEL 中的screen包:

搜索到了screen包,我们安装它:

返回 “GPG check FAILED” 的错误,因为该 repo 虽然没有定义 gpgcheck 选项,但它的默认值为 1,所以需要我们添加 gpgkey:

然后修改 文件:

可以看到,我们在文件中添加了gpgcheck 和 gpgkey 条目。再次安装screen包:

你会注意到有一个步骤,它要求你确认 gpg 密钥的指纹是否正确:“94E2 79EB 8D8F 25B2 1810 ADF1 21EA 45AB 2F86 D6A1”。可以在 Fedora 的安全页面查看,因为 Fedora 项目在管理 EPEL:https://getfedora.org/security/。

我们刚刚验证了使用的签名与管理它的项目所公布的指纹相同,所有从这个 repo 下载的软件包都将被验证,以避免软件包被篡改。

14.2 软件的安装、更新和回退

在上一节中,我们安装了软件包。在安装包的过程中,有一个交互性的操作,以便我们确认在系统中安装新的软件。

14.2.1 安装软件包

dnf install命令用来安装软件, 选项可以替代交互式的输入:

zip包被安装了,并且还安装了依赖包unzip,也没有再让我们输入 。dnf会找到依赖的软件包,解析依赖,并安装包运行时所需的所有内容。通过这种方式,系统保持了一致的状态、以及更加可靠和可预测。

14.2.2 更新软件包

我们可以通过dnf check-update命令查看哪些包提供了可用的更新:

更新包、应用补丁和安全补丁的最简单方法是使用dnf update命令。

更新指定的软件包:

更新所有软件包,只需要运行dnf udpate命令,无需指定包名:

这些都是系统中更新包的例子。

内核是系统中最重要的部分。它支持硬件访问和操作系统的所有基本功能。这就是为什么,不是升级内核,而是安装一个新版本。系统会保留前两个版本,以防系统无法启动,并且我们可以指定运行哪个版本的内核。

14.2.3 搜索软件包

dnf search命令用来搜索可用的软件包:

14.2.4 查看软件包的信息

dnf info命令用来获取指定软件包的扩展信息,无论该包是否安装:

14.2.5 删除软件包

dnf remove命令用来删除已安装的软件包:

14.2.6 安装软件包组

有一些软件包组合在一起执行特定的任务,它们被称为 package group。可以通过dnf grouplist命令查看包组:

可以通过 过滤出指定关键字的包组。

dnf groupinstall命令用来包组。我们用它来安装系统工具组:

可以看到将安装几十个包。

14.2.7 安装包的历史记录

dnf history命令可以查看所有安装事务的历史记录:

14-1. dnf history

通过 ID ,可以获取相关事务的详细信息:

14.2.8 撤销事务到指定的点

可以使用dnf history rollback命令,回退系统中通过dnf管理的软件包到指定的点。

为了方便演示,我们安装 “net-tools” 包:

然后回退到上一个事务 ID:

这时,会提示我们输入 y,以删除事务 15 安装的 “net-tools” 包。如果回退的点之后有多个事务,这些事务都会被撤销。

14.2.9 撤销单个事务

还可以使用dnf history undo撤销指定的事务。我的示例中,在事务 13 的位置删除了screen,可以使用undo子命令,撤销事务 13 删除 screen 软件包的操作:

也可以在执行 rollback/undo 时指定 参数,避免交互式操作:

14.2.10 模块化

在 Rocky Linux 8 中,有一个新特性:模块化。它使系统中的同一个软件包可以有多个版本。所有这些都是由dnf提供的,不需要安装额外的软件:

不指定任何包的dnf module list命令,将显示模块的完整列表。

可以看到,在 Rocky Linux 8 中提供了四个版本的 Nginx,分别是 1.14、1.16、1.18、1.20。默认版本是 1.14,被启用的版本也是 1.14。

我们使用dnf module命令启用 Nginx 1.20 的版本:

此时,再使用dnf安装 Nginx,版本就是 1.20 了。

我们可以删除已安装的软件包,并将module状态重置为最初的位置:

更多模块化的相关信息,可以通过man dnf.modularity命令,进入手册页查看。

14.3 创建和同步本地 repos

有时我们会下载 RPM 文件到某个目录,有时会构建自己的 RPM 文件,然后分发它们,为此,我们需要创建一个 repo。

createrepo命令用来创建仓库,我们在 目录下创建 repos 目录:

在当前目录中创建一个名为 的目录,它是一个通信工具,我们把它的 RPM 文件下载到 目录中:

在仓库中可以包含很多 RPM 文件,我们的示例中仅是单独的 RPM 包。

安装createrepo命令:

使用以下命令在当前目录中创建仓库:

我们看到创建了 目录,该目录中包含 文件,定义了存储库的内容、以及最新创建的索引文件:

接着把仓库添加到系统中。仓库可以不使用 gpg 签名,将 gpgcheck 的值设置为 0。但为了更好的安全性,我们使用签名。可以把 slack 的相关签名下载到 目录中:

然后,创建 文件,将存储库添加到系统中。repo 文件的内容如下:

通过dnf repolist命令可以查看新增的 repo:

现在,我们尝试安装slack。要运行slack,需要安装 GUI 包组,但出于演示目的,我们仅安装slack。执行dnf install -y slack命令安装包,安装的过程中,还会导入 gpg 密钥验证包:

如果有新版本的slack,我们可以把它下载到同一目录中,并再次运行createrepo命令重新生成仓库索引。这样,所有包含该仓库的系统,在执行dnf update时,都会更新slack。这是一个让所有系统保持标准化和相同版本的好方法。

有时,我们希望在系统中保存仓库的本地副本。为此,我们可以使用reposync工具。

reposync命令包含在 “dnf-utils” 包中,需要安装该包:

“yum-utils” 包和 “dnf-utils” 包相同。

作为演示,我们禁用除 “baseos” 外的所有仓库,但别忘记在本章结束后再把它们启用:

禁用仓库还有另外一个方法,就是修改 repo 文件的后缀,改成非 结尾。

运行reposync命令同步可用的 repos:

这将下载启用的 repo 的最新软件包。选项的含义如下:

–newest-only:仅最新版。仓库保留了自第一次发布以来的软件包的所有版本,加上此参数,仅下载最新版的软件包。

–download-metadata:为了确保我们下载的是一个功能齐全的 repo,并且无需再执行createrepo命令,我们可以添加该选项,它将检索源仓库中的所有元数据。

–destdir /var/tmp/repos:为下载的文件指定目标目录。它将为每个配置的 repo 创建一个目录,所以指定的目录是所有 repo 的父目录。

有了这个复制来的仓库,我们就可以在 络隔离的环境中使用dnf包管理工具了。

在学习了 repos 的基础知识以及如何使用它们来管理软件之后,让我们深入了解它背后的技术,即红帽软件包管理器 (Red Hat Package Manager),简称 RPM。

14.4 RPM 内部结构

Linux 发行版往往有自己的包管理器,从 Debian 的 .deb 到 Arch Linux 的 Pacman,以及其他不同的包管理器。软件包管理器的目的是让系统安装、更新软件,维护依赖关系更方便,并管理系统上所安装软件的内部数据库。RPM 被 Fedora、CentOS、Oracle Linux 等发行版本使用,当然还有 Rocky Linux。

为了管理 RPM,系统提供了rpm命令。然而,自从引入yum/dnf后,已经很少在系统中使用rpm了。

RPM 包含以下内容:

需要安装在系统上的文件,以 CPIO 格式存储,并进行压缩。

每个文件的权限和指定的所有者及组信息。

为每个包提供的必需的依赖项,以及与其他软件包的冲突项。

安装、卸载和升级脚本。

签名,以确保软件包未被修改。

为了进一步了解它,我们来看一些简单有用的rpm命令。

查看包的相关命令:

rpm –qa:列出系统中已安装的所有 rpm 包。

rpm –qf:查询指定的文件是由哪个包安装的。

rpm –ql:列出下载的包中包含的文件。

安装、升级和删除包的命令:

rpm –i:安装所提供的软件包列表,但不处理依赖。

rpm –U:用下载的软件包升级。

rpm –e:删除指定的软件包,不会删除依赖的包。

所有已安装软件包的数据库都位于 中,可以用rpmdb命令来管理。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年4月12日
下一篇 2022年4月12日

相关推荐