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

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

本章描述 Zypper 和 RPM,这是两个用于管理软件的命令行工具。有关此环境中使用的术语定义(例如,储存库增补程序更新),请参见第 13.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

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

tux > sudo zypper -v install --from factory aspell-de aspell-fr

--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 安装和删除软件

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

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

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

6.1.2.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'
按功能

例如,如果您要安装 Perl 模块但不知道包名称,功能就可以派上用场:

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

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

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

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

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

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

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

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

6.1.2.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.2.3 清理已去除包的依赖项

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

tux > sudo zypper rm PACKAGE_NAME --clean-deps

6.1.2.4 在脚本中使用 Zypper

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

tux > sudo zypper --non-interactive install PACKAGE_NAME

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

6.1.2.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.5 节 “用 Zypper 管理安装源” 了解有关储存库管理的细节。

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

tux > zypper search -t srcpackage

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

tux > zypper source-download

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

6.1.2.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 字符串。

6.1.2.7 实用程序

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

tux > zypper verify

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

tux > sudo zypper install-new-recommends

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

6.1.3 使用 Zypper 更新软件

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

6.1.3.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.3.2 列出增补程序

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

所需增补程序的数目

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

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

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

所需增补程序的列表

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

tux > zypper list-patches
Loading repository data...
Reading installed packages...

Repository     | Name        | Version | Category | Status  | Summary
---------------+-------------+---------+----------+---------+---------
SLES12-Updates | SUSE-2014-8 | 1       | security | needed  | openssl: Update for OpenSSL
所有增补程序的列表

要列出 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-2015-0287 | SUSE-SLE-Module.. | recommended | moderate  | needed
cve   | CVE-2014-3566 | SUSE-SLE-SERVER.. | recommended | moderate  | not needed
[...]

6.1.3.3 安装新的包版本

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

tux > sudo zypper update

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

tux > sudo zypper update PACKAGE_NAME
sudo zypper install PACKAGE_NAME

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

tux > zypper list-updates

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

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

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

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

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

tux > sudo zypper list-updates --all

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

6.1.3.4 识别孤立的包

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

tux > sudo zypper packages --orphaned

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

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

在增补、更新或去除包时,系统上可能有一些正在运行的进程会继续使用更新或去除后已被删除的文件。运行 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
User:运行进程的用户的登录名
Command:用于执行进程的命令
Service:服务名称(仅当命令与系统服务关联时才显示)
Files:已删除文件的列表

通过如下方式可控制 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

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

6.1.5 用 Zypper 管理安装源

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

tux > zypper repos

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

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

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

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

tux > zypper repos -d

6.1.5.1 添加安装源

要添加安装源,请运行

tux > sudo zypper addrepo URI ALIAS

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

6.1.5.2 刷新储存库

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

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

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

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

tux > sudo zypper --plus-content refresh

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

6.1.5.3 删除储存库

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

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

6.1.5.4 修改储存库

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

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

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

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

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

tux > sudo zypper renamerepo 'Mozilla Firefox' firefox

6.1.6 用 Zypper 查询储存库和包

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

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

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

6.1.6.1 zypper search 用法

zypper search 命令可对包名或(视情况)对包摘要和说明执行搜索。括在 / 中的字符串会解译为正则表达式。默认情况下搜索不区分大小写。

执行简单搜索来查找包含 fire 的包名称
tux > zypper search "fire"
执行简单搜索来查找确切的包 MozillaFirefox
tux > zypper search --match-exact "MozillaFirefox"
同时在包描述和摘要中搜索
tux > zypper search -d fire
仅显示尚未安装的包
tux > zypper search -u fire
显示包含字符串 fir 且该字符串后面不是 e 的包
tux > zypper se "/fir[^e]/"

6.1.6.2 zypper what-provides 用法

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

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

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

6.1.6.3 zypper info 用法

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

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

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

tux > zypper info --requires MozillaFirefox

6.1.7 配置 Zypper

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

6.1.8 查错

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

tux > sudo zypper refresh

如果不起作用,则尝试

tux > sudo zypper refresh -fdb

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

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

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

6.1.10 更多信息

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

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

tux > rpm -q -f /bin/rpm /usr/bin/wget
rpm-4.11.2-15.1.x86_64
wget-1.14-17.1.x86_64

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

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

借助已安装的 RPM 数据库,可以进行校验检查。使用 -V--verify 启动这些检查。使用此选项,rpm 显示安装后已被更改的包中的所有文件。rpm 使用 8 个字符符号给出有关以下更改的一些提示:

表 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.11.4.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 数据库中。

请记住,从 SUSE Linux Enterprise Server 12 开始,已弃用规范文件中的 BuildRoot 指令。如果您仍然需要此功能,请使用 --buildroot 选项作为替代方法。有关更详细的背景信息,请参见 https://www.suse.com/support/kb/doc?id=7017104 上的支持数据库。

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 模块提供。有关细节,请参见第 13 章 “安装或删除软件