跳转至内容

实验室 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/

查询软件包以获取信息

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

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

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

  2. 让我们深入了解一下,并详细了解安装在系统上的其中一个软件包。我们将检查 NetworkManager。我们将使用 rpm 命令的 --query (-q) 和 --info (-i) 选项。键入

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

    信息量很大(元数据)!

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

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

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

    字段名称不区分大小写。

  4. 要查看已安装的 NetworkManager 包的 Version 和 Summary 字段,请键入

    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. 让我们查看 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 文件!

  12. 查看与已安装在系统上的另一个包(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

软件包完整性

  1. 有可能下载或最终获得损坏或污染的文件。验证您下载的 wget 软件包的完整性。键入

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

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

  2. 让我们恶意地故意更改下载的软件包。这可以通过向原始软件包添加任何内容或从原始软件包中删除任何内容来完成。任何以原始打包者未预料到的方式更改软件包的操作都将损坏软件包。我们将使用 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 知道什么如何,但没有内置的功能来回答在哪里这个问题。这就是 dnfyum 等工具大放异彩的地方。

安装软件包

在本练习中,您将尝试安装 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. 您现在应该在工作目录中至少有两个 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 -Uvhrpm -ivh 有什么区别?查阅 rpm 的手册页。

练习 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 是管理基于 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 将静默解决任何依赖关系。

  1. 首先,让我们确保 wgetlibmetalink 已从系统中卸载。输入

    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 一起使用以查看系统中可用的 wget 程序版本。输入

    dnf list wget
    
  2. 如果您只想查看是否有可用的更新版本,请使用 dnf 的检查更新选项。例如,对于 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 包都源自源代码。

在本练习中,您将从源文件中下载、编译和安装示例程序。为了方便起见,源文件通常以单个压缩文件形式分发,称为 tar-ball(发音为 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 命令查看您的 pwd 内容。

    在解压缩过程中应该为您创建了一个名为 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 命令以确保您的 pwd 中确实有一个名为configure的文件。

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

    ./configure --help
    

    问题

    从命令的输出中, “--prefix”选项的作用是什么?

  3. 如果您对 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)参数指定的 location。如果未设置 --prefix,则将使用默认前缀 /usr/local/

运行 hello 程序

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

    whereis hello
    
  2. 尝试运行 hello 应用程序以查看它的作用。输入

    hello
    
  3. 使用 --help 选项再次运行 hello,以查看它可以执行的其他操作。

  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. 现在使用 --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