跳至内容

实验室 7:管理和安装软件

目标

完成此实验室后,您将能够

  • 查询软件包信息
  • 从二进制软件包安装软件
  • 解决一些基本的依赖问题
  • 从源代码编译和安装软件

完成此实验室的估计时间:90 分钟

二进制文件和源代码文件

系统上安装的应用程序取决于几个因素。主要因素取决于操作系统安装期间选择的软件包组。另一个因素取决于系统自使用以来所做的操作。

您会发现,作为系统管理员,您的日常任务之一就是软件管理。这通常涉及

  • 安装新软件
  • 卸载软件
  • 更新已安装的软件

在基于 Linux 的系统上安装软件有多种方法。您可以从源代码或预编译的二进制文件安装。后一种方法是最简单的方法,但也是最不可定制的方法。当您从预编译的二进制文件安装时,大部分工作已经为您完成。不过,您确实需要知道您想要的特定软件的名称以及在哪里找到它。

几乎所有的软件最初都以 C 或“C++”编程语言的源代码文件的形式出现。源代码程序通常作为源代码文件的存档分发。通常是 tar、gzip、bzip2 或 xz 压缩的文件。这意味着它们经过压缩或打包成单个捆绑包。

大多数开发人员已使其源代码符合 GNU 标准,从而使共享更加容易。这也意味着这些软件包可以在任何 UNIX 或类 UNIX 系统(例如 Linux)上进行编译。

RPM 是 Rocky Linux、Fedora、Red Hat Enterprise Linux (RHEL)、openSuSE、Mandrake 等基于 Red Hat 的发行版上管理应用程序(软件包)的底层工具。

在 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/

查询软件包信息

  1. 要查看您本地系统上当前安装的所有软件包列表,请键入

    $ rpm -qa
    python3-gobject-base-*
    NetworkManager-*
    rocky-repos-*
    ...<OUTPUT TRUNCATED>...
    

    您应该会看到一个长列表。

  2. 让我们深入了解一下已安装的某个软件包。我们将检查 NetworkManager。我们将使用 `--query` (`-q`) 和 `--info` (`-i`) 选项与 rpm 命令一起使用。键入

    $ rpm -qi NetworkManager
    Name        : NetworkManager
    Epoch       : 1
    ...<OUTPUT TRUNCATED>...
    

    这是大量信息(元数据)!

  3. 假设我们只对上一个命令的 Summary 字段感兴趣。我们可以使用 rpm 的 `--queryformat` 选项来过滤从查询选项返回的信息。

    例如,要仅查看 Summary 字段,请键入

    rpm -q --queryformat '%{summary}\n' NetworkManager
    

    字段名称不区分大小写。

  4. 要查看已安装的 NetworkManager 软件包的版本和摘要字段,请键入

    rpm -q --queryformat '%{version}  %{summary}\n' NetworkManager
    
  5. 键入命令以查看系统中安装的 bash 软件包的信息。

    rpm -qi bash
    

    注意

    之前的练习是查询和处理系统中已安装的软件包。在接下来的练习中,我们将开始处理尚未安装的软件包。我们将使用 DNF 应用程序下载我们在后续步骤中使用的软件包。

  6. 首先,确保 `wget` 应用程序尚未安装在系统上。键入

    rpm -q wget
    package wget is not installed
    

    看起来我们的演示系统上没有安装 `wget`。

  7. 从 Rocky Linux 8.x 开始,`dnf download` 命令允许您获取 `wget` 的最新 `rpm` 软件包。键入

    dnf download wget
    
  8. 使用 `ls` 命令确保软件包已下载到当前目录。键入

    ls -lh wg*
    
  9. 使用 `rpm` 命令查询有关下载的 wget-*.rpm 的信息。键入

    rpm -qip wget-*.rpm
    Name        : wget
    Architecture: x86_64
    Install Date: (not installed)
    Group       : Applications/Internet
    ...<TRUNCATED>...
    

    问题

    从上一步的输出中,`wget` 软件包到底是什么?提示:您可以使用 `rpm` 查询格式选项查看下载软件包的描述字段。

  10. 如果您对 `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
    
  11. 让我们使用 `cat` 命令查看 `wget` 软件包中包含的 `/usr/share/doc/wget/AUTHORS` 文件的内容。键入

    cat /usr/share/doc/wget/AUTHORS
    cat: /usr/share/doc/wget/AUTHORS: No such file or directory
    

    我们的演示系统上还没有安装 `wget`!因此,我们无法查看随它打包的 AUTHORS 文件!

  12. 查看与系统中 *已安装* 的另一个软件包(curl)随附的文件列表。键入

    $ rpm -ql curl
    /usr/bin/curl
    /usr/lib/.build-id
    /usr/lib/.build-id/fc
    ...<>...
    

    注意

    您会注意到,在上一个命令中,您不必引用 `curl` 软件包的完整名称。这是因为 `curl` 已经安装了。

软件包名称的扩展知识

  • 完整软件包名称:当您从可信来源(例如 vendor 网站、开发者存储库)下载软件包时,下载文件的名称就是完整的软件包名称,例如 -- 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
    

    软件包的完整名称遵循类似的命名约定 —— [软件包名称]-[版本]-[发布].[操作系统].[架构].rpm[软件包名称]-[版本]-[发布].[操作系统].[架构].src.rpm

  • 软件包名称:由于 RPM 使用数据库来管理软件,因此在软件包安装完成后,数据库将具有相应的记录。目前,rpm 命令的操作对象只需要输入软件包名称。例如

    rpm -qi bash
    
    rpm -q systemd
    
    rpm -ql chrony
    

练习 2

软件包完整性

  1. 下载的文件可能损坏或被篡改。验证您下载的 `wget` 软件包的完整性。键入

    rpm -K  wget-*.rpm
    wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK
    

    输出中的“digests signatures OK”消息表明软件包没问题。

  2. 让我们做些恶意的事情,故意修改下载的软件包。这可以通过向原始软件包添加任何内容或从中删除任何内容来完成。任何以原始打包者未 intended 的方式更改软件包的操作都会损坏软件包。我们将使用 `echo` 命令将字符串“haha”添加到软件包中来修改文件。键入

    echo haha >> wget-1.19.5-10.el8.x86_64.rpm 
    
  3. 现在再次尝试使用 rpm 的 -K 选项验证软件包的完整性。

    $ rpm -K  wget-*.rpm
    wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK
    

    现在信息非常不同。输出“DIGESTS SIGNATURES NOT OK”清楚地警告您不应尝试使用或安装该软件包。它不应再被信任。

  4. 使用 `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)。

  1. 尝试安装 `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 软件包,但这通常是糟糕的做法。

  2. RPM 已经为我们提供了缺少内容的提示。您会记得 `rpm` 知道是什么和如何做,但不一定知道在哪里。让我们使用 `dnf` 工具来确定提供缺失库的软件包名称。键入

    $ dnf whatprovides libmetalink.so.3
    ...<TRUNCATED>...
    libmetalink-* : Metalink library written in C
    Repo        : baseos
    Matched from:
    Provide    : libmetalink.so.3
    
  3. 从输出中,我们需要下载提供缺失库的 `libmetalink` 软件包。具体来说,我们想要该库的 64 位版本。让我们调用一个单独的实用程序(`dnf`)来帮助我们查找和下载适用于我们演示的 64 位(x86_64)架构的软件包。键入

    dnf download --arch x86_64  libmetalink
    
  4. 现在您的工作目录中应该至少有 2 个 rpm 软件包。使用 `ls` 命令进行确认。

  5. 安装缺失的 `libmetalink` 依赖项。键入

    sudo rpm -ivh libmetalink-*.rpm
    
  6. 现在依赖项已安装,我们可以回顾我们安装 `wget` 软件包的原始目标。键入

    sudo rpm -ivh wget-*.rpm
    

    注意

    RPM 支持事务。在之前的练习中,我们可以执行一个 RPM 事务,该事务包括我们要安装的原始软件包以及它依赖的所有软件包和库。像下面这样的一个命令就足够了

    ```bash
    rpm -Uvh  wget-*.rpm  libmetalink-*.rpm
    ```
    
  7. 现在是见证奇迹的时刻。尝试运行 `wget` 程序而不带任何选项,看看它是否已安装。键入

    wget
    
  8. 让我们看看 `wget` 的实际操作。使用 `wget` 从命令行从互联网下载文件。键入

    wget  https://linuxkernel.org.cn
    

    这将从 kernel.org 网站下载默认的 index.html!

  9. 使用 `rpm` 查看 `wget` 应用程序随附的所有文件列表。

  10. 使用 `rpm` 查看 `wget` 软件包随附的任何文档。

  11. 使用 `rpm` 查看 `wget` 软件包安装的所有二进制文件的列表。

  12. 您需要安装 `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` 的 man 手册。

练习 4

卸载软件包

使用 Red Hat 的包管理器(RPM)卸载软件包非常简单。

在此练习中,您将尝试使用 `rpm` 卸载系统上的某些软件包。

卸载软件包

  1. 从您的系统卸载 `libmetalink` 软件包。键入

    sudo rpm -e libmetalink
    

    问题

    解释为什么您无法删除该软件包?

  2. 使用 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 是管理 Rocky Linux 等基于 RPM 的软件的众多工具之一。与 `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` 将静默地解决任何依赖关系。

  1. 首先,让我们确保 `wget` 和 `libmetalink` 已从系统中卸载。键入

    sudo rpm -e wget libmetalink
    

    卸载后,如果您尝试从 CLI 运行 `wget`,您会看到类似 `wget: command not found` 的消息。

  2. 现在使用 `dnf` 安装 `wget`。键入

    sudo dnf -y install wget
    Dependencies resolved.
    ...<TRUNCATED>...
    Installed:
    libmetalink-*           wget-*
    Complete!
    

    技巧

    在前一个命令中使用的“-y”选项会抑制提示 “[y/N]”以确认 `dnf` 即将执行的操作。这意味着所有确认操作(或交互式响应)都将是“是”(y)。

  3. DNF 提供“环境组”选项,可以轻松地为系统添加新功能集。要添加该功能,通常需要单独安装几个软件包,但使用 `dnf`,您只需要知道所需功能的名称或描述。使用 `dnf` 显示可用组列表。键入

    dnf group list
    
  4. 我们对“开发工具”组/功能感兴趣。让我们获取有关该组的更多信息。键入

    bash dnf group info "Development Tools"

  5. 稍后,我们将需要“开发工具”组中的一些程序。使用 `dnf` 运行以下命令安装“开发工具”组

    sudo dnf -y group install "Development Tools"
    

使用 `dnf` 卸载软件包

  1. 要使用 `dnf` 卸载 `wget` 软件包,请键入

    sudo dnf -y remove wget
    
  2. 使用 `dnf` 确保软件包确实已从系统中删除。键入

    sudo dnf -y remove wget
    
  3. 尝试使用/运行 `wget`。键入

    wget
    

使用 `dnf` 更新软件包

DNF 可以检查并安装存储库中可用的最新版本。它还可以用于安装特定版本的软件包。

  1. 使用 `dnf` 的 list 选项查看系统中 `wget` 程序可用的版本。键入

    dnf list wget
    
  2. 如果您只想查看软件包是否有可用更新,请使用 `dnf` 的 check-update 选项。例如,对于 `wget` 软件包,键入

    dnf check-update wget
    
  3. 现在,列出系统中内核软件包的所有可用版本。键入

    sudo dnf list kernel
    
  4. 接下来,检查已安装的内核软件包是否有任何可用的更新。键入

    dnf check-update kernel
    
  5. 软件包更新可能是由于错误修复、新功能或安全补丁。要查看内核软件包是否有任何安全相关的更新,请键入

    dnf  --security check-update kernel
    

使用 `dnf` 更新系统

DNF 可用于检查和安装系统中所有已安装软件包的最新版本。定期检查和安装更新是系统管理的一个重要方面。

  1. 要检查您当前在系统上安装的所有软件包是否有更新,请键入

    dnf check-update
    
  2. 要检查您系统中所有已安装软件包是否有任何安全相关的更新,请键入

    dnf --security check-update
    
  3. 要将系统中安装的所有软件包更新为您的发行版可用的最新版本,请运行

    dnf -y check-update
    

练习 6

从源代码构建软件

所有软件/应用程序/软件包都源自纯粹的人类可读文本文件。这些文件统称为源代码。Linux 发行版上安装的 RPM 软件包就是从源代码诞生的。

在此练习中,您将从其源代码下载、编译和安装一个示例程序。为了方便起见,源代码通常作为单个压缩文件分发,称为 tarball(发音为 tar-dot-gee-zee)。

以下练习将基于古老的 Hello 项目源代码。`hello` 是一个简单的命令行应用程序,用 C++ 编写,它只会打印“hello”到终端。您可以 在此处 了解有关该项目的更多信息。

下载源代码文件

  1. 使用 `curl` 下载 `hello` 应用程序的最新源代码。让我们将文件下载并保存在 Downloads 文件夹中。

    https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz

解压文件

  1. 切换到您下载 hello 源代码的本地机器上的目录。

  2. 使用 `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>...
    
  3. 使用 `ls` 命令查看您当前工作目录的内容。

    在解压过程中,应该为您创建了一个名为 hello-2.12 的新目录。

  4. 切换到该目录并列出其内容。键入

    cd hello-2.12 ; ls
    
  5. 仔细查看源代码可能附带的任何特殊安装说明始终是很好的做法。这些文件通常具有 INSTALL、README 等名称。

    使用分页器打开 INSTALL 文件并阅读。键入

    less INSTALL
    

    阅读完文件后退出分页器。

配置软件包

大多数应用程序都有用户可以启用或禁用的功能。这是访问源代码并从源代码安装的好处之一。您可以控制应用程序的可配置功能。这与接受包管理器从预编译的二进制文件安装的所有内容形成对比。

通常,允许您配置软件的脚本通常被恰当地命名为“configure”。

技巧

请确保您已安装“开发工具”软件包组,然后再尝试完成以下练习。

sudo dnf -y group install "Development Tools"
  1. 再次使用 `ls` 命令,以确保您的当前工作目录中确实有一个名为 *configure* 的文件。

  2. 要查看 `hello` 程序中所有可启用或禁用的选项,请键入

    ./configure --help
    

    问题

    从命令的输出中,`--prefix` 选项有什么作用?

  3. 如果您对 configure 脚本提供的默认选项满意。键入

    ./configure
    

    注意

    希望 configure 阶段顺利进行,您可以继续进行编译阶段。

    如果在 configure 阶段出现任何错误,您应该仔细查看输出的末尾,找出错误的来源。错误 *有时* 是不言自明的,并且易于修复。例如,您可能会看到类似以下的错误:

    configure: error: no acceptable C compiler found in $PATH

    上面的错误仅表示您系统上未安装 C 编译器(例如 `gcc`),或者编译器已安装在 PATH 变量之外的位置。

编译软件包

您将在以下步骤中构建 hello 应用程序。这时,您之前使用 DNF 安装的开发工具组中的一些程序就派上用场了。

  1. 在运行“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` 应用程序二进制文件。

  2. 再次列出当前工作目录中的文件。您应该会看到一些新创建的文件,包括 `hello` 程序。

安装应用程序

除其他维护任务外,最终安装步骤还涉及将任何应用程序二进制文件和库复制到适当的文件夹。

  1. 要安装 hello 应用程序,请运行 make install 命令。键入

    sudo make install
    

    这将把软件包安装到之前与“configure”脚本一起使用的默认前缀(--prefix)参数指定的目录中。如果没有设置 --prefix,将使用默认前缀 `/usr/local/`。

运行 hello 程序

  1. 使用 `whereis` 命令查看系统中 `hello` 程序的位置。键入

    whereis hello
    
  2. 尝试运行 `hello` 应用程序,看看它有什么作用。键入

    hello
    
  3. 再次运行 `hello`,并带上 `--help` 选项,看看它还能做什么。

  4. 现在使用 `sudo`,以超级用户的身份再次运行 `hello`。键入

    sudo hello
    

    输出

    sudo: hello: command not found
    

    问题

    调查尝试使用 `sudo` 运行 `hello` 时出现的错误原因。修复问题并确保 `hello` 程序可以使用 `sudo`。

    技巧

    将程序作为普通用户进行测试,以确保普通用户确实可以使用该程序,这是个好习惯。二元文件上的权限可能设置不正确,导致只有超级用户才能使用程序。当然,这假设您确实希望普通用户能够使用该程序。

  5. 就是这样。本次练习完成!

练习 7

安装软件包后检查文件完整性

在安装相关软件包后,在某些情况下,我们需要确定相关文件是否已被修改,以防止他人进行恶意修改。

文件验证

使用 `rpm` 命令的 “-V” 选项。

以时间同步程序 `chrony` 为例,来说明其输出的含义。

  1. 为了演示 `rpm` 软件包验证的工作原理,请修改 chrony 的配置文件 - `/etc/chrony.conf`。(假设您已安装 chrony)。在文件末尾添加 2 个无害的注释 `##` 符号。键入

    echo -e "##"  | sudo tee -a /etc/chrony.conf
    
  2. 现在运行 `rpm` 命令并使用 `--verify` 选项。键入

    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:ghost 文件。很少能看到。
      • l:许可证文件。
      • r:readme 文件。
    • 第三列 (/etc/chrony.conf)

      • /etc/chrony.conf:表示已修改文件的路径。

作者:Wale Soyinka

贡献者:Steven Spencer, tianci li, Ganna Zhyrnova