跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 管理指南 / 常用任务 / 使用命令行工具管理软件
适用范围 SUSE Linux Enterprise Server 15 SP5

9 使用命令行工具管理软件

本章描述 Zypper 和 RPM,这是两个用于管理软件的命令行工具。有关此环境中所用术语的定义(例如,repositorypatchupdate),请参见第 8.1 节 “术语定义”

9.1 使用 Zypper

Zypper 是用于安装、更新和去除软件包的命令行软件包管理器。它还可管理储存库。这一点对于完成远程软件管理任务或从外壳脚本管理软件尤其有用。

9.1.1 一般使用

Zypper 的常用语法为:

zypper [--global-options] COMMAND  [--command-options] [arguments]

不需要括在括号中的组件。有关常规选项和所有命令的列表,请参见 zypper help。要获取有关特定命令的帮助,请键入 zypper help COMMAND

Zypper 命令

执行 Zypper 最简单的方式是,键入其名称后跟一个命令。例如,要将所有需要的补丁应用于系统,请使用:

> sudo zypper patch
全局选项

此外,您还可以选择使用一个或多个全局选项,只需在命令前面键入它们即可:

> sudo zypper --non-interactive patch

在上面的示例中,选项 --non-interactive 表示在不询问任何问题的情况下运行命令(自动应用默认答复)。

命令特定的选项

要使用特定于某个命令的选项,请紧接在该命令后面键入这些选项:

> sudo zypper patch --auto-agree-with-licenses

在上面的示例中,--auto-agree-with-licenses 用于将所有需要的补丁应用于系统,不要求您确认任何许可条款,而是自动接受许可条款。

参数

某些命令需要一个或多个参数。例如,使用 install 命令时,需要指定您要安装的一个或多个软件包:

> sudo zypper install mplayer

某些选项还需要单个参数。用以下命令可列出所有已知软件集:

> zypper search -t pattern

您可以组合上述所有软件集。例如,下面的命令将在详细模式下安装 factory 储存库中的 mcvim 软件包:

> sudo zypper -v install --from factory mc vim

--from 选项可在从指定储存库请求软件包时,使所有储存库都处于启用状态(以解决任何依赖性问题)。--repo--from 的别名,您可以使用两者中的任何一个。

多数 Zypper 命令都有 dry-run 选项,它模拟给定的命令。它可用于测试。

> sudo zypper remove --dry-run MozillaFirefox

Zypper 支持 --userdata STRING 全局选项。您可以使用此选项指定一个将会写入 Zypper 的日志文件和插件(例如 Btrfs 插件)的字符串。它可以用于标记和标识日志文件中的事务。

> sudo zypper --userdata STRING patch

9.1.2 使用 Zypper 子命令

Zypper 子命令是存储在 zypper_execdir 配置选项所指定的目录中的可执行文件。默认目录为 /usr/lib/zypper/commands。如果在该位置找不到某个子命令,Zypper 会自动在其余 $PATH 位置搜索该子命令。这样,您便可以创建自己的本地扩展并将其存储在用户空间中。

不支持在 Zypper 外壳中执行子命令和使用全局 Zypper 选项。

列出可用的子命令:

> zypper help subcommand
[...]
Available zypper subcommands in '/usr/lib/zypper/commands'

  appstream-cache
  lifecycle
  migration
  search-packages

Zypper subcommands available from elsewhere on your $PATH

  log                   Zypper logfile reader
                            (/usr/sbin/zypper-log)

查看子命令的帮助屏幕:

> zypper help appstream-cache

9.1.3 使用 Zypper 安装和去除软件

要安装或去除软件包,请使用以下命令:

> sudo zypper install PACKAGE_NAME
> sudo zypper remove PACKAGE_NAME
警告
警告:不要去除必需的系统软件包

不要去除必需的系统软件包,例如 glibczypperkernel。如果去除这些包,系统可能会变得不稳定,或完全停止工作。

9.1.3.1 选择要安装或去除的软件包

使用 zypper installzypper remove 命令时,可以通过多种方法来找到软件包。

按确切的软件包名称
> sudo zypper install MozillaFirefox
按确切的软件包名称和版本号
> sudo zypper install MozillaFirefox-52.2
按储存库别名和软件包名称
> sudo zypper install mozilla:MozillaFirefox

其中 mozilla 是用于安装的储存库别名。

按使用通配符的软件包名称

您可以选择名称以特定字符串开头或结尾的所有软件包。使用通配符要小心,特别是去除软件包的时候。以下命令将安装名称以Moz开头的所有软件包:

> sudo zypper install 'Moz*'
提示
提示:去除所有 -debuginfo 软件包

在调试问题时,您有时需要临时安装大量的 -debuginfo 软件包,以获取有关正在运行的进程的详细信息。在调试会话完成后,如果您需要清理环境,请运行以下命令:

> sudo zypper remove '*-debuginfo'
按功能

例如,要安装不知道名称的软件包,这些功能就很有用。下面的命令将安装软件包 MozillaFirefox:

> sudo zypper install firefox
按功能、硬件体系结构或版本

可以结合功能指定硬件体系结构和版本:

  • 所需硬件体系结构的名称需要追加在功能的后面,两者以句点分隔。例如,要指定 AMD/Intel 64 体系结构(在 Zypper 中命名为 x86_64_64),请使用:

    > sudo zypper install 'firefox.x86_64'
  • 版本必须追加到字符串的末尾,并且前面必须带有一个运算符:<(小于)、<=(小于等于)、=(等于)、>=(大于等于)或 >(大于)。

    > sudo zypper install 'firefox>=74.2'
  • 还可以指定硬件体系结构与版本组合要求:

    > sudo zypper install 'firefox.x86_64>=74.2'
按 RPM 文件的路径

您还可以指定软件包的本地或远程路径:

> sudo zypper install /tmp/install/MozillaFirefox.rpm
> sudo zypper install http://download.example.com/MozillaFirefox.rpm

9.1.3.2 同时安装和去除软件包

要同时安装和去除软件包,请使用 +/- 修饰符。要安装 emacs 并同时去除 vim,请使用:

> sudo zypper install emacs -vim

要去除 emacs 并同时安装 vim,请使用:

> sudo zypper remove emacs +vim

为避免以 - 开头的软件包名称被解释为命令行选项,应始终将此类名称用作第二个参数。如果做不到这一点,请在名称前面加上 --

> sudo zypper install -emacs +vim       # Wrong
> sudo zypper install vim -emacs        # Correct
> sudo zypper install -- -emacs +vim    # Correct
> sudo zypper remove emacs +vim         # Correct

9.1.3.3 清理已去除软件包的依赖项

如果想让系统在去除指定的软件包后自动去除不再需要的所有软件包,请使用 --clean-deps 选项:

> sudo zypper rm --clean-deps PACKAGE_NAME

9.1.3.4 在脚本中使用 Zypper

默认情况下,在安装或删除选定软件包之前或发生问题时,Zypper 会要求确认。您可以使用 --non-interactive 选项覆盖此行为。必须在实际命令(installremovepatch)的前面指定此选项,如下所示:

> sudo zypper --non-interactive install PACKAGE_NAME

该选项允许在脚本和 cron 任务中使用 Zypper。

9.1.3.5 安装或下载源软件包

要安装某个软件包的对应源软件包,请使用:

> zypper source-install PACKAGE_NAME

root 身份执行时,源软件包的默认安装位置为 /usr/src/packages/;以用户身份运行时,则为 ~/rpmbuild。可以在本地 rpm 配置中更改这些值。

使用此命令还会安装指定软件包的版本依赖项。如果不想执行此操作,请添加开关 -D

> sudo zypper source-install -D PACKAGE_NAME

要只安装版本依赖项,请使用 -d

> sudo zypper source-install -d PACKAGE_NAME

当然,只有当储存库列表中启用了含有源软件包的储存库时,才能这样做(默认添加但不启用它)。请参见第 9.1.6 节 “使用 Zypper 管理储存库” 了解有关储存库管理的细节。

可使用以下方法来获取储存库中所有源软件包的列表:

> zypper search -t srcpackage

您也可以将所有已安装软件包的源软件包下载到本地目录。要下载源软件包,请使用:

> zypper source-download

默认的下载目录是 /var/cache/zypper/source-download。您可以使用 --directory 选项更改下载目录。若只想显示缺失或多余的软件包,而不下载或删除任何内容,请使用 --status 选项。要删除多余的源软件包,请使用 --delete 选项。要禁止删除,请使用 --no-delete 选项。

9.1.3.6 从禁用的储存库安装软件包

通常,您只能安装或刷新来自启用的储存库的软件包。--plus-content TAG 选项可帮助您指定要刷新的、要在当前 Zypper 会话期间暂时启用的,以及要在会话完成后禁用的储存库。

例如,要启用可以提供其他 -debuginfo-debugsource 软件包的储存库,请使用 --plus-content debug。可以多次指定此选项。

要暂时启用此类“调试”储存库以安装特定的 -debuginfo 软件包,请按如下所示使用该选项:

> sudo zypper --plus-content debug \
   install "debuginfo(build-id)=eb844a5c20c70a59fc693cd1061f851fb7d046f4"

对于缺少的 debuginfo 软件包,gdb 将会报告 build-id 字符串。

注意
注意:已禁用安装媒体

仍会配置 SUSE Linux Enterprise Server 安装媒体中的储存库,但成功安装后会禁用这些储存库。您可以使用 --plus-content 选项从安装媒体而不是联机储存库安装软件包。在调用 zypper 之前,请确保该媒体可用,例如,将 DVD 插入计算机的光驱中。

9.1.3.7 实用程序

要校验所有依赖项是否仍然满足,并修复缺少的依赖项,请使用:

> zypper verify

除了依赖项必须满足外,某些软件包还推荐其他软件包。只有在实际可用并可安装时才会安装这些推荐软件包。如果推荐的软件包在推荐它们的软件包已安装(通过添加其他软件包或硬件)之后才可用,请使用以下命令:

> sudo zypper install-new-recommends

此命令在插入网络摄像头或 Wi-Fi 设备后非常有用。如果可用,它将安装设备驱动程序和相关软件。只有在满足特定硬件依赖项后,才可安装驱动程序和相关软件。

9.1.4 使用 Zypper 更新软件

用 Zypper 更新软件有三种方式:安装软件包、安装软件包的新版本或更新整个分发包。最后一种方式可通过 zypper dist-upgrade 来实现。中介绍了如何升级 SUSE Linux Enterprise Server第 2 章 “升级路径和方法

9.1.4.1 安装全部所需的补丁

要安装已安装软件包的新版本,最可靠的方式是修补 SUSE Linux Enterprise。这种方式可保证安装版本正确的所有必需软件包,并确保忽略被视为冲突的软件包版本。

要安装所有适用于您系统的正式发布的补丁,请运行:

> sudo zypper patch

系统将会检查您计算机上配置的储存库中提供的所有补丁是否与您的安装相关。如果相关(未分为 optionalfeature 类别),则会立即安装这些补丁。如果 zypper patch 成功,便可确保不会安装带漏洞版本的软件包,除非您确认该例外。请注意,正式的更新储存库仅在注册 SUSE Linux Enterprise Server 安装后才可用。

如果即将安装的补丁所包含的更改要求重引导系统,您会在重引导前收到警告。

单纯使用 zypper patch 命令不会应用来自第三方储存库的软件包。要同时更新第三方储存库,请使用 with-update 命令选项,如下所示:

> sudo zypper patch --with-update

要额外安装可选补丁,请使用:

> sudo zypper patch --with-optional

要安装与特定 Bugzilla 问题相关的所有补丁,请使用:

> sudo zypper patch --bugzilla=NUMBER

要安装与特定 CVE 数据库项相关的所有补丁,请使用:

> sudo zypper patch --cve=NUMBER

例如,要安装 CVE 编号为 CVE-2010-2713 的安全补丁,请执行:

> sudo zypper patch --cve=CVE-2010-2713

如果只想安装影响 Zypper 和软件包管理本身的补丁,请使用:

> sudo zypper patch --updatestack-only

请记住,如果您使用了 updatestack-only 命令选项,将会丢弃原本还会更新其他储存库的其他命令选项。

9.1.4.2 列出补丁

为了让您确定补丁是否可用,Zypper 允许您查看以下信息:

所需补丁的数目

要列出所需补丁(适用于您的系统但尚未安装的补丁)的数目,请使用 patch-check

> zypper patch-check
Loading repository data...
Reading installed packages...
5 patches needed (1 security patch)

可以结合 --updatestack-only 选项使用此命令,以便仅列出影响 Zypper 和软件包管理本身的补丁。

所需补丁的列表

要列出全部所需的补丁(适用于您的系统但尚未安装的补丁),请使用 zypper list-patches

所有补丁的列表

要列出 SUSE Linux Enterprise Server 可用的所有补丁,而不管它们是否已安装或适用于您的安装,请使用 zypper patches

还可以列出并安装与特定问题相关的补丁。要列出特定的补丁,请使用带以下选项的 zypper list-patches 命令:

按 Bugzilla 问题

要列出与 Bugzilla 问题相关的全部所需补丁,请使用 --bugzilla 选项。

要列出针对特定 Bug 的补丁,您也可以指定 Bug 编号:--bugzilla=NUMBER。要搜索与多个 Bugzilla 问题相关的补丁,请在 bug 编号之间添加逗号,例如:

> zypper list-patches --bugzilla=972197,956917
按 CVE 编号

要列出与 CVE(公共漏洞和披露)数据库中某一项相关的全部所需补丁,请使用 --cve 选项。

要列出针对特定 CVE 数据库项的补丁,您也可以指定 CVE 编号:--cve=NUMBER。要搜索与多个 CVE 数据库项相关的补丁,请在 CVE 编号之间添加逗号,例如:

> zypper list-patches --cve=CVE-2016-2315,CVE-2016-2324
列出已撤回的补丁

在 SUSE Linux Enterprise 15 代码流中,一些补丁可自动撤回。维护更新会经过仔细测试,因为更新有可能包含新的 Bug。如果发现某个补丁包含 Bug,将会发布一个新的更新(版本号更高)以还原有 Bug 的更新,并会阻止再次安装有 Bug 的更新。您可以使用 zypper 列出已撤回的补丁:

> zypper lp --all |grep retracted
SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-1965 
 | recommended | important | ---    | retracted  | Recommended update for multipath-tools 
SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-2689 
 | security    | important | ---    | retracted  | Security update for cpio
SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-3655 
 | security    | important | reboot | retracted  | Security update for the Linux Kernel

查看有关已撤回(或任何)补丁的完整信息:

> zypper patch-info SUSE-SLE-Product-SLES-15-2021-2689
Loading repository data...
Reading installed packages...

Information for patch SUSE-SLE-Product-SLES-15-2021-2689:
---------------------------------------------------------
Repository  : SLE-Product-SLES15-LTSS-Updates
Name        : SUSE-SLE-Product-SLES-15-2021-2689
Version     : 1
Arch        : noarch
Vendor      : maint-coord@suse.de
Status      : retracted
Category    : security
Severity    : important
Created On  : Mon 16 Aug 2021 03:44:00 AM PDT
Interactive : ---
Summary     : Security update for cpio
Description : 
    This update for cpio fixes the following issues:

    It was possible to trigger Remote code execution due to a integer overflow 
    (CVE-2021-38185, bsc#1189206)

    UPDATE:
    This update was buggy and could lead to hangs, so it has been retracted. 
    There will be a follow up update.
    [...]
具有冲突软件包的补丁
Information for patch openSUSE-SLE-15.3-2022-333:
-------------------------------------------------
Repository  : Update repository with updates from SUSE Linux Enterprise 15
Name        : openSUSE-SLE-15.3-2022-333
Version     : 1
Arch        : noarch
Vendor      : maint-coord@suse.de
Status      : needed
Category    : security
Severity    : important
Created On  : Fri Feb  4 09:30:32 2022
Interactive : reboot
Summary     : Security update for xen
Description :
    This update for xen fixes the following issues:

    - CVE-2022-23033: Fixed guest_physmap_remove_page not removing the p2m mappings. (XSA-393) (bsc#1194576)
    - CVE-2022-23034: Fixed possible DoS by a PV guest Xen while unmapping a grant. (XSA-394) (bsc#1194581)
    - CVE-2022-23035: Fixed insufficient cleanup of passed-through device IRQs. (XSA-395) (bsc#1194588)
Provides    : patch:openSUSE-SLE-15.3-2022-333 = 1
Conflicts   : [22]
    xen.src < 4.14.3_06-150300.3.18.2
    xen.noarch < 4.14.3_06-150300.3.18.2
    xen.x86_64 < 4.14.3_06-150300.3.18.2
    xen-devel.x86_64 < 4.14.3_06-150300.3.18.2
    xen-devel.noarch < 4.14.3_06-150300.3.18.2
[...]

上面的补丁与 22 个软件包的受影响或带漏洞版本冲突。如果安装了这些受影响或带漏洞软件包中的任何一个,将会触发冲突,并且补丁会划分为需要类别。zypper patch 会尝试安装所有可用的补丁。如果遇到问题,它会报告这些问题,以告知您并非所有更新都已安装。可以通过更新受影响或带漏洞软件包或者去除这些软件包来解决冲突。由于 SUSE 更新储存库也提供固定的软件包,因此更新是解决冲突的标准方法。例如,如果由于依赖关系问题或软件包锁定而无法更新软件包,则会在用户批准后将其删除。

要列出所有补丁而不考虑是否需要安装它们,另外还需使用 --all 选项。例如,要列出指派有 CVE 编号的所有补丁,请使用:

> zypper list-patches --all --cve
Issue | No.           | Patch             | Category    | Severity  | Status
------+---------------+-------------------+-------------+-----------+----------
cve   | CVE-2019-0287 | SUSE-SLE-Module.. | recommended | moderate  | needed
cve   | CVE-2019-3566 | SUSE-SLE-SERVER.. | recommended | moderate  | not needed
[...]

9.1.4.3 安装新的软件包版本

如果某个安装源只包含新软件包,但未提供补丁,则 zypper patch 不会产生任何作用。要将所有已安装的软件包更新为较新的可用版本,请使用以下命令:

> sudo zypper update
重要
重要

zypper update 会忽略有问题的软件包。例如,如果某个软件包被锁定,即使该软件包有更高的版本可用,zypper update 也会忽略该软件包。相反,如果软件包被视为带漏洞,zypper patch 会报告冲突。

要更新个别软件包,请用更新或安装命令指定软件包:

> sudo zypper update PACKAGE_NAME
> sudo zypper install PACKAGE_NAME

可使用此命令来获取所有新的可安装软件包的列表:

> zypper list-updates

请注意,此命令只会列出符合以下准则的软件包:

  • 与已安装的软件包拥有相同的供应商,

  • 由至少与已安装软件包拥有相同优先级的储存库提供,

  • 可安装(满足所有依赖项)。

所有新的可用软件包(无论是否可安装)的列表可通过以下方式获取:

> sudo zypper list-updates --all

要确定无法安装新软件包的原因,请使用上面所述的 zypper installzypper update 命令。

9.1.4.4 识别孤立的软件包

每当您从 Zypper 中去除某个储存库或者升级系统时,某些软件包可能会进入孤立状态。这些孤立的软件包不再属于任何活动储存库。以下命令可以列出这些软件包:

> sudo zypper packages --orphaned

借助此列表,您可以确定是否仍然需要某个软件包,或者是否可以安全去除某个软件包。

9.1.5 识别使用已删除文件的进程和服务

在修补、更新或去除软件包时,系统上可能有一些正在运行的进程仍在使用已被更新或去除操作删除的文件。运行 zypper ps 可以列出使用已删除文件的进程。如果此类进程属于某个已知的服务,则会列出服务名称,方便您重启动该服务。默认情况下,zypper ps 会显示一个表:

> zypper ps
PID   | PPID | UID | User  | Command      | Service      | Files
------+------+-----+-------+--------------+--------------+-------------------
814   | 1    | 481 | avahi | avahi-daemon | avahi-daemon | /lib64/ld-2.19.s->
      |      |     |       |              |              | /lib64/libdl-2.1->
      |      |     |       |              |              | /lib64/libpthrea->
      |      |     |       |              |              | /lib64/libc-2.19->
[...]
PID:进程 ID
PPID:父进程 ID
UID:运行进程的用户的 ID
登录:运行进程的用户的登录名
命令:用于执行进程的命令
服务:服务名称(仅当命令与系统服务关联时)
文件:已删除文件的列表

通过如下方式可控制 zypper ps 的输出格式:

zypper ps-s

创建一份简短表格,其中不会显示已删除的文件。

> zypper ps -s
PID   | PPID | UID  | User    | Command      | Service
------+------+------+---------+--------------+--------------
814   | 1    | 481  | avahi   | avahi-daemon | avahi-daemon
817   | 1    | 0    | root    | irqbalance   | irqbalance
1567  | 1    | 0    | root    | sshd         | sshd
1761  | 1    | 0    | root    | master       | postfix
1764  | 1761 | 51   | postfix | pickup       | postfix
1765  | 1761 | 51   | postfix | qmgr         | postfix
2031  | 2027 | 1000 | tux     | bash         |
zypper ps-ss

仅显示与系统服务关联的进程。

PID   | PPID | UID  | User    | Command      | Service
------+------+------+---------+--------------+--------------
814   | 1    | 481  | avahi   | avahi-daemon | avahi-daemon
817   | 1    | 0    | root    | irqbalance   | irqbalance
1567  | 1    | 0    | root    | sshd         | sshd
1761  | 1    | 0    | root    | master       | postfix
1764  | 1761 | 51   | postfix | pickup       | postfix
1765  | 1761 | 51   | postfix | qmgr         | postfix
zypper ps-sss

仅显示使用已删除文件的系统服务。

avahi-daemon
irqbalance
postfix
sshd
zypper ps--print "systemctl status %s"

显示用于检索可能需要重启动的服务状态信息的命令。

systemctl status avahi-daemon
systemctl status irqbalance
systemctl status postfix
systemctl status sshd

有关服务处理的详细信息,请参见第 19 章 “systemd 守护程序

9.1.6 使用 Zypper 管理储存库

Zypper 的所有安装或补丁命令均基于已知储存库列表。要列出系统已知的所有储存库,请使用命令:

> zypper repos

结果将类似于与以下输出:

例 9.1︰ Zypper — 已知储存库的列表
> zypper repos
# | Alias        | Name          | Enabled | Refresh
--+--------------+---------------+---------+--------
1 | SLEHA-15-GEO | SLEHA-15-GEO  | Yes     | No
2 | SLEHA-15     | SLEHA-15      | Yes     | No
3 | SLES15       | SLES15        | Yes     | No

当在各个命令中指定储存库时,可以使用别名、URI 或 zypper repos 命令输出中的储存库编号。储存库别名是用于储存库处理命令中的储存库名称的简短版本。请注意,在修改储存库列表后,储存库编号可能会更改。别名本身不会更改。

默认情况下不显示储存库的 URI 或优先级之类的细节。用以下命令可以列出所有细节:

> zypper repos -d

9.1.6.1 添加储存库

要添加储存库,请运行

> sudo zypper addrepo URI ALIAS

URI 可以是互联网储存库、网络资源、目录、CD 或 DVD(有关细节请参见 https://en.opensuse.org/openSUSE:Libzypp_URIs)。ALIAS 是储存库的唯一简写标识符。您可以随意选择别名,前提是它必须唯一。如果指定的别名已在使用,Zypper 将发出警告。

9.1.6.2 刷新储存库

zypper 可让您从配置的储存库中提取软件包的更改。要提取更改,请运行:

> sudo zypper refresh
注意
注意:zypper 的默认行为

有些命令默认会自动执行 refresh,因此您不需要明确运行该命令。

refresh 命令与 --plus-content 选项搭配使用时,还可查看已禁用储存库中的更改:

> sudo zypper --plus-content refresh

该选项虽然会提取储存库中的更改,但会使禁用储存库的状态保持不变,即仍为禁用。

9.1.6.3 去除储存库

要从列表中去除某个储存库,请将命令 zypper removerepo 与要删除的储存库的别名或编号结合使用。例如,要从例 9.1 “Zypper — 已知储存库的列表”中去除储存库 SLEHA-12-GEO,请使用下列命令之一:

> sudo zypper removerepo 1
> sudo zypper removerepo "SLEHA-12-GEO"

9.1.6.4 修改储存库

使用 zypper modifyrepo 可以启用或禁用储存库。您还可以用该命令更改储存库的属性(例如刷新行为、名称或优先级)。以下命令将会启用名为 updates 的储存库、打开自动刷新并将其优先级设置为 20:

> sudo zypper modifyrepo -er -p 20 'updates'

修改储存库并不局限于单个储存库 — 您也可以对组执行该操作:

-a:所有储存库
-l:本地储存库
-t:远程储存库
-m TYPE:特定类型的储存库(其中 TYPE 可以是以下之一:httphttpsftpcddvddirfilecifssmbnfshdiso

要重命名储存库别名,请使用 renamerepo 命令。以下示例将别名从 Mozilla Firefox 更改为 firefox

> sudo zypper renamerepo 'Mozilla Firefox' firefox

9.1.7 使用 Zypper 查询储存库和软件包

Zypper 提供各种查询储存库或软件包的方式。要获取所有可用的产品、软件集、软件包或补丁的列表,请使用以下命令:

> zypper products
> zypper patterns
> zypper packages
> zypper patches

要查询特定软件包的所有储存库,请使用 search。要获得有关特定软件包的信息,请使用 info 命令。

9.1.7.2 在所有 SLE 模块中搜索软件包

要搜索当前已启用的 SLE 模块内部和外部的软件包,请使用 search-packages 子命令。此命令会联系 SUSE Customer Center,并在所有模块中搜索匹配的软件包,例如:

> zypper search-packages package1 package2

zypper search-packages 提供以下选项:

  • 搜索与您的搜索字符串完全匹配的软件包:-x--match-exact

  • 按模块对结果进行分组(默认:按软件包分组):-g, --group-by-module

  • 显示有关软件包的更多详细信息:-d--details

  • 以 XML 格式输出搜索结果:--xmlout

9.1.7.3 搜索特定功能

要搜索提供特殊功能的软件包,请使用命令 what-provides。例如,如果您想知道哪个软件包提供 Perl 模块 SVN::Core,请使用以下命令:

> zypper what-provides 'perl(SVN::Core)'

what-provides PACKAGE_NAMErpm -q --whatprovides PACKAGE_NAME 类似,不过 RPM 只能查询 RPM 数据库(即所有已安装的包的数据库)。另一方面,Zypper 将告诉您任意储存库的功能的提供商,而非仅已安装的储存库功能的提供商。

9.1.7.4 显示软件包信息

要查询个别软件包,请使用 info 命令,并用完整软件包名称作为参数。这会显示有关某个软件包的详细信息。如果软件包名与储存库中的所有软件包名都不匹配,该命令会输出非软件包匹配项的详细信息。如果您请求特定类型(通过使用 -t 选项),但该类型不存在,该命令会输出其他可用的匹配项,但不提供详细信息。

如果您指定源软件包,该命令会显示基于该源软件包构建的二进制软件包。如果您指定二进制软件包,该命令会输出用来构建该二进制软件包的源软件包。

如果还想显示该软件包所需/推荐的软件包,则使用选项 --requires--recommends

> zypper info --requires MozillaFirefox

9.1.8 显示生命周期信息

SUSE 产品的支持周期一般为 10 年。通常,您可以使用 SUSE 的延长支持产品将标准生命周期延长三年。根据您的产品,在 https://www.suse.com/lifecycle 中找到具体的支持生命周期。

要检查您的产品和所支持软件包的生命周期,请如下所示使用 zypper lifecycle 命令:

# zypper lifecycle
    Product end of support
Codestream: SUSE Linux Enterprise Server 15             2028-07-31
    Product: SUSE Linux Enterprise Server 15 SP3        n/a*

Module end of support
Basesystem Module                                       n/a*
Desktop Applications Module                             n/a*
Server Applications Module                              n/a*

Package end of support if different from product:
autofs                                   Now, installed 5.1.3-7.3.1, update available 5.1.3-7.6.1

9.1.9 配置 Zypper

Zypper 现在随附配置文件,允许您永久更改 Zypper 的行为(系统范围或用户特定)。要进行系统范围更改,请编辑 /etc/zypp/zypper.conf。要进行用户相关的更改,请编辑 ~/.zypper.conf。如果 ~/.zypper.conf 尚不存在,您可以使用 /etc/zypp/zypper.conf 作为模板:将其复制到 ~/.zypper.conf 并根据您的喜好进行调整。请参见文件中的注释,获取有关可用选项的帮助。

9.1.10 查错

如果您在访问配置的储存库中的软件包时遇到问题(例如,尽管您知道某个软件包在某个储存库中,但 Zypper 找不到该软件包),刷新储存库或许可以解决问题:

> sudo zypper refresh

如果不起作用,则尝试

> sudo zypper refresh -fdb

这会强制完全刷新和重构建数据库,包括强制下载原始元数据。

9.1.11 Btrfs 文件系统上的 Zypper 回滚功能

如果根分区上使用的是 Btrfs 文件系统,且系统中安装了 snapper,当 Zypper 提交对文件系统所做的更改以创建相应的文件系统快照时,会自动调用 snapper。这些快照可用于还原 Zypper 进行的任何更改。有关更多信息,请参见第 10 章 “通过 Snapper 进行系统恢复和快照管理

9.1.12 更多信息

有关从命令行管理软件的详细信息,请输入 zypper helpzypper help  COMMAND,或参见 zypper(8) 手册页。有关详尽的命令参考、最重要的命令的 cheat sheets,以及如何在脚本和应用程序中使用 Zypper 的信息,请参见 https://en.opensuse.org/SDB:Zypper_usage。最新 SUSE Linux Enterprise Server 版本的软件更改列表可在 https://en.opensuse.org/openSUSE:Zypper_versions 中找到。

9.2 RPM - 软件包管理器

RPM(RPM 程序包管理器)用于管理软件包。主要命令为 rpmrpmbuild。用户、系统管理员和软件包构建人员可以查询强大的 RPM 数据库以获得有关已安装软件的详细信息。

rpm 有五种模式:安装、卸装(或更新)软件包、重构建 RPM 数据库、查询 RPM 库或独立 RPM 存档、对软件包执行完整性检查以及对软件包签名。rpmbuild 可用于从原始源构建可安装的软件包。

用特殊的二进制格式对可安装 RPM 存档进行打包。这些存档由要安装的程序文件和某些元信息组成,这些元信息供 rpm 在安装过程中配置软件包使用或者存储在 RPM 数据库中进行存档。RPM 存档的扩展名通常为 .rpm

提示
提示:软件开发包

对于数个软件包,软件开发所需的组件(库、标题、包含文件等)已分别封装在不同的软件包中。只有当您要自己编译软件时才需要这些开发包(例如最新的 GNOME 软件包)。通过扩展名 -devel 即可识别这些开发包,例如软件包 alsa-develgimp-devel

9.2.1 校验软件包真实性

RPM 软件包具有 GPG 签名。要校验 RPM 软件包的签名,请使用 rpm --checksig  PACKAGE-1.2.3.rpm 命令确定该软件包是来自 SUSE 还是另一个可信机构。特别建议对来自互联网的更新软件包使用此命令。

修复操作系统中的问题时,您可能需要将问题临时修复 (PTF) 安装到生产系统中。SUSE 提供的软件包已使用特殊的 PTF 密钥签名。但是,与 SUSE Linux Enterprise 11 不同,SUSE Linux Enterprise 12 系统上默认不会导入此密钥。要手动导入该密钥,请使用以下命令:

> sudo rpm --import \
/usr/share/doc/packages/suse-build-key/suse_ptf_key.asc

导入该密钥后,您可以在系统上安装 PTF 软件包。

9.2.2 管理软件包:安装、更新和卸装

通常,安装 RPM 存档的过程非常简单,只需使用 rpm -i PACKAGE.rpm。使用此命令可以安装软件包,但前提是满足其依赖项并且不与其他软件包冲突。如果出现错误消息,rpm 将请求那些需要安装的软件包以满足依赖项要求。在后台,RPM 数据库确保不出现冲突 - 一个特定文件只能属于一个软件包。通过选择不同的选项,您可以强制 rpm 忽略这些默认设置,但这只供专家用户使用。否则,将影响系统的完整性并可能使系统无法更新。

选项 -U--upgrade 以及 -F--freshen 可用于更新软件包(例如,rpm -F PACKAGE.rpm)。此命令将删除旧版本的文件并立即安装新文件。两个版本之间的差别是:-U 安装系统中以前不存在的软件包,而 -F 只更新以前安装的软件包。更新时,rpm 使用以下策略小心更新配置文件:

  • 如果配置文件未被系统管理员更改,则 rpm 将安装适当文件的新版本。系统管理员无需执行任何操作。

  • 如果更新前系统管理员曾更改过配置文件,则 rpm 会将更改的文件另存为扩展名为 .rpmorig.rpmsave的文件(备份文件),并安装新软件包中的版本。仅当原先安装的文件和较新的版本不同时,才执行此操作。如果是这种情况,则将备份文件(.rpmorig.rpmsave)与新安装的文件进行比较,然后在新文件中再次进行更改。之后,请删除所有 .rpmorig.rpmsave 文件,以免日后的更新出现问题。

  • 如果配置文件已存在并且 .spec 文件中指定了 noreplace 标签,便会出现 .rpmnew 文件。

更新后,在对 .rpmsave.rpmnew 文件进行比较后应将它们删除,以防其阻碍日后的更新。如果 RPM 数据库以前未能识别文件,则会为其指派扩展名 .rpmorig

否则,将使用 .rpmsave。换句话说,.rpmorig 是从异系统格式更新为 RPM 的结果。.rpmsave而 . 是从旧版 RPM 更新到新版 RPM 产生。.rpmnew 不提供任何有关系统管理员是否对配置文件进行过任何更改的信息。/var/adm/rpmconfigcheck 中提供了这些文件的列表。更新时不会覆盖某些配置文件(如 /etc/httpd/httpd.conf),以便系统能够持续运行。

-U 开关的作用并完全等同于使用 -e 选项进行卸装,以及使用 -i 选项进行安装,它还有其他作用。只要可能,就应使用 -U

要去除软件包,请输入 rpm -e PACKAGE。仅当不存在未解决的依赖项问题时,此命令才会删除软件包。例如,只要有其他程序需要 Tcl/Tk,理论上就不能删除它。即使是在这种情况下,RPM 也会向数据库寻求帮助。如果出于某种原因无法执行此类删除操作(即使存在其他依赖性问题),或许可以使用选项 --rebuilddb 来重构建 RPM 数据库。

9.2.3 增量 RPM 软件包

增量 RPM 软件包包含旧版本和新版本的 RPM 软件包之间的差别。在旧 RPM 上应用增量 RPM 将得到全新的 RPM。不需要旧 RPM 的副本,因为增量 RPM 也可以与已安装的 RPM 一起工作。增量 RPM 软件包的大小甚至比补丁 RPM 小,这有利于通过互联网传送更新软件包。缺点是,涉及增量 RPM 的更新操作与使用纯粹 RPM 或补丁 RPM 进行更新的情况相比,占用的 CPU 周期要长得多。

makedeltarpmapplydelta 二进制文件是增量 RPM 套件(软件包 deltarpm)的一部分,可帮助您创建和应用增量 RPM 软件包。使用以下命令可以创建名为 new.delta.rpm 的增量 RPM。以下命令假设 old.rpmnew.rpm 都存在:

> sudo makedeltarpm old.rpm new.rpm new.delta.rpm

如果旧软件包已经安装,则使用 applydeltarpm 可以从文件系统重新构建新的 RPM:

> sudo applydeltarpm new.delta.rpm new.rpm

要从旧 RPM 产生新 RPM 而不访问文件系统,请使用 -r 选项:

> sudo applydeltarpm -r old.rpm new.delta.rpm new.rpm

有关技术细节,请参见 /usr/share/doc/packages/deltarpm/README

9.2.4 RPM查询

-q 选项的 rpm 会启动查询,如此用户便可检查 RPM 存档(通过添加选项 -p)并查询已安装软件包的 RPM 数据库。可以使用多个开关指定所需信息的类型。请参见表 9.1 “基本 RPM 查询选项”

表 9.1︰ 基本 RPM 查询选项

-i

软件包信息

-l

文件列表

-f FILE

查询包含文件 FILE 的软件包(必须使用 FILE 指定完整路径)

-s

包含状态信息的文件列表(隐含 -l

-d

仅列出文档文件(隐含 -l

-c

仅列出配置文件(隐含 -l

--dump

包含完整详细信息的文件列表(与 -l-c-d 结合使用)

--provides

列出另一个软件包可通过 --requires 请求的该软件包的功能

--requires-R

软件包需要的功能

--scripts

安装脚本(预安装、后安装、卸载)

例如,命令 rpm -q -i wget 可显示例 9.2 “rpm -q -i wget 中所示的信息。

例 9.2︰ rpm -q -i wget
Name        : wget
Version     : 1.14
Release     : 17.1
Architecture: x86_64
Install Date: Mon 30 Jan 2017 14:01:29 CET
Group       : Productivity/Networking/Web/Utilities
Size        : 2046483
License     : GPL-3.0+
Signature   : RSA/SHA256, Thu 08 Dec 2016 07:48:44 CET, Key ID 70af9e8139db7c82
Source RPM  : wget-1.14-17.1.src.rpm
Build Date  : Thu 08 Dec 2016 07:48:34 CET
Build Host  : sheep09
Relocations : (not relocatable)
Packager    : https://www.suse.com/
Vendor      : SUSE LLC <https://www.suse.com/>
URL         : http://www.gnu.org/software/wget/
Summary     : A Tool for Mirroring FTP and HTTP Servers
Description :
Wget enables you to retrieve WWW documents or FTP files from a server.
This can be done in script files or via the command line.
Distribution: SUSE Linux Enterprise 15

只有当您指定带有完整路径的完整文件名时,选项 -f 才起作用。根据需要提供任意多个文件名。例如:

> rpm -q -f /bin/rpm /usr/bin/wget
rpm-4.14.1-lp151.13.10.x86_64
wget-1.19.5-lp151.4.1.x86_64

如果只知道部分文件名,则可以使用外壳脚本,如例 9.3 “搜索软件包的脚本”所示。当运行所显示的脚本时,将部分文件名以参数的形式传递给脚本。

rpm -q --changelog PACKAGE 命令会按日期顺序显示有关特定软件包的详细更改信息列表。

借助已安装的 RPM 数据库,可以进行校验检查。使用 -V--verify 可启动这些检查。将 rpm 与此选项搭配使用,将显示软件包中自安装后已更改的所有文件。rpm 使用八位字符符号来提供有关以下更改的提示:

表 9.2︰ RPM 校验选项

5

MD5 校验和

S

文件大小

L

符号链接

T

修改时间

D

主要和次要设备编号

U

所有者

G

M

方式(权限和文件类型)

对于配置文件,将输出字母 c。例如,要检查 /etc/wgetrc( wget 软件包)的更改,请使用以下命令:

> rpm -V wget
S.5....T c /etc/wgetrc

RPM 数据库的文件放置在 /var/lib/rpm 中。如果分区 /usr 的大小为 1 GB,则此数据库可能会占用将近 30 MB 的空间,特别是在全面更新之后。如果数据库比预期大得多,建议使用选项 --rebuilddb 来重构建数据库。在执行此操作之前,制作旧数据库的备份。cron 脚本 cron.daily 每天都会创建数据库副本(打包成 gzip 格式)并将这些副本存储在 /var/adm/backup/rpmdb 中。副本数量由 /etc/sysconfig/backup 中的变量 MAX_RPMDB_BACKUPS(默认值为 5)控制。对于 1 GB 的 /usr,单个备份的大小大约为 1 MB。

9.2.5 安装和编译源软件包

所有源软件包的扩展名都是 .src.rpm(源 RPM)。

注意
注意:安装的源软件包

源软件包可以从安装媒体复制到硬盘并使用 YaST 解压缩。但在软件包管理器中,它们不会被标记为已安装 ([i])。这是因为源软件包不是在 RPM 数据库中输入的。只有已安装的操作系统软件列在 RPM 数据库中。安装源软件包时,只将源代码添加到系统中。

/usr/src/packages 中,必须存在用于 rpmrpmbuild 的以下目录(除非在 /etc/rpmrc 这样的文件中指定了自定义设置):

SOURCES

存放原始源(.tar.bz2.tar.gz 文件等)和特定于发行套件的调整(多为 .diff.patch 文件)

SPECS

代表 .spec 文件,类似于元 Makefile,可控制构建进程

BUILD

在此目录中解压缩、修补和编译所有源

RPMS

存储完整的二进制软件包的位置

SRPMS

这里是源 RPM

使用 YaST 安装源软件包时,所有必需的组件都安装在 /usr/src/packages 中:源和调整项存放于 SOURCES 中,相关的 .spec 文件存放于 SPECS 中。

警告
警告:系统完整性

不要对系统组件(glibcrpm 等)进行试验,因为这样会影响系统的稳定性。

下面的示例使用 wget.src.rpm 软件包。安装源软件包后,应具有类似以下列表中的文件:

/usr/src/packages/SOURCES/wget-1.19.5.tar.bz2
/usr/src/packages/SOURCES/wgetrc.patch
/usr/src/packages/SPECS/wget.spec

rpmbuild -bX /usr/src/packages/SPECS/wget.spec 会启动编译。X 是通配符,代表构建进程的不同阶段(有关详细信息,请参见 --help 的输出或 RPM 文档)。以下内容只是简要描述:

-bp

/usr/src/packages/BUILD 中准备源:解压和修补。

-bc

执行与 -bp 相同的操作,但还会进行编译。

-bi

执行与 -bp 相同的操作,但还会安装构建的软件。注意:如果软件包不支持 BuildRoot 功能,则可能会重写配置文件。

-bb

执行与 -bi 相同的操作,但还会创建二进制软件包。如果编译成功,二进制软件包应该存放于 /usr/src/packages/RPMS 中。

-ba

执行与 -bb 相同的操作,但还会创建源 RPM。如果编译成功,二进制软件包应该存放于 /usr/src/packages/SRPMS 中。

--short-circuit

跳过某些步骤。

现在可以使用 rpm -i(最好使用 rpm -U)创建二进制 RPM。使用 rpm 进行安装使它显示在 RPM 数据库中。

请记住,规范文件中的 BuildRoot 指令已弃用。如果您仍然需要此功能,请使用 --buildroot 选项作为替代方案。

9.2.6 使用 build 编译 RPM 软件包

许多软件包存在的风险是构建进程中会将许多不需要的文件添加到正在运行的系统中。为防止发生这种情况,请使用 build,它将创建构建软件包的已定义环境。要建立这一 chroot 环境,build 脚本必须和完整的软件包树结构一起提供。可以通过 NFS 或从 DVD 使用硬盘上的此树。使用 build --rpms DIRECTORY 设置位置。与 rpm 不同,build 命令会在源目录中查找 .spec 文件。要使用系统中 /media/dvd 下挂载的 DVD 构建 wget(如上例所示),请以 root 用户身份运行以下命令:

# cd /usr/src/packages/SOURCES/
# mv ../SPECS/wget.spec .
# build --rpms /media/dvd/suse/ wget.spec

之后,系统便会在 /var/tmp/build-root 中建立一个极简环境。在此环境中构建软件包。完成后,生成的软件包将位于 /var/tmp/build-root/usr/src/packages/RPMS 中。

build 脚本提供多个其他选项。例如,使脚本优先选择您自己的 RPM、忽略构建环境的初始化或者将 rpm 命令限制在上述阶段之一。有关更多信息,请使用 build --help 以及参见 build 手册页。

9.2.7 用于 RPM 存档和 RPM 数据库的工具

Midnight Commander (mc) 可以显示 RPM 存档的内容并复制部分内容。它将存档表示为虚拟文件系统,提供 Midnight Commander 所有常用的菜单选项。使用 F3 键可显示 HEADER。使用光标键和 Enter 键查看存档结构。使用 F5 键复制部分存档。

拥有全部功能的软件包管理器将作为 YaST 模块提供。有关详细信息,请参见第 8 章 “安装或去除软件