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

时间:2022-11-08 23:00:42

https://www.suse.com/zh-cn/documentation/sles11/singlehtml/book_sle_admin/cha.sw_cl.html

目录

5.1. 使用 Zypper
5.2. RPM - 包管理器

摘要

本章描述 Zypper 和 RPM,这是两个用于管理软件的命令行工具。有关此环境中使用的术语定义(例如,安装源增补程序更新),请参见第 9.1 节 “术语定义” (第 9 章 安装或删除软件, ↑部署指南)。

5.1. 使用 Zypper

Zypper 是一个命令行包管理器,用于安装、更新和删除包及管理安装源。Zypper 的语法与 rug 的相似。与 rug 相反,Zypper 不需要在场景后运行 zmd 守护程序。有关 rug 兼容性的更多信息,请参见 man zypper 的COMPATIBILITY WITH RUG 部分。这一点对于完成远程软件管理任务或从外壳脚本管理软件尤其有用。

5.1.1. 一般使用

Zypper 的常用语法为:

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

不需要括在括号中的组件。执行 Zypper 最简单的方式是,键入其名称后跟一个命令。例如,将所有需要的增补程序应用于系统类型:

zypper patch

或者,可以从一个或多个全局选项中选择,方法是:只需在命令前面键入这些选项。例如,--non-interactive 表示运行命令时不询问任何问题(自动应用默认回答):

zypper --non-interactive patch

要使用特定于某一特定命令的选项,请在此命令后面键入这些选项。例如,--auto-agree-with-licenses 表示将所有必需的增补程序应用到系统,不要求确认任何许可证(它们会被自动接受):

zypper patch --auto-agree-with-licenses

某些命令需要一个或多个自变量。例如,使用安装命令时,需要指定安装哪个(哪些)包:

zypper install mplayer

某些选项也需要自变量。用以下命令可列出所有已知模式:

zypper search -t pattern

您可以组合上述所有模式。例如,以下命令将在冗长模式下从 factory 安装源安装 mplayer 和 amarok 包:

zypper -v install --from factory mplayer amarok

--from 选项确保了在从指定安装源请求包时保留所有安装源的启用状态(用于解析任何依赖项)。

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

zypper remove --dry-run MozillaFirefox

5.1.2. 使用 Zypper 安装和删除软件

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

zypper install package_name
zypper remove package_name

Zypper 知道安装和删除命令处理包的不同方式:

用完整包名称(和版本号)
zypper install MozillaFirefox

zypper install MozillaFirefox-3.5.3
用安装源别名和包名称
zypper install mozilla:MozillaFirefox

其中 mozilla 是用于安装的安装源别名。

用使用通配符的包名称

以下命令将安装名称以Moz开头的所有包。使用通配符要小心,特别是删除包的时候。

zypper install 'Moz*'
用功能

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

zypper install 'perl(Time::ParseDate)'
用功能和/或体系结构和/或版本

您可以指定功能以及体系结构(例如 i586 或 x86_64)和/或版本。版本前必须带有以下某个运算符:<(小于)、<=(小于等于)、=(等于)、>=(大于等于)或 >(大于)。

zypper install 'firefox.x86_64'
zypper install 'firefox>=3.5.3'
zypper install 'firefox.x86_64>=3.5.3'
用 RPM 文件的路径

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

zypper install /tmp/install/MozillaFirefox.rpm
zypper install http://download.opensuse.org/repositories/mozilla/SUSE_Factory/x86_64/MozillaFirefox-3.5.3-1.3.x86_64.rpm

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

zypper install emacs -vim

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

zypper remove emacs +vim

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

zypper install -emacs +vim       # Wrong
zypper install vim -emacs # Correct
zypper install -- -emacs +vim # same as above
zypper remove emacs +vim # same as above

如果(同时使用某个包)要自动删除在删除指定包后不再需要的任何包,请使用 --clean-deps 选项:

rm package_name --clean-deps

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

zypper --non-interactive install package_name

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

zypper使用命令行工具管理软件 不要删除必需的系统包

请勿删除如 glibczypperkernel 之类的包。这些包是系统强制安装的,如果删除可能导致系统不稳定或完全停止运行。

5.1.2.1. 安装资源包

如果要安装某包对应的源包,请使用:

zypper source-install package_name

使用此命令,还可安装指定包的版本依赖性。如果不想执行此操作,请如下所示添加开关 -D。要只安装版本依赖性,请使用 -d

zypper source-install -D package_name # source package only
zypper source-install -d package_name # build dependencies only

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

可使用以下方法来获取安装源中所有源包的列表:

zypper search -t srcpackage

5.1.2.2. 实用程序

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

zypper verify

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

zypper install-new-recommends

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

5.1.3. 使用 Zypper 更新软件

用 Zypper 更新软件有三种方式:安装包、安装包的新版本或更新整个分发包。后者用 zypper dist-upgrade命令实现,该命令在第 5.1.4 节 “用 zypper 升级分发包” 中进行了讨论。

5.1.3.1. 安装增补程序

要安装所有适用于您系统的正式发布增补程序,只需运行:

zypper patch

这种情况下,会对安装源中的所有可用增补程序进行相关性检查,如有需要,还会进行安装。注册 SUSE Linux Enterprise Server 安装之后,包含此类增补程序的官方更新安装源将添加到您的系统中。上述命令就是为了在需要时应用它们所必须输入的全部内容。

Zypper 知道三种查询增补程序可用性的不同命令:

zypper patch-check

列出需要的增补程序数(适用于您的系统但尚未安装的增补程序)

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

列出需要的所有增补程序(适用于您的系统但尚未安装的增补程序)

~ # zypper list-patches
Loading repository data...
Reading installed packages...

Repository | Name | Version | Category | Status
------------------------------------+-----------+---------+----------+-------
Updates for openSUSE 11.3 11.3-1.82 | lxsession | 2776 | security | needed
zypper patches

列出 SUSE Linux Enterprise Server 可用的所有增补程序,无论是否已安装或是否适用于您的安装。

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

--bugzilla[=编号]

列出 Bugzilla 问题的所有必需增补程序。如果只要列出特定 bug 的增补程序,则可以选择指定其 bug 编号。

--cve[=编号]

列出 CVE(通用漏洞披露)问题的所有必需增补程序,或者仅列出与特定 CVE 编号(如果已指定)匹配的增补程序。

要安装用于特定 Bugzilla 或 CVE 问题的增补程序,请使用以下命令:

zypper patch --bugzilla=number

zypper patch --cve=number

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

zypper patch --cve=CVE-2010-2713

5.1.3.2. 安装更新

如果某个安装源只包含新包,但未提供增补程序,则 zypper patch 不会产生任何作用。要使用新的可用版本更新所有安装的包,请使用:

zypper update

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

zypper update package_name
zypper install package_name

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

zypper list-updates

请注意,此命令仅列出与以下准则匹配的包:

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

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

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

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

zypper list-updates --all

要找出新包不能安装的原因,使用上面描述的 zypper install 或 zypper update 命令即可。

5.1.3.3. 升级到新产品版本

要轻松将安装升级到新产品版本(例如,从 SUSE Linux Enterprise Server 11 升级到 SUSE Linux Enterprise Server 11 SP1,请先调整安装源,使其与当前的 SUSE Linux Enterprise Server 安装源匹配。有关细节,请参见第 5.1.5 节 “用 Zypper 管理安装源”。然后对必需的安装源使用 zypper dist-upgrade 命令。该命令可确保安装当前启用的安装源上的所有包。有关详细说明,请参见第 5.1.4 节 “用 zypper 升级分发包”

要将分发包升级限制为来自特定安装源的包,同时还考虑满足依赖性的其他安装源,请使用 --from 选项并按别名、编号或 URI 指定安装源。

zypper使用命令行工具管理软件 zypper update 和 zypper dist-upgrade 之间的区别

选择 zypper update 可以在保持系统完整性的前提下将包更新到您的产品版本可用的较新版本。zypper update 遵守以下规则:

不更改供应商
不更改体系结构
不降级
保留已安装的包

执行 zypper dist-upgrade 时,将安装来自当前启用的安装源的所有包。该规则是强制执行的,因此包可能更改供应商或体系结构,甚至降级。升级后不满足依赖性的所有包都将卸装。

5.1.4. 用 zypper 升级分发包

用 zypper 命令行实用程序,可以将分发包升级到下一个版本。最为重要的是,您可以在正在运行的系统中启动系统升级过程。

此功能适用于要运行远程升级或在多数配置类似的系统上运行升级的高级用户。

5.1.4.1. 开始用 zypper 升级前

为了避免在用 zypper 升级过程中出现意外错误,请尽可能减少有风险的操作。

尽量关闭应用程序和不必要的服务,并注销所有普通用户。

在开始升级前禁用第三方安装源,或降低这些安装源的优先级,以确保来自默认系统安装源的包具有优先权。完成升级后再次启用它们,并编辑其版本字符串,使其与已升级的运行中系统的分发包版本号匹配。

5.1.4.2. 升级过程

zypper使用命令行工具管理软件 检查系统备份

在真正开始升级过程前,请检查系统备份是否为最新且可恢复。因为以下许多步骤都必须手动输入,所以这一点尤其重要。

  1. 运行联机更新以确保软件管理堆栈为最新的。有关详细信息,请参见第 1 章 YaST 联机更新

  2. 配置要用作更新源的安装源。拥有此权限至关重要。使用 YaST(参见第 9.3 节 “管理软件安装源和服务” (第 9 章 安装或删除软件, ↑部署指南))或 zy per(参见第 5.1 节 “使用 Zypper”)。以下步骤中用到的安装源名称可能因您的自定义而有所不同。

    考虑准备或更新自己的安装服务器。有关背景信息,请参见 第 14.2.1 节 “使用 YaST 设置安装服务器” (第 14 章 远程安装, ↑部署指南)。

    要查看当前的安装源,请输入:

    zypper lr -u
    zypper使用命令行工具管理软件 zypper 命令名

    zypper 支持长命令名和短命令名。例如,您可以将 zypper install 缩写为 zypper in。在以下文本中,使用了短变体。

    1. 将系统安装源版本号从 11 增加到 11-SP1;用以下命令添加新的 11_SP1 安装源:

      server=http://download.example.org
      zypper ar $server/distribution/11-SP1/repo/oss/ SLE-11-SP1
      zypper ar $server/update/11-SP1/ SLE-11-SP1-Update

      并且删除旧安装源:

      zypper rr SLE-11
      zypper rr SLE-11-Update
    2. 禁用第三方安装源或其他 Open Build Service 安装源,因为 zypper dup 只能保证与默认安装源协同运行(将安装源别名替换为要禁用的安装源的名称):

      zypper mr -d repo-alias

      或者,您也可以降低这些安装源的优先级。

      zypper使用命令行工具管理软件 处理未解决的依赖性

      zypper dup 会删除所有具有未解决的依赖性的包,但只要依赖性要求符合,它就会保留已禁用安装源的包。

      zypper dup 保证了所有安装的包都来自某个可用的安装源。它不考虑已安装包的版本、体系结构或供应商,因此它仿效全新安装。安装源中不再可用的包会当作孤立包。如果这些包的依赖性不能满足,则会卸装它们。如果这些包的依赖性能够满足,则不会卸装它们。

    3. 完成后,用以下项检查安装源配置:

      zypper lr -d
  3. 用 zypper ref 刷新本地元数据和安装源内容。

  4. 用 zypper up zypper 从 11 SP1 安装源拉入 zypper 和包管理堆栈。

  5. 用 zypper dup 运行实际的分发包升级。系统会要求您确认 SUSE Linux Enterprise 和一些包的许可证,具体取决于已安装包的设置。

  6. 用 SuSEconfig 执行基本系统配置。

  7. 用 shutdown -r now 重引导系统。

5.1.5. 用 Zypper 管理安装源

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

zypper repos

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

例 5.1. Zypper - 已知安装源列表

# | Alias                             | Name                              | Enabled | Refresh
--+-----------------------------------+-----------------------------------+---------+--------
1 | SUSE-Linux-Enterprise-Server 11-0 | SUSE-Linux-Enterprise-Server 11-0 | Yes | No
2 | SLES-11-Updates | SLES 11 Online Updates | Yes | Yes
3 | broadcomdrv | Broadcom Drivers | Yes | No

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

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

zypper repos -d

5.1.5.1. 添加安装源

要添加安装源,请运行

zypper addrepo URIalias

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

5.1.5.2. 删除安装源

如果要从此列表中删除某个安装源,请将命令 zypper removerepo 和要删除的安装源的别名或编号结合使用。例如,要删除例 5.1 “Zypper - 已知安装源列表” 中列为第三项的安装源,请使用以下命令:

zypper removerepo 3

5.1.5.3. 修改安装源

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

zypper modifyrepo -er -p 20 'updates'

修改安装源并不限于单个安装源 - 您还可以按组操作:

-a:所有安装源
-l:本地安装源
-t:远程安装源
-m 类型:特定类型的安装源(其中类型可以是以下之一:httphttpsftpcddvddirfilecifssmbnfshd 和 iso

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

zypper renamerepo 'Mozilla Firefox' firefox

5.1.6. 用 Zypper 查询安装源和包

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

zypper products
zypper patterns
zypper packages
zypper patches

要查询特定包的所有安装源,请使用 search。它用于包名称或(可选)包摘要和描述。搜索项中允许使用通配符 * 和 ?。默认情况下搜索不区分大小写。

zypper search firefox       # simple search for "firefox"
zypper search "*fire*" # using wildcards
zypper search -d fire # also search in package descriptions and summaries
zypper search -u firefox # only display packages not already installed

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

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

要查询个别包,请使用 info 命令,并用完整包名称作为自变量。它会显示包的详细信息。如果还要显示该包必需/推荐的包,则使用选项 --requires 和 --recommends

zypper info --requires MozillaFirefox

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

5.1.7. 配置 Zypper

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

5.1.8. 查错

如果访问来自配置的安装源的包时存在问题(例如,尽管您知道某个包在某个安装源中,但 zypper 找不到该包),可使用以下命令刷新安装源:

zypper refresh

如果不起作用,则尝试

zypper refresh -fdb

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

5.1.9. btrfs 文件系统上的 Zypper 回滚功能

如果在根分区上使用 btrfs 文件系统,zypper 会在将更改提交到文件系统时自动调用 snapper 来创建相应的文件系统快照。这些快照可用于还原 zypper 执行的任何更改。有关 snapper 的更多信息,请参见 man snapper

默认文件系统不支持此功能。

5.2. RPM - 包管理器

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

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

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

zypper使用命令行工具管理软件 软件开发包

对于许多包,已将软件开发所需的部件(库、标题、包含文件等)放入单独的包中。只有当您要自己编译软件时才需要这些开发包(例如最新的 GNOME 包)。可通过扩展名 -devel 标识这些开发包,例如包alsa-develgimp-devel 和 libkde4-devel

5.2.1. 校验包真实性

RPM 包具有 GnuPG 签名。要校验 RPM 程序包的的签名,请使用命令 rpm --checksig -1.2.3.rpm 决定该包是源自 Novell/SUSE 还是另一个可信设备。特别建议对来自因特网的更新包使用此命令。

5.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.rpm,仅删除包含未解析依赖性的包。例如,只要有其他程序需要 Tcl/Tk,理论上就不能删除它。即使是在这种情况下,RPM 也会向数据库寻求帮助。如果出于任何原因无法进行此删除操作(即使存在其他依赖性),则最好使用选项 --rebuilddb 重构建 RPM 数据库。

5.2.3. RPM 和增补程序

为了确保系统的操作安全性,必须时常在系统中安装更新包。以前,包中的 bug 只能通过替换整个包来解决。小文件中带 bug 的大型包容易导致这种情况的发生。不过 SUSE RPM 提供了一项功能,支持在包中安装增补程序。

以下使用 pine 的示例中对最重要的考虑事项进行了说明:

增补程序 RPM 是否适合我的系统?

要对此进行检查,请先查询包的已安装版本。对于 pine,可以通过以下命令完成:

rpm -q pine
pine-4.44-188

然后检查增补程序 RPM 是否适合此版本的 pine

rpm -qp --basedon pine-4.44-224.i586.patch.rpm 
pine = 4.44-188
pine = 4.44-195
pine = 4.44-207

此增补程序适用于 pine 的三个不同的版本。还列出示例中已安装的版本,从而可以安装增补程序。

增补程序将替换哪些文件?

在增补程序 RPM 中可以方便地找到受增补程序影响的文件。rpm 参数 -P 允许选择特殊的增补程序功能。使用以下命令显示文件列表:

rpm -qpPl pine-4.44-224.i586.patch.rpm
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine

或者,如果已安装增补程序,则使用以下命令:

rpm -qPl pine
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine
如何在系统中安装增补程序 RPM?

增补程序 RPM 的使用与普通 RPM 相同。唯一的区别就是必须已安装合适的 RPM。

系统中已安装了哪些增补程序,用于哪些包版本?

使用命令 rpm -qPa 可以显示系统中已安装的所有增补程序的列表。如果新系统中只安装了一个增补程序(如本示例中),则列表如下:

rpm -qPa
pine-4.44-224

如果以后要了解最初安装了哪个包版本,则可以在 RPM 数据库中获得此信息。对于 pine,可以通过以下命令显示此信息:

rpm -q --basedon pine
pine = 4.44-188

rpm 和 rpmbuild 的手册页中提供了详细信息(包括有关 RPM 的增补程序功能的信息)。

zypper使用命令行工具管理软件 SUSE Linux Enterprise Server 的官方更新

为了尽量减小更新的下载大小,SUSE Linux Enterprise Server 的官方更新未以增补程序 RPM 的形式提供,而是以增量 RPM 程序包提供。有关细节,请参见第 5.2.4 节 “增量 RPM 包”

5.2.4. 增量 RPM 包

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

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

prepdeltarpm -s seq -i info old.rpm > old.cpio
prepdeltarpm -f new.rpm > new.cpio
xdelta delta -0 old.cpio new.cpio delta
writedeltarpm new.rpm delta info new.delta.rpm

最后,删除临时工作文件 old.cpionew.cpio 和 delta

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

applydeltarpm new.delta.rpm new.rpm

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

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

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

5.2.5. RPM 查询

使用 -q 选项,rpm 将启动查询,从而能够查看 RPM 存档(通过添加选项 -p)并查询已安装包的 RPM 数据库。可以使用多个开关指定所需信息的类型。请参见表 5.1 “最重要的 RPM 查询选项”

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

例 5.2. rpm -q -i wget

Name        : wget                         Relocations: (not relocatable)
Version : 1.11.4 Vendor: openSUSE
Release : 1.70 Build Date: Sat 01 Aug 2009 09:49:48 CEST
Install Date: Thu 06 Aug 2009 14:53:24 CEST Build Host: build18
Group : Productivity/Networking/Web/Utilities Source RPM: wget-1.11.4-1.70.src.rpm
Size : 1525431 License: GPL v3 or later
Signature : RSA/8, Sat 01 Aug 2009 09:50:04 CEST, Key ID b88b2fd43dbdc284
Packager : http://bugs.opensuse.org
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.
[...]

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

rpm -q -f /bin/rpm /usr/bin/wget

产生:

rpm-4.8.0-4.3.x86_64
wget-1.11.4-11.18.x86_64

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

例 5.3. 搜索包的脚本

#! /bin/sh
for i in $(rpm -q -a -l | grep $1); do
echo "\"$i\" is in package:"
rpm -q -f $i
echo ""
done

命令 rpm -q --changelog rpm 按照日期显示特定包(此例中为 rpm 程序包)更改信息的详细列表。

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

表 5.2. RPM 校验选项

5

MD5 校验和

S

文件大小

L

符号链接

T

修改时间

D

主要和次要设备编号

U

拥有者

G

M

方式(权限和文件类型)


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

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。

5.2.6. 安装和编译源包

所有源包都带有 .src.rpm 扩展名(源 RPM)。

zypper使用命令行工具管理软件 已安装的源包

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

以下目录必须可用于 /usr/src/packages 中的 rpm 和 rpmbuild(除非在诸如 /etc/rpmrc 这样的文件中指定自定义设置):

SOURCES

代表原始源(.tar.bz2 或 .tar.gz 文件等)和特定于发布版本的调整(多为 .diff 或 .patch 文件)

SPECS

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

BUILD

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

RPMS

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

SRPMS

这里是源 RPM

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

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

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

下面的示例使用 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 -b X /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 数据库中。

5.2.7. 使用 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 手册页来访问更多信息。

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

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

还提供充当 YaST 模块的功能齐全的包管理器。有关细节,请参见第 9 章 安装或删除软件 (↑部署指南)。