9 使用命令行工具管理软件 #
本章描述 Zypper 和 RPM,这是两个用于管理软件的命令行工具。有关此环境中所用术语的定义(例如,repository
、patch
或 update
),请参见第 8.1 节 “术语定义”。
9.1 使用 Zypper #
Zypper 是用于安装、更新和去除软件包的命令行软件包管理器。它还可管理储存库。这一点对于完成远程软件管理任务或从外壳脚本管理软件尤其有用。
9.1.1 一般使用 #
Zypper 的常用语法为:
zypper[--global-options]
COMMAND[--command-options]
[arguments]
不需要括在括号中的组件。有关常规选项和所有命令的列表,请参见 zypper
help
。要获取有关特定命令的帮助,请键入 zypper help
COMMAND。
- Zypper 命令
执行 Zypper 最简单的方式是,键入其名称后跟一个命令。例如,要将所有需要的补丁应用于系统,请使用:
>
sudo
zypper patch- 全局选项
此外,您还可以选择使用一个或多个全局选项,只需在命令前面键入它们即可:
>
sudo
zypper --non-interactive patch在上面的示例中,选项
--non-interactive
表示在不询问任何问题的情况下运行命令(自动应用默认答复)。- 命令特定的选项
要使用特定于某个命令的选项,请紧接在该命令后面键入这些选项:
>
sudo
zypper patch --auto-agree-with-licenses在上面的示例中,
--auto-agree-with-licenses
用于将所有需要的补丁应用于系统,不要求您确认任何许可条款,而是自动接受许可条款。- 参数
某些命令需要一个或多个参数。例如,使用
install
命令时,需要指定您要安装的一个或多个软件包:>
sudo
zypper install mplayer某些选项还需要单个参数。用以下命令可列出所有已知软件集:
>
zypper search -t pattern
您可以组合上述所有软件集。例如,下面的命令将在详细模式下安装 factory
储存库中的 mc 和 vim 软件包:
>
sudo
zypper -v install --from factory mc vim
--from
选项可在从指定储存库请求软件包时,使所有储存库都处于启用状态(以解决任何依赖性问题)。--repo
是 --from
的别名,您可以使用两者中的任何一个。
多数 Zypper 命令都有 dry-run
选项,它模拟给定的命令。它可用于测试。
>
sudo
zypper remove --dry-run MozillaFirefox
Zypper 支持 --userdata
STRING
全局选项。您可以使用此选项指定一个将会写入 Zypper 的日志文件和插件(例如 Btrfs 插件)的字符串。它可以用于标记和标识日志文件中的事务。
>
sudo
zypper --userdata STRING patch
9.1.2 使用 Zypper 子命令 #
Zypper 子命令是存储在 zypper_execdir
配置选项所指定的目录中的可执行文件。默认目录为 /usr/lib/zypper/commands
。如果在该位置找不到某个子命令,Zypper 会自动在其余 $PATH 位置搜索该子命令。这样,您便可以创建自己的本地扩展并将其存储在用户空间中。
不支持在 Zypper 外壳中执行子命令和使用全局 Zypper 选项。
列出可用的子命令:
>
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
log Zypper logfile reader
(/usr/sbin/zypper-log)
查看子命令的帮助屏幕:
>
zypper help appstream-cache
9.1.3 使用 Zypper 安装和去除软件 #
要安装或去除软件包,请使用以下命令:
>
sudo
zypper install PACKAGE_NAME>
sudo
zypper remove PACKAGE_NAME
不要去除必需的系统软件包,例如 glibc、zypper、kernel。如果去除这些包,系统可能会变得不稳定,或完全停止工作。
9.1.3.1 选择要安装或去除的软件包 #
使用 zypper install
和 zypper remove
命令时,可以通过多种方法找到软件包。
- 按确切的软件包名称
>
sudo
zypper install MozillaFirefox- 按确切的软件包名称和版本号
>
sudo
zypper install MozillaFirefox-52.2- 按储存库别名和软件包名称
>
sudo
zypper install mozilla:MozillaFirefox其中
mozilla
是用于安装的储存库别名。- 按使用通配符的软件包名称
您可以选择名称以特定字符串开头或结尾的所有软件包。使用通配符要小心,特别是去除软件包的时候。以下命令将安装名称以“Moz”开头的所有软件包:
>
sudo
zypper install 'Moz*'提示:去除所有-debuginfo
软件包在调试问题时,您有时需要临时安装大量的
-debuginfo
软件包,以获取有关正在运行的进程的详细信息。在调试会话完成后,如果您需要清理环境,请运行以下命令:>
sudo
zypper remove '*-debuginfo'- 按功能
例如,要安装不知道名称的软件包,这些功能就很有用。下面的命令将安装软件包 MozillaFirefox:
>
sudo
zypper install firefox- 按功能、硬件体系结构或版本
可以结合功能指定硬件体系结构和版本:
所需硬件体系结构的名称需要追加在功能的后面,两者以句点分隔。例如,要指定 AMD/Intel 64 体系结构(在 Zypper 中命名为
x86_64
_64),请使用:>
sudo
zypper install 'firefox.x86_64'版本必须追加到字符串的末尾,并且前面必须带有一个运算符:
<
(小于)、<=
(小于等于)、=
(等于)、>=
(大于等于)或>
(大于)。>
sudo
zypper install 'firefox>=74.2'还可以指定硬件体系结构与版本组合要求:
>
sudo
zypper install 'firefox.x86_64>=74.2'
- 按 RPM 文件的路径
您还可以指定软件包的本地或远程路径:
>
sudo
zypper install /tmp/install/MozillaFirefox.rpm>
sudo
zypper install http://download.example.com/MozillaFirefox.rpm
9.1.3.2 同时安装和去除软件包 #
要同时安装和去除软件包,请使用 +/-
修饰符。要安装 emacs 并同时去除 vim,请使用:
>
sudo
zypper install emacs -vim
要去除 emacs 并同时安装 vim,请使用:
>
sudo
zypper remove emacs +vim
为避免以 -
开头的软件包名称被解释为命令行选项,应始终将此类名称用作第二个参数。如果做不到这一点,请在名称前面加上 --
:
>
sudo
zypper install -emacs +vim # Wrong>
sudo
zypper install vim -emacs # Correct>
sudo
zypper install -- -emacs +vim # Correct>
sudo
zypper remove emacs +vim # Correct
9.1.3.3 清理已去除软件包的依赖项 #
如果想让系统在去除指定的软件包后自动去除不再需要的所有软件包,请使用 --clean-deps
选项:
>
sudo
zypper rm --clean-deps PACKAGE_NAME
9.1.3.4 在脚本中使用 Zypper #
默认情况下,在安装或删除选定软件包之前或发生问题时,Zypper 会要求确认。您可以使用 --non-interactive
选项覆盖此行为。必须在实际命令(install
、remove
和 patch
)的前面指定此选项,如下所示:
>
sudo
zypper--non-interactive
install PACKAGE_NAME
该选项允许在脚本和 cron 任务中使用 Zypper。
9.1.3.5 安装或下载源软件包 #
要安装某个软件包的对应源软件包,请使用:
>
zypper source-install PACKAGE_NAME
以 root
身份执行时,源软件包的默认安装位置为 /usr/src/packages/
;以普通用户身份运行时,则为 ~/rpmbuild
。可以在本地 rpm
配置中更改这些值。
使用此命令还会安装指定软件包的版本依赖项。如果不想执行此操作,请添加开关 -D
:
>
sudo
zypper source-install -D PACKAGE_NAME
要只安装版本依赖项,请使用 -d
。
>
sudo
zypper source-install -d PACKAGE_NAME
当然,只有当储存库列表中启用了含有源软件包的储存库时,才能这样做(默认添加但不启用它)。请参见第 9.1.6 节 “使用 Zypper 管理储存库” 了解有关储存库管理的细节。
可使用以下方法来获取储存库中所有源软件包的列表:
>
zypper search -t srcpackage
您也可以将所有已安装软件包的源软件包下载到本地目录。要下载源软件包,请使用:
>
zypper source-download
默认的下载目录是 /var/cache/zypper/source-download
。您可以使用 --directory
选项更改下载目录。若只想显示缺失或多余的软件包,而不下载或删除任何内容,请使用 --status
选项。要删除多余的源软件包,请使用 --delete
选项。要禁止删除,请使用 --no-delete
选项。
9.1.3.6 从禁用的储存库安装软件包 #
通常,您只能安装或刷新来自启用的储存库的软件包。--plus-content
TAG
选项可帮助您指定要刷新的、要在当前 Zypper 会话期间暂时启用的,以及要在会话完成后禁用的储存库。
例如,要启用可以提供其他 -debuginfo
或 -debugsource
软件包的储存库,请使用 --plus-content debug
。可以多次指定此选项。
要暂时启用此类“调试”储存库以安装特定的 -debuginfo
软件包,请按如下所示使用该选项:
>
sudo
zypper --plus-content debug \ install "debuginfo(build-id)=eb844a5c20c70a59fc693cd1061f851fb7d046f4"
对于缺少的 debuginfo 软件包,gdb
将会报告 build-id
字符串。
仍会配置 SUSE Linux Enterprise Desktop 安装媒体中的储存库,但成功安装后会禁用这些储存库。您可以使用 --plus-content
选项从安装媒体而不是联机储存库安装软件包。在调用 zypper
之前,请确保该媒体可用,例如,将 DVD 插入计算机的光驱中。
9.1.3.7 实用程序 #
要校验所有依赖项是否仍然满足,并修复缺少的依赖项,请使用:
>
zypper verify
除了依赖项必须满足外,某些软件包还“推荐”其他软件包。只有在实际可用并可安装时才会安装这些推荐软件包。如果推荐的软件包在推荐它们的软件包已安装(通过添加其他软件包或硬件)之后才可用,请使用以下命令:
>
sudo
zypper install-new-recommends
此命令在插入网络摄像头或 Wi-Fi 设备后非常有用。如果可用,它将安装设备驱动程序和相关软件。只有在满足特定硬件依赖项后,才可安装驱动程序和相关软件。
9.1.4 使用 Zypper 更新软件 #
用 Zypper 更新软件有三种方式:安装软件包、安装软件包的新版本或更新整个分发包。最后一种方式可通过 zypper
dist-upgrade
来实现。中介绍了如何升级 SUSE Linux Enterprise DesktopChapter 2, Upgrade paths and methods。
9.1.4.1 安装全部所需的补丁 #
要安装已安装软件包的新版本,最可靠的方式是修补 SUSE Linux Enterprise Desktop。这种方式可保证安装正确版本的所有必需软件包,并确保忽略被视为冲突的软件包版本。
要安装所有适用于您系统的正式发布的补丁,请运行:
>
sudo
zypper patch
系统将会检查您计算机上配置的储存库中提供的所有补丁是否与您的安装相关。如果相关(未分为 optional
或 feature
类别),则会立即安装这些补丁。如果 zypper patch
成功,便可确保不会安装带漏洞版本的软件包,除非您确认该例外。请注意,正式的更新储存库仅在注册 SUSE Linux Enterprise Desktop 安装后才可用。
如果即将安装的补丁所包含的更改要求重引导系统,您会在重引导前收到警告。
单纯使用 zypper patch
命令不会应用来自第三方储存库的软件包。要同时更新第三方储存库,请使用 with-update
命令选项,如下所示:
>
sudo
zypper patch --with-update
要额外安装可选补丁,请使用:
>
sudo
zypper patch --with-optional
要安装与特定 Bugzilla 问题相关的所有补丁,请使用:
>
sudo
zypper patch --bugzilla=NUMBER
要安装与特定 CVE 数据库项相关的所有补丁,请使用:
>
sudo
zypper patch --cve=NUMBER
例如,要安装 CVE 编号为 CVE-2010-2713
的安全补丁,请执行:
>
sudo
zypper patch --cve=CVE-2010-2713
如果只想安装影响 Zypper 和软件包管理本身的补丁,请使用:
>
sudo
zypper patch --updatestack-only
请记住,如果您使用了 updatestack-only
命令选项,将会丢弃原本还会更新其他储存库的其他命令选项。
9.1.4.2 列出补丁 #
为了让您确定补丁是否可用,Zypper 允许您查看以下信息:
- 所需补丁的数目
要列出所需补丁(适用于您的系统但尚未安装的补丁)的数目,请使用
patch-check
:>
zypper patch-check Loading repository data... Reading installed packages... 5 patches needed (1 security patch)可以结合
--updatestack-only
选项使用此命令,以便仅列出影响 Zypper 和软件包管理本身的补丁。- 所需补丁的列表
要列出全部所需的补丁(适用于您的系统但尚未安装的补丁),请使用
zypper list-patches
。- 所有补丁的列表
要列出 SUSE Linux Enterprise Desktop 可用的所有补丁,而不管它们是否已安装或适用于您的安装,请使用
zypper patches
。
还可以列出并安装与特定问题相关的补丁。要列出特定的补丁,请使用带以下选项的 zypper
list-patches
命令:
- 按 Bugzilla 问题
要列出与 Bugzilla 问题相关的全部所需补丁,请使用
--bugzilla
选项。要列出针对特定 Bug 的补丁,您也可以指定 Bug 编号:
--bugzilla=NUMBER
。要搜索与多个 Bugzilla 问题相关的补丁,请在 bug 编号之间添加逗号,例如:>
zypper list-patches --bugzilla=972197,956917- 按 CVE 编号
要列出与 CVE(公共漏洞和披露)数据库中某一项相关的全部所需补丁,请使用
--cve
选项。要列出针对特定 CVE 数据库项的补丁,您也可以指定 CVE 编号:
--cve=NUMBER
。要搜索与多个 CVE 数据库项相关的补丁,请在 CVE 编号之间添加逗号,例如:>
zypper list-patches --cve=CVE-2016-2315,CVE-2016-2324- 列出已撤回的补丁
在 SUSE Linux Enterprise 15 代码流中,一些补丁可自动撤回。维护更新会经过仔细测试,因为更新有可能包含新的 Bug。如果发现某个补丁包含 bug,将会发布一个新的更新(版本号更高)以还原有 bug 的更新,并会阻止再次安装有 bug 的更新。您可以使用
zypper
列出已撤回的补丁:>
zypper lp --all |grep retracted
SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-1965 | recommended | important | --- | retracted | Recommended update for multipath-tools SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-2689 | security | important | --- | retracted | Security update for cpio SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-3655 | security | important | reboot | retracted | Security update for the Linux Kernel查看有关已撤回(或任何)补丁的完整信息:
>
zypper patch-info SUSE-SLE-Product-SLES-15-2021-2689
Loading repository data... Reading installed packages... Information for patch SUSE-SLE-Product-SLES-15-2021-2689: --------------------------------------------------------- Repository : SLE-Product-SLES15-LTSS-Updates Name : SUSE-SLE-Product-SLES-15-2021-2689 Version : 1 Arch : noarch Vendor : maint-coord@suse.de Status : retracted Category : security Severity : important Created On : Mon 16 Aug 2021 03:44:00 AM PDT Interactive : --- Summary : Security update for cpio Description : This update for cpio fixes the following issues: It was possible to trigger Remote code execution due to a integer overflow (CVE-2021-38185, bsc#1189206) UPDATE: This update was buggy and could lead to hangs, so it has been retracted. There will be a follow up update. [...]- 具有冲突软件包的补丁
Information for patch openSUSE-SLE-15.3-2022-333: ------------------------------------------------- Repository : Update repository with updates from SUSE Linux Enterprise 15 Name : openSUSE-SLE-15.3-2022-333 Version : 1 Arch : noarch Vendor : maint-coord@suse.de Status : needed Category : security Severity : important Created On : Fri Feb 4 09:30:32 2022 Interactive : reboot Summary : Security update for xen Description : This update for xen fixes the following issues: - CVE-2022-23033: Fixed guest_physmap_remove_page not removing the p2m mappings. (XSA-393) (bsc#1194576) - CVE-2022-23034: Fixed possible DoS by a PV guest Xen while unmapping a grant. (XSA-394) (bsc#1194581) - CVE-2022-23035: Fixed insufficient cleanup of passed-through device IRQs. (XSA-395) (bsc#1194588) Provides : patch:openSUSE-SLE-15.3-2022-333 = 1 Conflicts : [22] xen.src < 4.14.3_06-150300.3.18.2 xen.noarch < 4.14.3_06-150300.3.18.2 xen.x86_64 < 4.14.3_06-150300.3.18.2 xen-devel.x86_64 < 4.14.3_06-150300.3.18.2 xen-devel.noarch < 4.14.3_06-150300.3.18.2 [...]
上面的补丁与 22 个软件包的受影响或带漏洞版本冲突。如果安装了这些受影响或带漏洞软件包中的任何一个,将会触发冲突,并且补丁会归为需要类别。
zypper patch
会尝试安装所有可用的补丁。如果遇到问题,它会报告这些问题,以告知您并非所有更新都已安装。可以通过更新受影响或带漏洞软件包或者去除这些软件包来解决冲突。由于 SUSE 更新储存库也提供固定的软件包,因此更新是解决冲突的标准方法。例如,如果由于依赖关系问题或软件包锁定而无法更新软件包,则会在用户批准后将其删除。
要列出所有补丁而不考虑是否需要安装它们,另外还需使用 --all
选项。例如,要列出指派有 CVE 编号的所有补丁,请使用:
>
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
[...]
9.1.4.3 安装新的软件包版本 #
如果某个安装源只包含新软件包,但未提供补丁,则 zypper patch
不会产生任何作用。要将所有已安装的软件包更新为较新的可用版本,请使用以下命令:
>
sudo
zypper update
zypper update
会忽略有问题的软件包。例如,如果某个软件包被锁定,即使该软件包有更高的版本可用,zypper update
也会忽略该软件包。相反,如果软件包被视为带漏洞,zypper patch
会报告冲突。
要更新个别软件包,请用更新或安装命令指定软件包:
>
sudo
zypper update PACKAGE_NAME>
sudo
zypper install PACKAGE_NAME
可使用此命令来获取所有新的可安装软件包的列表:
>
zypper list-updates
请注意,此命令只会列出符合以下准则的软件包:
与已安装的软件包拥有相同的供应商,
由至少与已安装软件包拥有相同优先级的储存库提供,
可安装(满足所有依赖项)。
所有新的可用软件包(无论是否可安装)的列表可通过以下方式获取:
>
sudo
zypper list-updates --all
要确定无法安装新软件包的原因,请使用上面所述的 zypper
install
或 zypper update
命令。
9.1.4.4 识别孤立的软件包 #
每当您从 Zypper 中去除某个储存库或者升级系统时,某些软件包可能会进入“孤立”状态。这些孤立的软件包不再属于任何活动储存库。以下命令可以列出这些软件包:
>
sudo
zypper packages --orphaned
借助此列表,您可以确定是否仍然需要某个软件包,或者是否可以安全去除某个软件包。
9.1.5 识别使用已删除文件的进程和服务 #
在修补、更新或去除软件包时,系统上可能有一些正在运行的进程仍在使用已被更新或去除操作删除的文件。运行 zypper ps
可以列出使用已删除文件的进程。如果此类进程属于某个已知的服务,则会列出服务名称,方便您重启动该服务。默认情况下,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 |
登录:运行进程的用户的登录名 |
命令:用于执行进程的命令 |
服务:服务名称(仅当命令与系统服务关联时) |
文件:已删除文件的列表 |
通过如下方式可控制 zypper ps
的输出格式:
zypper ps
-s
创建一份简短表格,其中不会显示已删除的文件。
>
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
有关服务处理的详细信息,请参见第 19 章 “systemd
守护程序”。
9.1.6 使用 Zypper 管理储存库 #
Zypper 的所有安装或补丁命令均基于已知储存库列表。要列出系统已知的所有储存库,请使用命令:
>
zypper repos
结果将类似于与以下输出:
>
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 或优先级之类的细节。用以下命令可以列出所有细节:
>
zypper repos -d
9.1.6.1 添加储存库 #
要添加储存库,请运行
>
sudo
zypper addrepo URI ALIAS
URI 可以是互联网储存库、网络资源、目录、CD 或 DVD(有关细节请参见 https://en.opensuse.org/openSUSE:Libzypp_URIs)。ALIAS 是储存库的唯一简写标识符。您可以随意选择别名,前提是它必须唯一。如果指定的别名已在使用,Zypper 将发出警告。
9.1.6.2 刷新储存库 #
zypper
可让您从配置的储存库中提取软件包的更改。要提取更改,请运行:
>
sudo
zypper refresh
zypper
的默认行为
有些命令默认会自动执行 refresh
,因此您不需要明确运行该命令。
将 refresh
命令与 --plus-content
选项搭配使用时,还可查看已禁用储存库中的更改:
>
sudo
zypper --plus-content refresh
该选项虽然会提取储存库中的更改,但会使禁用储存库的状态保持不变,即仍为禁用。
9.1.6.3 去除储存库 #
要从列表中去除某个储存库,请将命令 zypper
removerepo
与要删除的储存库的别名或编号结合使用。例如,要从例 9.1 “Zypper — 已知储存库的列表”中去除储存库 SLEHA-12-GEO
,请使用下列命令之一:
>
sudo
zypper removerepo 1>
sudo
zypper removerepo "SLEHA-12-GEO"
9.1.6.4 修改储存库 #
使用 zypper modifyrepo
可以启用或禁用储存库。您还可以用该命令更改储存库的属性(例如刷新行为、名称或优先级)。以下命令将会启用名为 updates
的储存库、打开自动刷新并将其优先级设置为 20:
>
sudo
zypper modifyrepo -er -p 20 'updates'
修改储存库并不局限于单个储存库 — 您也可以对组执行该操作:
-a :所有储存库 |
-l :本地储存库 |
-t :远程储存库 |
-m TYPE :特定类型的储存库(其中 TYPE 可以是以下之一:http 、https 、ftp 、cd 、dvd 、dir 、file 、cifs 、smb 、nfs 、hd 、iso ) |
要重命名储存库别名,请使用 renamerepo
命令。以下示例将别名从 Mozilla
Firefox
更改为 firefox
:
>
sudo
zypper renamerepo 'Mozilla Firefox' firefox
9.1.7 使用 Zypper 查询储存库和软件包 #
Zypper 提供各种查询储存库或软件包的方式。要获取所有可用的产品、软件集、软件包或补丁的列表,请使用以下命令:
>
zypper products>
zypper patterns>
zypper packages>
zypper patches
要查询特定软件包的所有储存库,请使用 search
。要获得有关特定软件包的信息,请使用 info
命令。
9.1.7.1 搜索软件 #
zypper search
命令可按软件包名称或选择性按软件包摘要和说明执行搜索。用 /
括住的字符串会解译为正则表达式。默认情况下搜索不区分大小写。
- 执行简单搜索来查找包含
fire
的软件包名称 >
zypper search "fire"- 执行简单搜索来查找确切的软件包
MozillaFirefox
>
zypper search --match-exact "MozillaFirefox"- 同时在包描述和摘要中搜索
>
zypper search -d fire- 仅显示尚未安装的软件包
>
zypper search -u fire- 显示包含字符串
fir
且该字符串后面不是e
的软件包 >
zypper se "/fir[^e]/"
9.1.7.2 在所有 SLE 模块中搜索软件包 #
要搜索当前已启用的 SLE 模块内部和外部的软件包,请使用 search-packages
子命令。此命令会联系 SUSE Customer Center,并在所有模块中搜索匹配的包,例如:
>
zypper search-packages package1 package2
zypper search-packages
提供以下选项:
搜索与您的搜索字符串完全匹配的软件包:
-x
、--match-exact
按模块对结果进行分组(默认:按软件包分组):
-g,
--group-by-module
显示有关软件包的更多详细信息:
-d
、--details
以 XML 格式输出搜索结果:
--xmlout
9.1.7.3 搜索特定功能 #
要搜索提供特殊功能的软件包,请使用命令 what-provides
。例如,如果您想知道哪个软件包提供 Perl 模块 SVN::Core
,请使用以下命令:
>
zypper what-provides 'perl(SVN::Core)'
what-provides
PACKAGE_NAME
与 rpm -q --whatprovides
PACKAGE_NAME 类似,不过 RPM 只能查询 RPM 数据库(即所有已安装的软件包的数据库)。另一方面,Zypper 将告诉您任意储存库的功能的提供商,而非仅已安装的储存库功能的提供商。
9.1.7.4 显示软件包信息 #
要查询个别软件包,请使用 info
命令,并用完整软件包名称作为参数。这会显示有关某个软件包的详细信息。如果软件包名与储存库中的所有软件包名都不匹配,该命令会输出非软件包匹配项的详细信息。如果您请求特定类型(使用 -t
选项),但该类型不存在,该命令会输出其他可用的匹配项,但不提供详细信息。
如果您指定源软件包,该命令会显示基于该源软件包构建的二进制软件包。如果您指定二进制软件包,该命令会输出用来构建该二进制软件包的源软件包。
如果还想显示该软件包所需/推荐的软件包,则使用选项 --requires
和 --recommends
:
>
zypper info --requires MozillaFirefox
9.1.8 显示生命周期信息 #
SUSE 产品的支持周期一般为 10 年。通常,您可以使用 SUSE 的延长支持产品将标准生命周期延长三年。根据您的产品,在 https://www.suse.com/lifecycle 中找到具体的支持生命周期。
要检查您的产品和所支持软件包的生命周期,请如下所示使用 zypper lifecycle
命令:
#
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
9.1.9 配置 Zypper #
Zypper 现在随附配置文件,允许您永久更改 Zypper 的行为(系统范围或用户特定)。要进行系统范围更改,请编辑 /etc/zypp/zypper.conf
。要进行用户相关的更改,请编辑 ~/.zypper.conf
。如果 ~/.zypper.conf
尚不存在,您可以使用 /etc/zypp/zypper.conf
作为模板:将其复制到 ~/.zypper.conf
并根据您的喜好进行调整。请参见文件中的注释,获取有关可用选项的帮助。
9.1.10 查错 #
如果您在访问配置的储存库中的软件包时遇到问题(例如,尽管您知道某个软件包在某个储存库中,但 Zypper 找不到该软件包),刷新储存库或许可以解决问题:
>
sudo
zypper refresh
如果不起作用,则尝试
>
sudo
zypper refresh -fdb
这会强制完全刷新和重构建数据库,包括强制下载原始元数据。
9.1.11 Btrfs 文件系统上的 Zypper 回滚功能 #
如果根分区上使用的是 Btrfs 文件系统,且系统中安装了 snapper
,当 Zypper 提交对文件系统所做的更改时会自动调用 snapper
,以创建相应的文件系统快照。这些快照可用于还原 Zypper 进行的任何更改。有关更多信息,请参见第 10 章 “使用 Snapper 进行系统恢复和快照管理”。
9.1.12 更多信息 #
有关从命令行管理软件的详细信息,请输入 zypper help
、zypper help
COMMAND,或参见 zypper(8)
手册页。有关详尽的命令参考、最重要的命令的 cheat sheets
,以及如何在脚本和应用程序中使用 Zypper 的信息,请参见 https://en.opensuse.org/SDB:Zypper_usage。SUSE Linux Enterprise Desktop 最新版本的软件更改列表可在 https://en.opensuse.org/openSUSE:Zypper_versions 中找到。
9.2 RPM - 软件包管理器 #
RPM(RPM 软件包管理器)用于管理软件包。主要命令为 rpm
和 rpmbuild
。用户、系统管理员和软件包构建人员可以查询强大的 RPM 数据库以获得有关已安装软件的详细信息。
rpm
有五种模式:安装、卸装(或更新)软件包、重构建 RPM 数据库、查询 RPM 库或独立 RPM 存档、对软件包执行完整性检查以及对软件包签名。rpmbuild
可用于从原始源构建可安装的软件包。
用特殊的二进制格式对可安装 RPM 存档进行打包。这些存档中包含要安装的程序文件,以及供 rpm
用于在安装过程中配置软件包或者存储在 RPM 数据库中以作记录的某些元信息。RPM 存档的扩展名通常为 .rpm
。
对于数个软件包,软件开发所需的组件(库、标题、包含文件等)已分别封装在不同的软件包中。只有当您要自己编译软件时才需要这些开发包(例如最新的 GNOME 软件包)。通过扩展名 -devel
即可识别这些开发包,例如软件包 alsa-devel
和 gimp-devel
。
9.2.1 校验软件包真实性 #
RPM 软件包具有 GPG 签名。要校验 RPM 软件包的签名,请使用 rpm --checksig
PACKAGE-1.2.3.rpm 命令确定该软件包是来自 SUSE 还是另一个可信机构。特别建议对来自互联网的更新软件包使用此命令。
修复操作系统中的问题时,您可能需要将问题临时修复 (PTF) 安装到生产系统中。SUSE 提供的软件包已使用特殊的 PTF 密钥签名。但是,与 SUSE Linux Enterprise 11 不同,SUSE Linux Enterprise 12 系统上默认不会导入此密钥。要手动导入该密钥,请使用以下命令:
>
sudo
rpm --import \ /usr/share/doc/packages/suse-build-key/suse_ptf_key.asc
导入该密钥后,您可以在系统上安装 PTF 软件包。
9.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。仅当不存在未解决的依赖项问题时,此命令才会删除软件包。例如,只要有其他程序需要 Tcl/Tk,理论上就不能删除它。即使是在这种情况下,RPM 也会向数据库寻求帮助。如果出于某种原因无法执行此类删除操作(即使不存在其他依赖性问题),或许可以使用选项 --rebuilddb
来重构建 RPM 数据库。
9.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
都存在:
>
sudo
makedeltarpm old.rpm new.rpm new.delta.rpm
如果旧软件包已经安装,则使用 applydeltarpm
可以从文件系统重新构建新的 RPM:
>
sudo
applydeltarpm new.delta.rpm new.rpm
要从旧 RPM 产生新 RPM 而不访问文件系统,请使用 -r
选项:
>
sudo
applydeltarpm -r old.rpm new.delta.rpm new.rpm
有关技术细节,请参见 /usr/share/doc/packages/deltarpm/README
。
9.2.4 RPM查询 #
带 -q
选项的 rpm
会启动查询,如此用户便可检查 RPM 存档(通过添加选项 -p
)并查询已安装软件包的 RPM 数据库。可以使用多个开关指定所需信息的类型。请参见表 9.1 “基本 RPM 查询选项”。
|
软件包信息 |
|
文件列表 |
|
查询包含文件 FILE 的软件包(必须使用 FILE 指定完整路径) |
|
包含状态信息的文件列表(隐含 |
|
仅列出文档文件(隐含 |
|
仅列出配置文件(隐含 |
|
包含完整详细信息的文件列表(与 |
|
列出另一个软件包可通过 |
|
软件包需要的功能 |
|
安装脚本(预安装、后安装、卸载) |
例如,命令 rpm -q -i wget
可显示例 9.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 15
只有当您指定带有完整路径的完整文件名时,选项 -f
才起作用。根据需要提供任意多个文件名。例如:
>
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
如果只知道部分文件名,则可以使用外壳脚本,如例 9.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
使用八位字符符号来提供有关以下更改的提示:
|
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。
9.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.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
选项作为替代方案。
9.2.6 使用 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
手册页。
9.2.7 用于 RPM 存档和 RPM 数据库的工具 #
Midnight Commander (mc
) 可以显示 RPM 存档的内容并复制部分内容。它将存档表示为虚拟文件系统,提供 Midnight Commander 所有常用的菜单选项。使用 F3 键可显示 HEADER
。使用光标键和 Enter 键查看存档结构。使用 F5 键复制部分存档。
拥有全部功能的软件包管理器将作为 YaST 模块提供。有关详细信息,请参见第 8 章 “安装或去除软件”。