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-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 字符串
全局选项。您可以使用此选项指定一个将会写入 Zypper 的日志文件和插件(例如 Btrfs 插件)的字符串。它可以用于标记和标识日志文件中的事务。
tux >
sudo zypper --userdata STRING patch
6.1.2 使用 Zypper 安装和删除软件 #
要安装或去除包,请使用以下命令:
tux >
sudo zypper install PACKAGE_NAME
sudo zypper remove PACKAGE_NAME
不要去除必需的系统包,例如 glibc 、 zypper 、 kernel 。如果去除这些包,系统可能会变得不稳定,或完全停止工作。
6.1.2.1 选择要安装或去除的包 #
可以使用 zypper install
和 zypper 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.rpmtux >
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 # Wrongtux >
sudo zypper install vim -emacs # Correcttux >
sudo zypper install -- -emacs +vim # Correcttux >
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
选项覆盖此行为。必须在实际命令(install
、remove
和 patch
)的前面指定此选项,如下所示:
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 install
或 zypper 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
结果将类似于与以下输出:
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 1tux >
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 类型 :特定类型的储存库(其中类型可以是以下之一:http 、https 、ftp 、cd 、dvd 、dir 、file 、cifs 、smb 、nfs 、hd 和 iso ) |
要重命名安装源别名,请使用 renamerepo
命令。以下示例将别名从 Mozilla Firefox
更改为 firefox
:
tux >
sudo zypper renamerepo 'Mozilla Firefox' firefox
6.1.6 用 Zypper 查询储存库和包 #
Zypper 提供各种查询储存库或包的方式。要获取所有可用的产品、模式、包或增补程序的列表,请使用以下命令:
tux >
zypper productstux >
zypper patternstux >
zypper packagestux >
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 help
、zypper 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 程序包管理器)用于管理软件包。其主要程命令为 rpm
和 rpmbuild
。用户、系统管理员和包构建人员可以查询强大的 RPM 数据库以获得有关已安装软件的详细信息。
本质上,rpm
有五种模式:安装、卸装(或更新)软件包、重构建 RPM 数据库、查询 RPM 库或独立 RPM 存档、包的完整性检查以及对包签名。rpmbuild
可用于从原始源构建可安装的包。
用特殊的二进制格式对可安装 RPM 存档进行打包。这些存档由要安装的程序文件和某些元信息组成,这些元信息供 rpm
在安装过程中配置软件包使用或者储存在 RPM 数据库中进行存档。RPM 存档通常具有扩展名 .rpm
。
对于一些包,软件开发所需的组件(库、报头、包含文件等)已纳入独立的包中。只有当您要自己编译软件时才需要这些开发包(例如最新的 GNOME 包)。可以通过扩展名 -devel
确定这些开发包,例如包 alsa-devel
和 gimp-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 周期要长得多。
makedeltarpm
和 applydelta
二进制文件是增量 RPM 套件(包 deltarpm
)的一部分,可帮助您创建和应用增量 RPM 包。使用以下命令可以创建名为 new.delta.rpm
的增量 RPM。以下命令假设 old.rpm
和 new.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 查询选项”。
|
包信息 |
|
文件列表 |
|
查询包含文件 FILE 的包(必须使用 FILE 指定完整路径) |
|
带有状态信息的文件列表(间接指定 |
|
仅列出文档文件(间接指定 |
|
仅列出配置文件(间接指定 |
|
带有完整详细信息的文件列表(将用于 |
|
列出包中可被另一个包通过 |
|
包需要的功能 |
|
安装脚本(预安装、后安装、卸载) |
例如,命令 rpm -q -i wget
显示例 6.2 “rpm -q -i wget
” 中所示的信息。
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 “搜索包的脚本”所示。当运行所显示的脚本时,将部分文件名以参数的形式传递给脚本。
#! /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
PACKAGE 命令会按日期排序显示有关特定包的详细更改信息列表。
借助已安装的 RPM 数据库,可以进行校验检查。使用 -V
或 --verify
启动这些检查。使用此选项,rpm
显示安装后已被更改的包中的所有文件。rpm
使用 8 个字符符号给出有关以下更改的一些提示:
|
MD5 校验和 |
|
文件大小 |
|
符号链接 |
|
修改时间 |
|
主要和次要设备编号 |
|
拥有者 |
|
组 |
|
方式(权限和文件类型) |
对于配置文件,将输出字母 c
。例如,对于 /etc/wgetrc
(wget
包)的更改:
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
中的 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
中。
不要对系统组件(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 数据库中。
请记住,从 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 章 “安装或删除软件”。