实验室 7:管理和安装软件¶
目标¶
完成本实验室后,您将能够
- 查询软件包以获取信息
- 从二进制软件包安装软件
- 解决一些基本的依赖关系问题
- 从源代码编译和安装软件
完成本实验室的预计时间:90 分钟
二进制文件和源文件¶
系统上安装的应用程序取决于几个因素。主要因素取决于在操作系统安装期间选择的软件包组。另一个因素取决于系统自使用以来的操作。
您会发现,作为系统管理员,您的日常任务之一是软件管理。这通常包括
- 安装新软件
- 卸载软件
- 更新已安装的软件
在基于 Linux 的系统上安装软件使用多种方法。您可以从源代码或预编译的二进制文件安装。后一种方法是最简单的方法,但也是最不可定制的。当您从预编译的二进制文件安装时,大部分工作已经为您完成。尽管如此,您仍然需要知道要安装的特定软件的名称和位置。
几乎所有软件最初都作为 C 或“C++”编程语言源文件提供。源程序通常以源文件存档的形式发布。通常是 tar’ed 或 gzip’ed d 或 bzip2’ed 文件。这意味着它们是压缩的或作为单个捆绑包提供的。
大多数开发人员已使其源代码符合 GNU 标准,从而使共享变得更加容易。这也意味着这些软件包将在任何 UNIX 或类 UNIX 系统(例如 Linux)上编译。
RPM 是 Red Hat 基于的發行版(例如 Rocky Linux、Fedora、Red Hat Enterprise Linux (RHEL)、openSuSE、Mandrake 等)上管理应用程序(软件包)的基础工具。
用于管理 Linux 发行版上软件的应用程序称为软件包管理器。示例如下
- Red Hat 软件包管理器 (
rpm
)。软件包的后缀为“ .rpm” - Debian 软件包管理系统 (
dpkg
)。软件包的后缀为“ .deb”
下面列出了 RPM 命令的一些流行的命令行选项和语法
rpm
¶
用法:rpm [选项...]
查询软件包
Query options (with -q or --query):
-c, --configfiles list all configuration files
-d, --docfiles list all documentation files
-L, --licensefiles list all license files
-A, --artifactfiles list all artifact files
--dump dump basic file information
-l, --list list files in package
--queryformat=QUERYFORMAT use the following query format
-s, --state display the states of the listed files
验证软件包
Verify options (with -V or --verify):
--nofiledigest don't verify digest of files
--nofiles don't verify files in package
--nodeps don't verify package dependencies
--noscript don't execute verify script(s)
安装、升级和删除软件包
Install/Upgrade/Erase options:
--allfiles install all files, even configurations that might otherwise be skipped
-e, --erase=<package>+ erase (uninstall) package
--excludedocs do not install documentation
--excludepath=<path> skip files with leading component <path>
--force shorthand for --replacepkgs --replacefiles
-F, --freshen=<packagefile>+ upgrade package(s) if already installed
-h, --hash print hash marks as package installs (good with -v)
--noverify shorthand for --ignorepayload --ignoresignature
-i, --install install package(s)
--nodeps do not verify package dependencies
--noscripts do not execute package scriptlet(s)
--percent print percentages as package installs
--prefix=<dir> relocate the package to <dir>, if relocatable
--relocate=<old>=<new> relocate files from path <old> to <new>
--replacefiles ignore file conflicts between packages
--replacepkgs reinstall if the package is already present
--test don't install, but tell if it would work or not
-U, --upgrade=<packagefile>+ upgrade package(s)
--reinstall=<packagefile>+ reinstall package(s)
练习 1¶
安装、查询和卸载软件包¶
在本实验室中,您将学习如何使用 RPM 系统并安装示例应用程序。
提示
您有很多选择来获取 Rocky Linux 软件包。您可以从受信任的 [或不受信任的] 仓库手动下载它们。您可以从发行版 ISO 获取它们。您可以使用 - nfs、git、https、ftp、smb、cifs 等协议从集中共享位置获取它们。如果您好奇,您可以查看以下官方网站并浏览适用于所需软件包的相应仓库
https://download.rockylinux.org/pub/rocky/8.8/
查询软件包以获取信息¶
要查看当前安装在本地系统上的所有软件包的列表,请键入
$ rpm -qa python3-gobject-base-* NetworkManager-* rocky-repos-* ...<OUTPUT TRUNCATED>...
您应该会看到一个很长的列表。
让我们深入了解一下,并详细了解安装在系统上的其中一个软件包。我们将检查 NetworkManager。我们将使用
rpm
命令的 --query (-q) 和 --info (-i) 选项。键入$ rpm -qi NetworkManager Name : NetworkManager Epoch : 1 ...<OUTPUT TRUNCATED>...
信息量很大(元数据)!
假设我们只对上一个命令的 Summary 字段感兴趣。我们可以使用 rpm 的 --queryformat 选项来过滤从查询选项获得的信息。
例如,要仅查看 Summary 字段,请键入
rpm -q --queryformat '%{summary}\n' NetworkManager
字段名称不区分大小写。
要查看已安装的 NetworkManager 包的 Version 和 Summary 字段,请键入
rpm -q --queryformat '%{version} %{summary}\n' NetworkManager
键入命令以查看有关系统上安装的 bash 包的信息。
rpm -qi bash
注意
前面的练习是查询和处理系统上已安装的软件包。在接下来的练习中,我们将开始处理尚未安装的软件包。我们将使用 DNF 应用程序下载我们在后续步骤中将使用的软件包。
首先,确保系统上尚未安装
wget
应用程序。键入rpm -q wget package wget is not installed
看起来我们的演示系统上没有安装
wget
。从 Rocky Linux 8.x 开始,
dnf download
命令将允许您获取wget
的最新rpm
包。键入dnf download wget
使用
ls
命令确保包已下载到当前目录。键入ls -lh wg*
使用
rpm
命令查询有关下载的 wget-*.rpm 的信息。键入rpm -qip wget-*.rpm Name : wget Architecture: x86_64 Install Date: (not installed) Group : Applications/Internet ...<TRUNCATED>...
问题
从上一步的输出中,
wget
包到底是什么?提示:您可以使用rpm
查询格式选项查看下载包的描述字段。如果您对
wget files-.rpm
包感兴趣,您可以通过键入以下内容列出包中包含的所有文件rpm -qlp wget-*.rpm | head /etc/wgetrc /usr/bin/wget ...<TRUNCATED>... /usr/share/doc/wget/AUTHORS /usr/share/doc/wget/COPYING /usr/share/doc/wget/MAILING-LIST /usr/share/doc/wget/NEWS
让我们查看
wget
包的一部分列出的/usr/share/doc/wget/AUTHORS
文件的内容。我们将使用cat
命令。键入cat /usr/share/doc/wget/AUTHORS cat: /usr/share/doc/wget/AUTHORS: No such file or directory
wget
还没有安装在我们的演示系统上!因此,我们无法查看与其打包在一起的 AUTHORS 文件!查看与已安装在系统上的另一个包(curl)一起提供的文件列表。键入
$ rpm -ql curl /usr/bin/curl /usr/lib/.build-id /usr/lib/.build-id/fc ...<>...
注意
您会注意到,您不必在前面的命令中引用
curl
包的完整名称。这是因为curl
已经安装了。
关于软件包名称的扩展知识¶
完整软件包名称:当您从受信任的来源(例如,供应商网站、开发人员存储库)下载软件包时,下载文件的名称是完整软件包名称,例如 - htop-3.2.1-1.el8.x86_64.rpm。当使用
rpm
命令安装/更新此软件包时,命令操作的对象必须是软件包的完整名称(或匹配的通配符等效项),例如rpm -ivh htop-3.2.1-1.el8.x86_64.rpm
rpm -Uvh htop-3.2.1-1.*.rpm
rpm -qip htop-3.*.rpm
rpm -qlp wget-1.19.5-11.el8.x86_64.rpm
软件包的完整名称遵循类似于此的命名约定——
[Package_Name]-[Version]-[Release].[OS].[Arch].rpm
或[Package_Name]-[Version]-[Release].[OS].[Arch].src.rpm
软件包名称:由于 RPM 使用数据库来管理软件,因此一旦软件包安装完成,数据库将具有相应的记录。目前,
rpm
命令的操作对象只需要键入软件包名称即可。例如rpm -qi bash
rpm -q systemd
rpm -ql chrony
练习 2¶
软件包完整性¶
有可能下载或最终获得损坏或污染的文件。验证您下载的
wget
软件包的完整性。键入rpm -K wget-*.rpm wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK
输出中的“digests signatures OK”消息表明软件包没有问题。
让我们恶意地故意更改下载的软件包。这可以通过向原始软件包添加任何内容或从原始软件包中删除任何内容来完成。任何以原始打包者未预料到的方式更改软件包的操作都将损坏软件包。我们将使用
echo
命令更改文件,以将字符串“haha”添加到软件包中。键入echo haha >> wget-1.19.5-10.el8.x86_64.rpm
现在尝试使用 rpm 的 -K 选项再次验证软件包的完整性。
$ rpm -K wget-*.rpm wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK
现在是一个非常不同的消息。输出“DIGESTS SIGNATURES NOT OK”清楚地警告您不应该尝试使用或安装软件包。它不应该再被信任了。
使用
rm
命令删除损坏的wget
软件包文件,并使用dnf
下载新的副本。键入rm wget-*.rpm && dnf download wget
再次检查新下载的软件包是否通过了 RPM 的完整性检查。
练习 3¶
安装软件包¶
在系统上安装软件时,您可能会遇到“依赖关系失败”问题。当使用低级 RPM 实用程序手动管理系统上的应用程序时,这种情况尤其常见。
例如,如果您尝试安装软件包“abc.rpm”,RPM 安装程序可能会抱怨某些依赖关系失败。它可能会告诉您,软件包“abc.rpm”需要先安装另一个软件包“xyz.rpm”。依赖关系问题出现的原因是,软件应用程序几乎总是依赖于另一个软件或库。如果系统上不存在必需的程序或共享库,则必须在安装目标应用程序之前满足该先决条件。
低级 RPM 实用程序通常知道应用程序之间的相互依赖关系。但它通常不知道如何或在哪里获取解决问题所需的应用程序或库。换句话说,RPM 知道什么和如何,但没有内置的功能来回答在哪里这个问题。这就是 dnf
、yum
等工具大放异彩的地方。
安装软件包¶
在本练习中,您将尝试安装 wget
软件包 (wget-*.rpm)。
尝试安装
wget
应用程序。使用 RPM 的 -ivh 命令行选项。键入rpm -ivh wget-*.rpm error: Failed dependencies: libmetalink.so.3()(64bit) is needed by wget-*
马上 - 依赖关系问题!示例输出显示
wget
需要一个名为“libmetalink.so.3”的库文件。注意
根据上述测试的输出,wget-*.rpm 软件包要求安装 libmetalink-*.rpm 软件包。换句话说,libmetalink 是安装 wget-*.rpm 的先决条件。如果您完全知道自己在做什么,可以使用“nodeps”选项强制安装 wget-*.rpm 软件包,但这通常是一种不好的做法。
RPM 已经给了我们一个关于缺少什么的提示。您会记得
rpm
知道什么和如何,但不一定知道在哪里。让我们使用dnf
实用程序来确定提供缺少库的软件包名称。键入$ dnf whatprovides libmetalink.so.3 ...<TRUNCATED>... libmetalink-* : Metalink library written in C Repo : baseos Matched from: Provide : libmetalink.so.3
从输出中,我们需要下载提供缺少库的
libmetalink
软件包。具体来说,我们想要库的 64 位版本。让我们调用一个单独的实用程序(dnf
)来帮助我们找到并下载适用于我们的演示 64 位(x86_64)架构的软件包。键入dnf download --arch x86_64 libmetalink
您现在应该在工作目录中至少有两个 rpm 包。使用
ls
命令确认这一点。安装缺少的
libmetalink
依赖关系。键入sudo rpm -ivh libmetalink-*.rpm
现在依赖关系已安装,我们现在可以重新审视我们最初的安装
wget
软件包的目标。键入sudo rpm -ivh wget-*.rpm
注意
RPM 支持事务。在前面的练习中,我们可以执行单个 rpm 事务,其中包括我们想要安装的原始软件包以及它依赖的所有软件包和库。以下这样的单个命令就足够了
```bash rpm -Uvh wget-*.rpm libmetalink-*.rpm ```
现在是真相时刻。尝试在没有任何选项的情况下运行
wget
程序以查看它是否已安装。键入wget
让我们看看
wget
的实际应用。使用wget
从命令行从互联网下载文件。键入wget https://linuxkernel.org.cn
这将从 kernel.org 网站下载默认的 index.html!
使用
rpm
查看wget
应用程序包含的所有文件列表。使用
rpm
查看与wget
打包在一起的任何文档。使用
rpm
查看与wget
软件包一起安装的所有二进制文件列表。您必须安装
libmetalink
软件包才能安装wget
。尝试从命令行运行或执行libmetalink
。键入libmetalink -bash: libmetalink: command not found
注意
这是什么?为什么你不能运行或执行
libmetalink
?
通过 rpm
导入公钥¶
提示
用于签署 Rocky Linux 项目中使用的软件包的 GPG 密钥可以从各种来源获取,例如 - 项目网站、ftp 站点、发行版媒体、本地源等等。如果您的 RL 系统的密钥环上缺少正确的密钥,您可以使用 rpm
的 --import
选项从本地 RL 系统导入 Rocky Linux 的公钥,方法是运行:sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
问题
安装软件包时,rpm -Uvh
和 rpm -ivh
有什么区别?查阅 rpm
的手册页。
练习 4¶
卸载软件包¶
使用 Red Hat 的软件包管理器 (RPM) 卸载软件包就像安装一样容易。
在本练习中,您将尝试使用 rpm
从系统中卸载一些软件包。
卸载软件包¶
从您的系统中卸载
libmetalink
软件包。键入sudo rpm -e libmetalink
问题
解释为什么你无法删除该软件包?
使用 RPM 删除软件包的干净且正确的方法是删除软件包及其依赖关系。要删除
libmetalink
软件包,我们还必须删除依赖它的wget
软件包。键入sudo rpm -e libmetalink wget
注意
如果您想破坏依赖于 libmetalink 的软件包并强制从您的系统中删除该软件包,您可以使用 rpm 的
--nodeps
选项,如下所示:$ sudo rpm -e --nodeps libmetalink
。i. “nodeps”选项表示没有依赖关系。即,忽略所有依赖关系。ii. 以上展示了如何强制从系统中删除软件包。有时您需要这样做,但这通常不是一个好习惯。iii. 强制删除另一个已安装的软件包“abc”依赖的软件包“xyz”实际上会使软件包“abc”无法使用或部分损坏。
练习 5¶
DNF - 软件包管理器¶
DNF 是针对基于 RPM 的 Linux 发行版的软件包管理器。它是流行的 YUM 实用程序的继任者。DNF 保持与 YUM 的兼容性。这两个实用程序都共享类似的命令行选项和语法。
DNF 是管理基于 RPM 的软件(如 Rocky Linux)的众多工具之一。与 rpm
相比,这些更高级的工具有助于简化软件包的安装、卸载和查询。重要的是要注意,这些工具使用 RPM 系统提供的底层框架。这就是了解如何使用 RPM 很重要的原因。
DNF(以及其他类似工具)充当 RPM 的一种包装器,并提供 RPM 未提供的额外功能。DNF 知道如何处理包和库依赖关系,并且还知道如何使用配置的存储库来自动解决大多数问题。
dnf
实用程序中常用的选项是
usage: dnf [options] COMMAND
List of Main Commands:
alias List or create command aliases
autoremove remove all unneeded packages that were originally installed as dependencies
check check for problems in the packagedb
check-update check for available package upgrades
clean remove cached data
deplist [deprecated, use repoquery --deplist] List package's dependencies and what packages provide them
distro-sync synchronize installed packages to the latest available versions
downgrade Downgrade a package
group display, or use, the groups information
help display a helpful usage message
history display, or use, the transaction history
info display details about a package or group of packages
install install a package or packages on your system
list list a package or groups of packages
makecache generate the metadata cache
mark mark or unmark installed packages as installed by user.
module Interact with Modules.
provides find what package provides the given value
reinstall reinstall a package
remove remove a package or packages from your system
repolist display the configured software repositories
repoquery search for packages matching keyword
repository-packages run commands on top of all packages in given repository
search search package details for the given string
shell run an interactive DNF shell
swap run an interactive DNF mod for remove and install one spec
updateinfo display advisories about packages
upgrade upgrade a package or packages on your system
upgrade-minimal upgrade, but only 'newest' package match which fixes a problem that affects your system
使用 dnf
安装包¶
假设您已经从练习中卸载了 wget
实用程序,我们将使用 DNF 在以下步骤中安装该包。之前使用 rpm
安装 wget
时需要的 2-3 步流程现在使用 dnf
变成了一步流程。dnf
将静默解决任何依赖关系。
首先,让我们确保
wget
和libmetalink
已从系统中卸载。输入sudo rpm -e wget libmetalink
删除后,如果您尝试从 CLI 运行
wget
,您会看到类似于wget: command not found的消息现在使用
dnf
安装wget
。输入sudo dnf -y install wget Dependencies resolved. ...<TRUNCATED>... Installed: libmetalink-* wget-* Complete!
提示
前面命令中使用的“-y”选项抑制了“[y/N]”提示以确认
dnf
将要执行的操作。这意味着所有确认操作(或交互式响应)都将是“是”(y)。DNF 提供了一个“环境组”选项,使向系统添加新的功能集变得容易。要添加该功能,您通常需要分别安装几个包,但是使用
dnf
,您只需要知道您想要的功能的名称或描述。使用dnf
显示可用组的列表。输入dnf group list
我们对“开发工具”组/功能感兴趣。让我们获取有关该组的更多信息。输入
bash dnf group info "Development Tools"
稍后,我们将需要一些带有“开发工具”组的程序。使用
dnf
安装“开发工具”组,方法是运行sudo dnf -y group install "Development Tools"
使用 dnf
卸载包¶
要使用
dnf
卸载wget
包,请键入sudo dnf -y remove wget
使用
dnf
确保该包已从系统中删除。输入sudo dnf -y remove wget
尝试使用/运行
wget
。输入wget
使用 dnf
更新包¶
DNF 可以检查并安装存储库中可用的各个包的最新版本。它也可以用来安装特定版本的包。
将列表选项与
dnf
一起使用以查看系统中可用的wget
程序版本。输入dnf list wget
如果您只想查看是否有可用的更新版本,请使用
dnf
的检查更新选项。例如,对于wget
包,请键入dnf check-update wget
现在,列出系统中内核包的所有可用版本。输入
sudo dnf list kernel
接下来,检查是否为已安装的内核包提供了任何更新的包。输入
dnf check-update kernel
包更新可能是由于错误修复、新功能或安全补丁造成的。要查看内核包是否有任何与安全相关的更新,请键入
dnf --security check-update kernel
使用 dnf
更新系统¶
DNF 可用于检查和安装系统上安装的所有包的最新版本。定期检查是否安装了更新是系统管理的重要方面。
要检查您当前系统上安装的包是否有任何更新,请键入
dnf check-update
要检查系统上安装的所有包是否有任何与安全相关的更新,请键入
dnf --security check-update
要将系统上安装的所有包更新到为您的发行版提供的最新版本,请运行
dnf -y check-update
练习 6¶
从源代码构建软件¶
所有软件/应用程序/包都源自普通的可读文本文件。这些文件统称为源代码。安装在 Linux 发行版上的 RPM 包都源自源代码。
在本练习中,您将从源文件中下载、编译和安装示例程序。为了方便起见,源文件通常以单个压缩文件形式分发,称为 tar-ball(发音为 tar-dot-gee-zee)。
以下练习将基于久负盛名的 Hello 项目源代码。hello
是用 C++ 编写的简单命令行应用程序,它只做一件事,就是向终端打印“hello”。您可以在此处了解有关该项目的更多信息
下载源文件¶
使用
curl
下载hello
应用程序的最新源代码。让我们将该文件下载并保存到 Downloads 文件夹中。https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz
解压缩该文件¶
更改到您在本地机器上下载 hello 源代码的目录。
使用
tar
程序解压缩(解压缩)tarball。输入tar -xvzf hello-2.12.tar.gz
输出
hello-2.12/ hello-2.12/NEWS hello-2.12/AUTHORS hello-2.12/hello.1 hello-2.12/THANKS ...<TRUNCATED>...
使用
ls
命令查看您的 pwd 内容。在解压缩过程中应该为您创建了一个名为 hello-2.12 的新目录。
更改到该目录并列出其内容。输入
cd hello-2.12 ; ls
始终检查源代码中附带的任何特殊安装说明是一个好习惯。这些文件通常具有以下名称:INSTALL、README 等。
使用分页器打开 INSTALL 文件并阅读它。输入
less INSTALL
完成查看文件后退出分页器。
配置包¶
大多数应用程序都具有可以由用户启用或禁用的功能。这是拥有源代码并从源代码安装的优势之一。您可以控制应用程序的可配置功能。这与接受包管理器从预编译的二进制文件中安装的所有内容形成对比。
通常允许您配置软件的脚本通常恰如其分地命名为“configure”
提示
在尝试完成以下练习之前,请确保您已安装“开发工具”包组。
sudo dnf -y group install "Development Tools"
再次使用
ls
命令以确保您的 pwd 中确实有一个名为configure的文件。要查看您可以在
hello
程序中启用或禁用的所有选项,请键入./configure --help
问题
从命令的输出中, “--prefix”选项的作用是什么?
如果您对 configure 脚本提供的默认选项感到满意。输入
./configure
注意
希望配置阶段顺利完成,您可以继续进行编译阶段。
如果您在配置阶段遇到了一些错误,您应该仔细查看输出的尾部,以查看错误的来源。错误有时是自解释的,并且易于修复。例如,您可能会看到类似于以下的错误
configure: error: no acceptable C compiler found in $PATH
上述错误仅仅意味着您没有在系统上安装 C 编译器(例如,
gcc
)或编译器安装在不在您的 PATH 变量中的某个位置。
编译包¶
您将在以下步骤中构建 hello 应用程序。这就是您之前使用 DNF 安装的“开发工具”组附带的一些程序派上用场的地方。
运行“configure”脚本后,使用 make 命令编译该包。输入
make
输出
gcc -g -O2 -o hello src/hello.o ./lib/libhello.a make[2]: Leaving directory '/home/rocky/hello-2.12' ...<OUTPUT TRUNCATED>... make[1]: Leaving directory '/home/rocky/hello-2.12'
如果一切顺利,这个重要的
make
步骤将有助于生成最终的hello
应用程序二进制文件。再次列出您当前工作目录中的文件。您应该看到一些新创建的文件,包括
hello
程序。
安装应用程序¶
除了其他维护任务外,最终的安装步骤还包括将任何应用程序二进制文件和库复制到适当的文件夹中。
要安装 hello 应用程序,请运行 make install 命令。输入
sudo make install
这将把包安装到由之前可能与“configure”脚本一起使用的默认前缀(--prefix)参数指定的 location。如果未设置 --prefix,则将使用默认前缀
/usr/local/
。
运行 hello 程序¶
使用
whereis
命令查看hello
程序在系统中的位置。输入whereis hello
尝试运行
hello
应用程序以查看它的作用。输入hello
使用
--help
选项再次运行hello
,以查看它可以执行的其他操作。现在使用
sudo
,以超级用户身份再次运行hello
。输入sudo hello
输出
sudo: hello: command not found
问题
调查当您尝试使用
sudo
运行hello
时导致错误的原因。解决问题,确保hello
程序可以使用sudo
。提示
最好以普通用户身份测试程序,以确保普通用户确实可以使用该程序。假设您确实希望普通用户能够使用该程序,则二进制文件的权限可能设置不正确,以至于只有超级用户才能使用这些程序。
就这样。本练习已完成!
练习 7¶
检查包安装后的文件完整性¶
在安装相关包后,在某些情况下,我们需要确定相关文件是否已被修改,以防止其他人进行恶意修改。
文件验证¶
使用 rpm
命令的“-V”选项。
以时间同步程序 chrony
为例,来说明其输出的含义。
为了演示
rpm
包验证的工作原理,请对 chrony 的配置文件 -/etc/chrony.conf
进行修改。(假设您已安装 chrony)。在文件末尾添加 2 个无害的注释##
符号。输入echo -e "##" | sudo tee -a /etc/chrony.conf
现在使用
--verify
选项运行rpm
命令。输入rpm -V chrony
输出
S.5....T. c /etc/chrony.conf
输出分为 3 列。
第一列(S.5....T.)
示例输出 -
S.5....T.
表示用于指示有关 RPM 包中文件有效性的有用信息的 9 个字段。通过给定检查/测试的任何字段或特征都用“.”表示。这 9 个不同的字段或检查在此处描述
- S: 文件大小是否已修改。
- M: 文件类型或文件权限(rwx)是否已修改。
- 5: 文件 MD5 校验和是否已修改。
- D: 设备号是否已修改。
- L: 文件路径是否已修改。
- U: 文件的所有者是否已修改。
- G: 文件所属的组是否已修改。
- T: 文件的 mTime(修改时间)是否已修改。
- P: 程序功能是否已修改。
第二列(c)
- c: 表示对配置文件的修改。它也可以是以下值
- d: 文档文件。
- g: 幽灵文件。很少能看到。
- l: 许可证文件。
- r: 自述文件。
第三列(/etc/chrony.conf)
- /etc/chrony.conf: 代表修改后的文件路径。
作者: Wale Soyinka
贡献者: Steven Spencer, tianci li, Ganna Zhyrnova