
本章描述 Zypper 和 RPM,这是两个用于管理软件的命令行工具。有关此环境中使用的术语定义(例如,储存库、增补程序或更新),请参见Section 8.1, “Definition of Terms”。
Zypper 是一个命令行包管理器,用于安装、更新和去除包及管理储存库。这一点对于完成远程软件管理任务或从外壳脚本管理软件尤其有用。
Zypper 的常用语法为:
tux >zypper[--global-options]command[--command-options][arguments]
不需要括在括号中的组件。有关常规选项和所有命令的列表,请参见 zypper help。要获取有关特定命令的帮助,请键入 zypper help 命令。
执行 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-de
和
aspell-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 string 全局选项。您可以使用此选项指定一个将会写入 Zypper 的日志文件和插件(例如 Btrfs 插件)的字符串。它可以用于标记和标识日志文件中的事务。
tux > sudo zypper --userdata string patch要安装或去除包,请使用以下命令:
tux >sudo zypper install package_nametux >sudo zypper remove package_name
不要去除必需的系统包,例如 glibc 、 zypper 、 kernel 。如果去除这些包,系统可能会变得不稳定,或完全停止工作。
可以使用 zypper install 和 zypper remove 命令通过多种方法来找到包。
tux > sudo zypper install MozillaFirefoxtux > sudo zypper install MozillaFirefox-3.5.3tux > 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可以结合功能指定硬件体系结构和版本:
所需硬件体系结构的名称需要追加在功能的后面,两者以句点分隔。例如,要指定 AMD64/Intel 64 体系结构(在 Zypper 中命名为 x86_64),请使用:
tux > sudo zypper install 'firefox.x86_64'
版本必须追加到字符串的末尾,并且前面必须带有一个运算符:<(小于)、<=(小于等于)、=(等于)、>=(大于等于)或 >(大于)。
tux > sudo zypper install 'firefox>=3.5.3'还可以指定硬件体系结构与版本组合要求:
tux > sudo zypper install 'firefox.x86_64>=3.5.3'您还可以指定包的本地或远程路径:
tux >sudo zypper install /tmp/install/MozillaFirefox.rpmtux >sudo zypper install http://download.opensuse.org/repositories/mozilla/SLE_12/x86_64/MozillaFirefox-45.0.2-1.1.x86_64.rpm
要同时安装和去除包,请使用 +/- 修饰符。要安装
emacs
并同时去除
vim
,请使用:
tux > sudo zypper install emacs -vim要去除 emacs 并同时安装 vim ,请使用:
tux > sudo zypper remove emacs +vim
为避免 - 开头的包名称被解释为命令行选项,要始终把它用作第二个自变量。如果做不到这点,在它之前加上 --:
tux >sudo zypper install -emacs +vim # Wrongtux >sudo zypper install vim -emacs # Correcttux >sudo zypper install -- -emacs +vim # same as abovetux >sudo zypper remove emacs +vim # same as above
如果您想将在指定的包去除后不再需要的所有包(随指定的包)自动去除,请使用 --clean-deps 选项:
tux > sudo zypper rm package_name --clean-deps
默认情况下,在安装或删除选定包之前或发生问题时,Zypper 会要求确认。您可以使用 --non-interactive 选项覆盖此行为。必须在实际命令(install、remove 和 patch)的前面指定此选项,如下所示:
tux >sudo zypper--non-interactiveinstall package_name
该选项允许在脚本和 cron 任务中使用 Zypper。
如果要安装某包的对应源代码包,请使用:
tux > zypper source-install package_name
以 root 身份执行时,源包的默认安装位置为 /usr/src/packages/;以用户身份运行时,则为 ~/rpmbuild。可以在本地 rpm 配置中更改这些值。
使用此命令还会安装指定包的版本依赖项。如果不想执行此操作,请如下所示添加开关 -D。要只安装版本依赖性,请使用 -d。
tux >sudo zypper source-install -D package_name # source package onlytux >sudo zypper source-install -d package_name # build dependencies only
当然,只有当储存库列表中启用了含有源包的储存库时,才能这样做(默认添加但不启用它)。请参见第 5.1.5 节 “用 Zypper 管理安装源” 了解有关储存库管理的细节。
可使用以下方法来获取储存库中所有源包的列表:
tux > zypper search -t srcpackage您也可以将所有已安装软件包的源包下载到本地目录。要下载源包,请使用:
tux > zypper source-download
默认的下载目录是 /var/cache/zypper/source-download。您可以使用 --directory 选项更改下载目录。若只想显示缺失或多余的包而不进行下载或删除任何内容,请使用 --status 选项。要删除多余的源包,请使用 --delete 选项。要禁用删除,请使用 --no-delete 选项。
通常,您只能从启用的储存库安装包。--plus-content 标记选项可帮助您指定要刷新的、要在当前 Zypper 会话期间暂时启用的,以及要在会话完成后禁用的储存库。
例如,要启用可以提供其他 -debuginfo 或 -debugsource 包的储存库,请使用 --plus-content debug。可以多次指定此选项。
要暂时启用此类“调试”储存库以安装特定的 -debuginfo 包,请按如下所示使用该选项:
tux > sudo zypper --plus-content debug install "debuginfo(build-id)=eb844a5c20c70a59fc693cd1061f851fb7d046f4"
对于缺少的 debuginfo 包,gdb 将会报告 build-id 字符串。
要校验所有依赖性是否仍然满足,并修复缺少的依赖性,请使用:
tux > zypper verify除了依赖性必须满足外,某些包还“推荐”其他包。只有在实际可用并可安装时才会安装这些推荐包。如果推荐的包在推荐它们的包已安装(通过添加其他包或硬件)之后才可用,请使用以下命令:
tux > sudo zypper install-new-recommends此命令在插入网络摄像头或 Wi-Fi 设备后非常有用。如果可用,它将安装设备驱动程序和相关软件。只有在满足特定硬件依赖性后,才可安装驱动程序和相关软件。
用 Zypper 更新软件有三种方式:安装包、安装包的新版本或更新整个分发包。最后一种方式可通过 zypper dist-upgrade 来实现。Chapter 14, Upgrading SUSE Linux Enterprise中介绍了如何升级 SUSE Linux Enterprise Desktop。
要安装所有适用于您系统的正式发布的增补程序,请运行:
tux > sudo zypper patch
系统将会检查您计算机上配置的储存库中提供的所有增补程序是否与您的安装相关。如果相关(未分为可选或功能类别),则会立即安装这些增补程序。请注意,正式的更新储存库仅在注册 SUSE Linux Enterprise Desktop 安装后才可用。
如果即将安装的增补程序所包含的更改要求重引导系统,您会在重引导前收到警告。
要额外安装可选增补程序,请使用:
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为了让您确定增补程序是否可用,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 Desktop 可用的所有增补程序,而不管它们是否已安装或适用于您的安装,请使用 zypper patches。
还可以列出并安装与特定问题相关的增补程序。要列出特定的增补程序,请使用带以下选项的 zypper list-patches 命令:
要列出与 Bugzilla 问题相关的全部所需增补程序,请使用 --bugzilla 选项。
要列出针对特定 bug 的增补程序,您也可以指定 bug 编号:--bugzilla=编号。要搜索与多个 Bugzilla 问题相关的增补程序,请在 bug 编号之间添加逗号,例如:
tux > zypper list-patches --bugzilla=972197,956917
要列出与 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
[...]
如果某个安装源只包含新包,但未提供增补程序,则 zypper patch 不会产生任何作用。要使用可用的较新版本更新所有已安装的包(同时还要保持系统完整性),请使用︰
tux > sudo zypper update要更新个别包,请用更新或安装命令指定包:
tux >sudo zypper update package_nametux >sudo zypper install package_name
可使用此命令来获取所有新的可安装包的列表:
tux > zypper list-updates请注意,此命令只会列出符合以下准则的包︰
与已安装的包拥有相同的供应商,
由至少与已安装包拥有相同优先级的储存库提供,
可安装(满足所有依赖性)。
所有新的可用包(无论是否可安装)的列表可通过以下方式获取:
tux > sudo zypper list-updates --all
要找出新包无法安装的原因,请使用上面所述的 zypper install 或 zypper update 命令。
每当您从 Zypper 中去除某个储存库或者升级系统时,某些包可能会进入“孤立”状态。这些孤立的包不再属于任何活动储存库。以下命令可以列出这些包:
tux > sudo zypper packages --orphaned借助此列表,您可以确定是否仍然需要某个包,或者是否可以安全去除某个包。
在增补、更新或去除包时,系统上可能有一些正在运行的进程会继续使用更新或去除后已被删除的文件。运行 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 |
| User:运行进程的用户的登录名 |
| Command:用于执行进程的命令 |
| Service:服务名称(仅当命令与系统服务关联时才显示) |
| Files:已删除文件的列表 |
通过如下方式可控制 zypper ps 的输出格式:
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
有关服务处理的详细信息,请参见第 14 章 “systemd 守护程序”。
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要添加安装源,请运行
tux > sudo zypper addrepo URI aliasURI 可以是因特网储存库、网络资源、目录、CD 或 DVD(有关细节请参见 http://en.opensuse.org/openSUSE:Libzypp_URIs)。别名是储存库的唯一简写标识符。您可以随意选择别名,前提是它必须唯一。如果指定的别名已在使用,Zypper 将发出警告。
如果要从此列表中删除某个储存库,请将命令 zypper removerepo 和要删除的储存库的别名或编号结合使用。例如,要从例 5.1 “Zypper — 已知储存库的列表”中去除储存库 SLEHA-12-GEO,请使用下列命令之一:
tux >sudo zypper removerepo 1tux >sudo zypper removerepo "SLEHA-12-GEO"
用 zypper modifyrepo 启用或禁用储存库。您还可以用该命令更改储存库的属性(例如刷新行为、名称或优先级)。以下命令将会启用名为 updates 的储存库、打开自动刷新并将其优先级设置为 20:
tux > sudo zypper modifyrepo -er -p 20 'updates'修改储存库并不局限于单个储存库 — 您也可以对组执行该操作︰
-a:所有储存库 |
-l:本地储存库 |
-t:远程储存库 |
-m 类型:特定类型的储存库(其中类型可以是以下之一:http、https、ftp、cd、dvd、dir、file、cifs、smb、nfs、hd 和 iso) |
要重命名安装源别名,请使用 renamerepo 命令。以下示例将别名从 Mozilla Firefox 更改为 firefox:
tux > sudo zypper renamerepo 'Mozilla Firefox' firefoxZypper 提供各种查询储存库或包的方式。要获取所有可用的产品、模式、包或增补程序的列表,请使用以下命令:
tux >zypper productstux >zypper patternstux >zypper packagestux >zypper patches
要查询特定包的所有储存库,请使用 search。它用于包名称或(可选)包摘要和描述。括在 / 中的字符串会解译为正则表达式。默认情况下搜索不区分大小写。
fire 的包名称
tux > zypper search "fire"MozillaFirefox
tux > zypper search --match-exact "MozillaFirefox"tux > zypper search -d firetux > zypper search -u firefir 且该字符串后面不是 e 的包
tux > zypper se "/fir[^e]/"
要搜索提供特殊功能的包,请使用命令 what-provides。例如,如果您想知道哪个包提供 Perl 模块 SVN::Core,请使用以下命令:
tux > zypper what-provides 'perl(SVN::Core)'
要查询个别包,请使用 info 命令,并用完整包名称作为自变量。它会显示包的详细信息。如果还要显示该包必需/推荐的包,则使用选项 --requires 和 --recommends:
tux > zypper info --requires MozillaFirefox
what-provides 包与 rpm -q --whatprovides 包类似,不过 RPM 只能查询 RPM 数据库(即所有已安装的包的数据库)。另一方面,Zypper 将告诉您任意储存库的功能的提供商,而非仅已安装的储存库功能的提供商。
Zypper 现在随附配置文件,允许您永久更改 Zypper 的行为(系统范围或用户特定)。要进行系统范围更改,请编辑 /etc/zypp/zypper.conf。要进行用户特定的更改,请编辑 ~/.zypper.conf。如果 ~/.zypper.conf 尚不存在,您可以使用 /etc/zypp/zypper.conf 作为模板:将其复制到 ~/.zypper.conf 并根据您的喜好进行调整。请参见文件中的注释,获取有关可用选项的帮助。
如果您在访问配置的储存库中的包时遇到问题(例如,尽管您知道某个包在某个储存库中,但 Zypper 找不到该包),可使用以下命令刷新储存库:
tux > sudo zypper refresh如果不起作用,则尝试
tux > sudo zypper refresh -fdb这会强制完全刷新和重构建数据库,包括强制下载原始元数据。
如果根分区上使用的是 Btrfs 文件系统且系统中安装了 snapper,当 Zypper 提交对文件系统所做的更改以创建相应的文件系统快照时,会自动调用 snapper(通过 snapper 安装的脚本)。这些快照可用于还原 Zypper 执行的任何更改。有关详细信息,请参见第 6 章 “通过 Snapper 进行系统恢复和快照管理”。
有关从命令行管理软件的详细信息,请输入 zypper help、zypper help 命令,或参见 zypper(8) 手册页。有关完整详细的命令参考(包括最重要命令的备忘单)以及如何在脚本和应用程序中使用 Zypper 的信息,请参见 http://en.opensuse.org/SDB:Zypper_usage。SUSE Linux Enterprise Desktop 最新版本的软件更改列表可在 http://en.opensuse.org/openSUSE:Zypper versions 中找到。
RPM(RPM 程序包管理器)用于管理软件包。其主要程命令为 rpm 和 rpmbuild。用户、系统管理员和包构建人员可以查询强大的 RPM 数据库以获得有关已安装软件的详细信息。
本质上,rpm 有五种模式:安装、卸装(或更新)软件包、重构建 RPM 数据库、查询 RPM 库或独立 RPM 存档、包的完整性检查以及对包签名。rpmbuild 可用于从原始源构建可安装的包。
用特殊的二进制格式对可安装 RPM 存档进行打包。这些存档由要安装的程序文件和某些元信息组成,这些元信息供 rpm 在安装过程中配置软件包使用或者储存在 RPM 数据库中进行存档。RPM 存档通常具有扩展名 .rpm。
对于一些包,软件开发所需的组件(库、报头、包含文件等)已纳入独立的包中。只有当您要自己编译软件时才需要这些开发包(例如最新的 GNOME 包)。可以通过扩展名 -devel 确定这些开发包,例如包 alsa-devel 和 gimp-devel。
RPM 包具有 GPG 签名。要校验 RPM 程序包的签名,请使用命令 rpm --checksig 包-1.2.3.rpm 确定该包是源自 SUSE 还是另一个可信设备。特别建议对来自因特网的更新包使用此命令。
修复操作系统中的问题时,您可能需要将问题临时修复 (PTF) 安装到生产系统中。SUSE 提供的包已使用特殊的 PTF 密钥签名。但是,与 SUSE Linux Enterprise 11 不同,SUSE Linux Enterprise 12 系统上默认不会导入此密钥。要手动导入该密钥,请使用以下命令:
rpm --import /usr/share/doc/packages/suse-build-key/suse_ptf_key.asc
导入该密钥后,您可以在系统上安装 PTF 包。
通常,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 包。仅当不存在未解决的依赖性问题时,此命令才会删除包。例如,只要有其他程序需要 Tcl/Tk,理论上就不能删除它。即使是在这种情况下,RPM 也会向数据库寻求帮助。如果出于任何原因无法进行此删除操作(即使不存在其他依赖性),则最好使用选项 --rebuilddb 重构建 RPM 数据库。
增量 RPM 包包含旧版本和新版本的 RPM 包之间的差别。在旧 RPM 上应用增量 RPM 将得到全新的 RPM。不需要旧 RPM 的副本,因为增量 RPM 也可以与已安装的 RPM 一起工作。增量 RPM 包的大小甚至比增补程序 RPM 小,这有利于通过因特网传送更新包。缺点是,涉及增量 RPM 的更新操作与使用纯粹 RPM 或增补程序 RPM 进行更新的情况相比,占用的 CPU 周期要长得多。
makedeltarpm 和 applydelta 二进制文件是增量 RPM 套件(包 deltarpm)的一部分,可帮助您创建和应用增量 RPM 包。使用以下命令可以创建名为 new.delta.rpm 的增量 RPM。以下命令假设 old.rpm 和 new.rpm 是存在的:
makedeltarpm old.rpm new.rpm new.delta.rpm
如果旧包已经安装,则使用 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。
带 -q 选项的 rpm 将启动查询,如此用户便可查看 RPM 存档(通过添加选项 -p)并查询已安装包的 RPM 数据库。可以使用多个开关指定所需信息的类型。请参见表 5.1 “最重要的 RPM 查询选项”。
|
|
包信息 |
|
|
文件列表 |
|
|
查询包含文件 FILE 的包(必须使用 FILE 指定完整路径) |
|
|
带有状态信息的文件列表(间接指定 |
|
|
仅列出文档文件(间接指定 |
|
|
仅列出配置文件(间接指定 |
|
|
带有完整详细信息的文件列表(将用于 |
|
|
列出包中可被另一个包通过 |
|
|
包需要的功能 |
|
|
安装脚本(预安装、后安装、卸载) |
例如,命令 rpm -q -i wget 显示例 5.2 “rpm -q -i wget” 中所示的信息。
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 “搜索包的脚本”所示。当运行所显示的脚本时,将部分文件名以参数的形式碶u171 玕u181 礬u221 Y竆u248 o竆u195 A絓u197 A盶u190 綷u161 u163
#! /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 数据库,可以进行校验检查。使用 -V 或 --verify 启动这些检查。使用此选项,rpm 显示安装后已被更改的包中的所有文件。rpm 使用 8 个字符符号给出有关以下更改的一些提示:
|
|
MD5 校验和 |
|
|
文件大小 |
|
|
符号链接 |
|
|
修改时间 |
|
|
主要和次要设备编号 |
|
|
拥有者 |
|
|
组 |
|
|
方式(权限和文件类型) |
对于配置文件,将输出字母 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。
所有源包都带有 .src.rpm 扩展名(源 RPM)。
源包可以从安装媒体复制到硬盘并使用 YaST 解压缩。但是,在包管理器中它们不会被标记为已安装 ([i])。这是因为源包不是在 RPM 数据库中输入的。只有已安装的操作系统软件列在 RPM 数据库中。安装“源包时,只将源代码添加到系统中。”
以下目录必须可用于 /usr/src/packages 中的 rpm 和 rpmbuild(除非在诸如 /etc/rpmrc 这样的文件中指定自定义设置):
使用 YaST 安装源包时,将在 /usr/src/packages 中安装所有需要的组件:源和调整在 SOURCES 中,相关的 .spec 文件在 SPECS 中。
不要对系统组件(glibc、rpm 等)进行试验,因为这样做会影响系统的稳定性。
下面的示例使用 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 数据库中。
请记住,从 SLE12 及以上版本开始,规范文件中的 BuildRoot 指令已弃用。如果您仍然需要此功能,请使用 --buildroot 选项作为替代方法。有关更详细的背景信息,请参见 https://www.suse.com/support/kb/doc?id=7017104 上的支持数据库。
许多包存在的风险是构建进程中会将许多不需要的文件添加到正在运行的系统中。为防止发生这种情况,请使用 build,它将创建构建包的已定义环境。要建立这一 chroot 环境,build 脚本必须和完整的包树结构一起提供。可以通过 NFS 或从 DVD 使用硬盘上的此树。使用 build --rpms 目录设置位置。与 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 手册页来访问更多信息。
Midnight Commander (mc) 可以显示 RPM 存档的内容并复制部分内容。它将存档表示为虚拟文件系统,提供 Midnight Commander 所有常用的菜单选项。使用 F3 键显示 HEADER。使用光标键和 Enter 键查看存档结构。使用 F5 键复制部分存档。
拥有全部功能的包管理器将作为 YaST 模块提供。有关细节,请参见Chapter 8, Installing or Removing Software。