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

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

本章描述 Zypper 和 RPM,这是两个用于管理软件的命令行工具。有关此环境中使用的术语定义(例如,储存库补丁更新),请参见第 21.1 节 “术语定义”

6.1 使用 Zypper

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

6.1.1 一般使用

Zypper 的常用语法为:

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

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

Zypper 命令

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

tux > sudo zypper patch
全局选项

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

tux > sudo zypper --non-interactive patch

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

命令特定的选项

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

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

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

参数

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

tux > sudo zypper install mplayer

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

tux > zypper search -t pattern

您可以组合上述所有模式。例如,下面的命令在冗长模式下运行时将安装 mcvim 软件包(来自 factory 储存库):

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

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

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

tux > sudo zypper remove --dry-run MozillaFirefox

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

tux > sudo zypper --userdata STRING patch

6.1.2 使用 Zypper 子命令

Zypper 子命令是储存在 zypper_execdir (/usr/lib/zypper/commands) 中的可执行文件。如果在 zypper_execdir 中找不到某个子命令,Zypper 会自动在 $PATH 的剩余部分中搜索该子命令。您可以编写自己的本地扩展,并将其储存在用户空间中。

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

列出可用的子命令:

tux > 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

  <none>

查看子命令的帮助屏幕:

tux > zypper help appstream-cache

6.1.3 使用 Zypper 安装和去除软件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6.1.3.2 同时安装和去除软件包

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

tux > sudo zypper install emacs -vim

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

tux > sudo zypper remove emacs +vim

为避免 - 开头的软件包名称被解释为命令行选项,要始终把它用作第二个参数。如果做不到这点,在它之前加上 --

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

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

如果您想将在指定的软件包去除后不再需要的所有软件包(随指定的软件包)自动去除,请使用 --clean-deps 选项:

tux > sudo zypper rm --clean-deps PACKAGE_NAME

6.1.3.4 在脚本中使用 Zypper

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

tux > sudo zypper --non-interactive install PACKAGE_NAME

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

6.1.3.5 安装或下载源软件包

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

tux > zypper source-install PACKAGE_NAME

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

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

tux > sudo zypper source-install -D PACKAGE_NAME

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

tux > sudo zypper source-install -d PACKAGE_NAME

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

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

tux > zypper search -t srcpackage

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

tux > zypper source-download

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

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

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

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

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

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

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

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

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

6.1.3.7 实用程序

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

tux > zypper verify

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

tux > sudo zypper install-new-recommends

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

6.1.4 使用 Zypper 更新软件

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

6.1.4.1 安装全部所需的补丁

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

tux > sudo zypper patch

系统将会检查您计算机上配置的储存库中提供的所有补丁是否与您的安装相关。如果相关(未分为可选功能类别),则会立即安装这些补丁。请注意,正式的更新储存库仅在注册 SUSE Linux Enterprise Server 安装后才可用。

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

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

tux > sudo zypper patch --with-update

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

tux > sudo zypper patch --with-optional

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

tux > sudo zypper patch --bugzilla=NUMBER

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

tux > sudo zypper patch --cve=NUMBER

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

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

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

tux > sudo zypper patch --updatestack-only

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

6.1.4.2 列出补丁

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

所需补丁的数目

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

tux > 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=编号。要搜索与多个 Bugzilla 问题相关的补丁,请在 bug 编号之间添加逗号,例如:

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

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

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

tux > zypper list-patches --bugzilla=CVE-2016-2315,CVE-2016-2324

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

tux > 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
[...]

6.1.4.3 安装新的软件包版本

如果某个安装源只包含新软件包,但未提供补丁,则 zypper patch 不会产生任何作用。要使用可用的较新版本更新所有已安装的软件包(同时还要保持系统完整性),请使用:

tux > sudo zypper update

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

tux > sudo zypper update PACKAGE_NAME
tux > sudo zypper install PACKAGE_NAME

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

tux > zypper list-updates

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

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

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

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

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

tux > sudo zypper list-updates --all

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

6.1.4.4 识别孤立的软件包

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

tux > sudo zypper packages --orphaned

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

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

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

tux > 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

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

tux > 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

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

6.1.6 使用 Zypper 管理储存库

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

tux > zypper repos

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

例 6.1︰ Zypper — 已知储存库的列表
tux > 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 或优先级之类的细节。用以下命令可以列出所有细节:

tux > zypper repos -d

6.1.6.1 添加储存库

要添加储存库,请运行

tux > sudo zypper addrepo URI ALIAS

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

6.1.6.2 刷新储存库

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

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

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

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

tux > sudo zypper --plus-content refresh

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

6.1.6.3 去除储存库

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

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

6.1.6.4 修改储存库

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

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

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

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

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

tux > sudo zypper renamerepo 'Mozilla Firefox' firefox

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

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

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

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

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

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

tux > zypper search-packages package1 package2

zypper search-packages 提供以下选项:

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

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

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

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

6.1.7.3 搜索特定功能

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

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

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

6.1.7.4 显示软件包信息

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

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

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

tux > zypper info --requires MozillaFirefox

6.1.8 显示生命周期信息

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

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

root # 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

6.1.9 配置 Zypper

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

6.1.10 查错

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

tux > sudo zypper refresh

如果不起作用,则尝试

tux > sudo zypper refresh -fdb

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

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

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

6.1.12 更多信息

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

6.2 RPM - 软件包管理器

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

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

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

提示
提示:软件开发包

对于一些软件包,软件开发所需的组件(库、报头、包含文件等)已纳入独立的软件包中。只有当您要自己编译软件时才需要这些开发包(例如最新的 GNOME 软件包)。可以通过扩展名 -devel 确定这些开发包,例如软件包 alsa-develgimp-devel

6.2.1 校验软件包真实性

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

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

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

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

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

安装 RPM 存档的步骤通常十分简单,执行运行:rpm -i 软件包.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 数据库。

6.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 是存在的:

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

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

tux > sudo applydeltarpm new.delta.rpm new.rpm

如果不访问文件系统而从旧 RPM 得到它,请使用 -r 选项:

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

关于技术详细信息,请参见 /usr/share/doc/packages/deltarpm/README

6.2.4 RPM查询

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

表 6.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 显示例 6.2 “rpm -q -i wget 中所示的信息。

例 6.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 才起作用。根据需要提供任意多个文件名。例如:

tux > 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

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

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

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

表 6.2︰ RPM 校验选项

5

MD5 校验和

S

文件大小

L

符号链接

T

修改时间

D

主要和次要设备编号

U

所有者

G

M

方式(权限和文件类型)

对于配置文件,将输出字母 c。例如,对于 /etc/wgetrcwget 软件包)的更改:

tux > 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。

6.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 选项作为替代方法。

6.2.6 使用 build 编译 RPM 软件包

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

root # cd /usr/src/packages/SOURCES/
root # mv ../SPECS/wget.spec .
root # 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 手册页来访问更多信息。

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

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

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