Zypper 是一个命令行软件包管理器,用于安装、更新和删除软件包。它还管理仓库。它特别适用于完成远程软件管理任务或从 shell 脚本管理软件。
Zypper 的通用语法是
zypper[--global-options]COMMAND[--command-options][arguments]
用方括号括起来的组件不是必需的。请参阅 zypper help 以获取常规选项和所有命令的列表。要获取特定命令的帮助,请键入 zypper help COMMAND。
执行 Zypper 的最简单方法是键入其名称,后跟一个命令。例如,要应用所有需要的补丁到系统,请使用
>sudozypper patch
此外,您可以选择一个或多个全局选项,方法是在命令之前键入它们
>sudozypper --non-interactive patch
在上面的示例中,选项 --non-interactive 表示该命令在不询问任何内容的情况下运行(自动应用默认答案)。
要使用特定于特定命令的选项,请在命令之后键入它们
>sudozypper patch --auto-agree-with-licenses
在上面的示例中,--auto-agree-with-licenses 用于将所有需要的补丁应用于系统,而无需您确认任何许可证。相反,许可证将自动接受。
某些命令需要一个或多个参数。例如,在使用 install 命令时,需要指定要 安装哪个软件包或哪些软件包
>sudozypper install mplayer
某些选项也需要一个参数。以下命令将列出所有已知的模式
> zypper search -t pattern您可以组合以上所有内容。例如,以下命令将从 factory 仓库安装 mc 和 vim 软件包,同时显示详细信息
>sudozypper -v install --from factory mc vim
选项 --from 会保留所有启用的仓库(用于解决任何依赖关系),同时从指定的仓库请求软件包。--repo 是 --from 的别名,您可以使用任一个。
大多数 Zypper 命令都有一个 dry-run 选项,该选项会对给定的命令进行模拟。它可以用于测试目的。
>sudozypper remove --dry-run MozillaFirefox
Zypper 支持全局 --userdata STRING 选项。您可以使用此选项指定一个字符串,该字符串将被写入 Zypper 的日志文件和插件(例如 Btrfs 插件)。它可以用于标记和识别日志文件中的事务。
>sudozypper --userdata STRING patch
Zypper 子命令是存储在 zypper_execdir 配置选项指定的目录中的可执行文件。默认情况下是 /usr/lib/zypper/commands。如果未在此处找到子命令,Zypper 会自动在您的 $PATH 位置的其余位置搜索它。这使您可以创建自己的本地扩展并将它们存储在用户空间中。
在 Zypper shell 中执行子命令以及使用全局 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要安装或删除软件包,请使用以下命令
>sudozypper install PACKAGE_NAME>sudozypper remove PACKAGE_NAME
不要删除强制系统软件包,如 glibc 、 zypper 、 kernel。如果删除它们,系统可能会变得不稳定或完全停止工作。
有多种方法可以使用 zypper install 和 zypper remove 命令来引用软件包。
>sudozypper install MozillaFirefox
>sudozypper install MozillaFirefox-52.2
>sudozypper install mozilla:MozillaFirefox
其中 mozilla 是要从中安装的仓库的别名。
您可以选择名称以特定字符串开头或结尾的所有软件包。小心使用通配符,尤其是在删除软件包时。以下命令将安装所有以 “Moz” 开头的软件包
>sudozypper install 'Moz*'
-debuginfo 软件包在调试问题时,有时需要临时安装许多 -debuginfo 软件包,这些软件包为您提供有关正在运行的进程的更多信息。调试会话完成后,需要清理环境,请运行以下命令
>sudozypper remove '*-debuginfo'
例如,要在不知道其名称的情况下安装软件包,功能就派上用场。以下命令将安装 MozillaFirefox 软件包
>sudozypper install firefox
与功能一起,您可以指定硬件架构和版本
所需的硬件架构的名称附加到功能之后,用句点分隔。例如,要指定 AMD64/Intel 64 架构(在 Zypper 中命名为 x86_64),请使用
>sudozypper install 'firefox.x86_64'
版本必须附加到字符串的末尾,并且必须以运算符为前缀:<(小于)、<=(小于或等于)、=(等于)、>=(大于或等于)、>(大于)。
>sudozypper install 'firefox>=74.2'
您可以组合硬件架构和版本要求
>sudozypper install 'firefox.x86_64>=74.2'
您还可以指定本地或远程路径到软件包
>sudozypper install /tmp/install/MozillaFirefox.rpm>sudozypper install http://download.example.com/MozillaFirefox.rpm
要同时安装和删除软件包,请使用 +/- 修饰符。要安装 emacs 并同时删除 vim,请使用
>sudozypper install emacs -vim
要删除 emacs 并同时安装 vim,请使用
>sudozypper remove emacs +vim
为了防止以 - 开头的软件包名称被解释为命令选项,请始终将其用作第二个参数。如果这不可能,请在它前面加上 --
>sudozypper install -emacs +vim # Wrong>sudozypper install vim -emacs # Correct>sudozypper install -- -emacs +vim # Correct>sudozypper remove emacs +vim # Correct
如果(与某个软件包一起),您希望自动删除在删除指定软件包后变得不再需要的任何软件包,请使用 --clean-deps 选项
>sudozypper rm --clean-deps PACKAGE_NAME
默认情况下,Zypper 在安装或删除选定的软件包或发生问题时会要求确认。您可以使用 --non-interactive 选项覆盖此行为。此选项必须在实际命令(install、remove 和 patch)之前给出,如以下所示
>sudozypper--non-interactiveinstall PACKAGE_NAME
此选项允许在脚本和 cron 作业中使用 Zypper。
要安装相应软件包的源软件包,请使用
> zypper source-install PACKAGE_NAME当以 root 身份执行时,安装源软件包的默认位置是 /usr/src/packages/,以用户身份运行时是 ~/rpmbuild。这些值可以在您的本地 rpm 配置中更改。
此命令还将安装指定软件包的构建依赖项。如果您不希望这样做,请添加开关 -D
>sudozypper source-install -D PACKAGE_NAME
要仅安装构建依赖项,请使用 -d。
>sudozypper source-install -d PACKAGE_NAME
当然,只有在您的仓库列表中启用了包含源软件包的仓库时,这才会起作用(默认情况下已添加,但未启用)。有关仓库管理的详细信息,请参阅 第 2.1.6 节,“使用 Zypper 管理仓库”。
可以获得您的仓库中所有可用源软件包的列表
> zypper search -t srcpackage您还可以将所有已安装软件包的源软件包下载到本地目录。要下载源软件包,请使用
> zypper source-download默认下载目录是 /var/cache/zypper/source-download。您可以使用 --directory 选项进行更改。要仅显示缺失或多余的软件包而不下载或删除任何内容,请使用 --status 选项。要删除多余的源软件包,请使用 --delete 选项。要禁用删除,请使用 --no-delete 选项。
通常,您只能从启用的仓库安装或刷新软件包。选项 --plus-content TAG 可帮助您指定要在当前 Zypper 会话期间临时启用并完成之后禁用的仓库。
例如,要启用可能提供额外的 -debuginfo 或 -debugsource 软件包的仓库,请使用 --plus-content debug。您可以多次指定此选项。
要临时启用这些“debug”仓库以安装特定的 -debuginfo 软件包,请按如下所示使用该选项
>sudozypper --plus-content debug \ install "debuginfo(build-id)=eb844a5c20c70a59fc693cd1061f851fb7d046f4"
字符串 build-id 由 gdb 为缺失的 debuginfo 软件包报告。
来自 openSUSE Leap 安装介质的仓库在成功安装后仍然配置为禁用。您可以使用 --plus-content 选项从安装介质而不是在线仓库安装软件包。在调用 zypper 之前,请确保介质可用,例如通过将 DVD 插入计算机的驱动器。
使用 Zypper 更新软件有三种不同的方法:安装补丁、安装软件包的新版本或更新整个发行版。后者通过 zypper dist-upgrade 实现。升级 openSUSE Leap 的讨论见 “入门”一书,第 12 章“系统升级和系统更改”。
打补丁 openSUSE Leap 是安装已安装软件包新版本的最可靠方法。它保证安装所有必需的软件包及其正确版本,并确保被视为 冲突 的软件包版本被省略。
要安装适用于您的系统所有官方发布的补丁,请运行
>sudozypper patch
将检查配置在您计算机上的存储库中可用的所有补丁,以确定其与您的安装的相关性。如果它们相关(且未分类为 optional 或 feature),则会立即安装它们。如果 zypper patch 成功,则保证除非您确认例外情况,否则不会安装任何易受攻击版本的软件包。
如果即将安装的补丁包含需要系统重新启动的更改,您将在安装前收到警告。
普通的 zypper patch 命令不应用来自第三方存储库的补丁。要更新第三方存储库,请使用以下 with-update 命令选项
>sudozypper patch --with-update
要安装可选补丁,请使用
>sudozypper patch --with-optional
要安装与特定 Bugzilla 问题相关的所有补丁,请使用
>sudozypper patch --bugzilla=NUMBER
要安装与特定 CVE 数据库条目相关的所有补丁,请使用
>sudozypper patch --cve=NUMBER
例如,要安装具有 CVE 编号 CVE-2010-2713 的安全补丁,请执行
>sudozypper patch --cve=CVE-2010-2713
要仅安装影响 Zypper 和软件包管理本身的补丁,请使用
>sudozypper patch --updatestack-only
请记住,如果您使用 updatestack-only 命令选项,将放弃更新其他存储库的其他命令选项。
为了确定是否有补丁可用,Zypper 允许查看以下信息
要列出所需补丁的数量(适用于您的系统但尚未安装的补丁),请使用 patch-check
> zypper patch-check
Loading repository data...
Reading installed packages...
5 patches needed (1 security patch)可以将此命令与 --updatestack-only 选项结合使用,以仅列出影响 Zypper 和软件包管理本身的补丁。
要列出所有所需补丁(适用于您的系统但尚未安装的补丁),请使用 zypper list-patches。
要列出适用于 openSUSE Leap 的所有补丁,无论它们是否已安装或适用于您的安装,请使用 zypper patches。
也可以列出并安装与特定问题相关的补丁。要列出特定补丁,请使用 zypper list-patches 命令,并使用以下选项
要列出与 Bugzilla 问题相关的所有所需补丁,请使用 --bugzilla 选项。
要列出特定错误的补丁,您还可以指定错误编号:--bugzilla=NUMBER。要搜索与多个 Bugzilla 问题相关的补丁,请在错误编号之间添加逗号,例如
> zypper list-patches --bugzilla=972197,956917要列出与 CVE 数据库(Common Vulnerabilities and Exposures)中的条目相关的所有所需补丁,请使用 --cve 选项。
要列出特定 CVE 数据库条目的补丁,您还可以指定 CVE 编号:--cve=NUMBER。要搜索与多个 CVE 数据库条目相关的补丁,请在 CVE 编号之间添加逗号,例如
> zypper list-patches --cve=CVE-2016-2315,CVE-2016-2324Information 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
[...]如果存储库仅包含新的软件包,但不提供补丁,zypper patch 不会产生任何效果。要使用较新版本更新所有已安装的软件包,请使用以下命令
>sudozypper update
zypper update 会忽略存在问题的软件包。例如,如果某个软件包被锁定,zypper update 会省略该软件包,即使有更高版本的软件包可用。相反,zypper patch 如果该软件包被认为易受攻击,则会报告冲突。
要更新单个软件包,请使用 update 或 install 命令指定该软件包
>sudozypper update PACKAGE_NAME>sudozypper install PACKAGE_NAME
可以使用以下命令获取所有新的可安装软件包的列表
> zypper list-updates请注意,此命令仅列出满足以下条件的软件包
与已安装的软件包具有相同的供应商,
由优先级至少与已安装软件包相同的存储库提供,
可安装(满足所有依赖关系)。
可以使用以下命令获取 所有 新的可用软件包的列表(无论是否可安装)
>sudozypper list-updates --all
要找出为什么无法安装新的软件包,请使用上述描述的 zypper install 或 zypper update 命令。
在打补丁、更新或删除软件包时,系统上可能存在正在运行的进程,这些进程继续使用已被更新或删除删除的文件。使用 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 |
| Login:运行该进程的用户的登录名 |
| Command:用于执行该进程的命令 |
| Service:服务名称(仅当命令与系统服务关联时) |
| Files:已删除文件的列表 |
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
有关服务处理的更多信息,请参阅 第 10 章,systemd 守护程序。
Zypper 的所有安装或补丁命令都依赖于已知存储库的列表。要列出系统已知的所有存储库,请使用以下命令
> zypper repos结果将类似于以下输出
> zypper repos
# | Alias | Name | Enabled | GPG Check | Refresh
---+-----------------------+------------------+---------+-----------+--------
1 | Leap-15.1-Main | Main (OSS) | Yes | (r ) Yes | Yes
2 | Leap-15.1-Update | Update (OSS) | Yes | (r ) Yes | Yes
3 | Leap-15.1-NOSS | Main (NON-OSS) | Yes | (r ) Yes | Yes
4 | Leap-15.1-Update-NOSS | Update (NON-OSS) | Yes | (r ) Yes | Yes
[...]在各种命令中指定存储库时,可以使用别名、URI 或来自 zypper repos 命令输出的存储库编号。存储库别名是存储库处理命令中使用的存储库名称的简短版本。请注意,存储库编号在修改存储库列表后可能会更改。别名本身永远不会更改。
默认情况下,不会显示 URI 或存储库的优先级等详细信息。使用以下命令列出所有详细信息
> zypper repos -d要添加存储库,请运行
>sudozypper addrepo URI ALIAS
URI 可以是 Internet 存储库、网络资源、目录或 CD 或 DVD(有关详细信息,请参阅 https://en.opensuse.net.cn/openSUSE:Libzypp_URIs)。 ALIAS 是存储库的简短且唯一的标识符。您可以自由选择它,唯一的例外是它需要是唯一的。如果指定已使用的别名,Zypper 会发出警告。
zypper 允许您从配置的存储库中获取软件包的更改。要获取更改,请运行
>sudozypper refresh
zypper 的默认行为默认情况下,某些命令会自动执行 refresh,因此您无需显式运行该命令。
可以使用 --plus-content 选项使用 refresh 命令查看禁用存储库中的更改
>sudozypper --plus-content refresh
此选项会获取存储库中的更改,但会使禁用的存储库保持相同状态——禁用。
要从列表中删除存储库,请使用命令 zypper removerepo 连同要删除的存储库的别名或编号。例如,要从 示例 2.1,“Zypper—已知存储库列表” 中删除 Non-OSS Repository 存储库,请使用以下命令之一
>sudozypper removerepo 4>sudozypper removerepo "Non-OSS Repository"
使用 zypper modifyrepo 启用或禁用存储库。您还可以使用此命令更改存储库的属性(例如刷新行为、名称或优先级)。以下命令将启用名为 updates 的存储库,启用自动刷新,并将其优先级设置为 20
>sudozypper 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
>sudozypper renamerepo 'Mozilla Firefox' firefox
Zypper 提供各种方法来查询存储库或软件包。要获取所有产品、模式、软件包或补丁的列表,请使用以下命令
>zypper products>zypper patterns>zypper packages>zypper patches
要查询所有存储库中的特定软件包,请使用 search。要获取有关特定软件包的信息,请使用 info 命令。
命令 zypper search 可以在软件包名称上工作,或者,可选地,在软件包摘要和描述上工作。用 / 括起来的字符串被解释为正则表达式。默认情况下,搜索不区分大小写。
fire 的软件包名称> zypper search "fire"MozillaFirefox> zypper search --match-exact "MozillaFirefox"> zypper search -d fire> zypper search -u firefir 但不紧跟 e 的软件包> zypper se "/fir[^e]/"要搜索提供特定功能的软件包,请使用命令 what-provides。例如,如果您想知道哪个软件包提供 Perl 模块 SVN::Core,请使用以下命令
> zypper what-provides 'perl(SVN::Core)'命令 what-provides PACKAGE_NAME 与 rpm -q --whatprovides PACKAGE_NAME 类似,但 RPM 只能查询 RPM 数据库(即所有已安装软件包的数据库)。另一方面,Zypper 会告诉您来自任何存储库的功能提供者,而不仅仅是已安装的软件包。
要查询单个软件包,请使用 info 并将确切的软件包名称作为参数。这将显示有关软件包的详细信息。如果软件包名称与任何存储库中的软件包名称不匹配,则该命令会输出非软件包匹配的详细信息。如果您请求特定类型(使用 -t 选项),并且该类型不存在,则该命令会输出其他可用匹配项,但没有详细信息。
如果您指定源软件包,则该命令会显示从源软件包构建的二进制软件包。如果您指定二进制软件包,则该命令会输出用于构建二进制软件包的源软件包。
要同时显示软件包所需的/推荐的软件包,请使用选项 --requires 和 --recommends
> zypper info --requires MozillaFirefoxZypper 现在附带一个配置文件,允许您永久更改 Zypper 的行为(系统范围或用户特定)。对于系统范围的更改,请编辑 /etc/zypp/zypper.conf。对于用户特定的更改,请编辑 ~/.zypper.conf。如果 ~/.zypper.conf 尚不存在,可以使用 /etc/zypp/zypper.conf 作为模板:将其复制到 ~/.zypper.conf 并根据您的喜好进行调整。请参阅文件中的注释以获取有关可用选项的帮助。
如果您在访问已配置存储库中的软件包时遇到问题(例如,Zypper 无法找到某个软件包,即使您知道它存在于其中一个存储库中),刷新存储库可能会有所帮助
>sudozypper refresh
如果这不起作用,请尝试
>sudozypper refresh -fdb
这将强制完全刷新并重建数据库,包括强制下载原始元数据。
如果根分区使用 Btrfs 文件系统并且安装了 snapper,Zypper 会在提交对文件系统的更改时自动调用 snapper,以创建适当的文件系统快照。这些快照可用于撤消 Zypper 所做的任何更改。请参阅 第 3 章,使用 Snapper 进行系统恢复和快照管理 以获取更多信息。
有关从命令行管理软件的更多信息,请输入 zypper help、zypper help COMMAND 或参阅 zypper(8) man 页面。有关完整的详细命令参考,包含最重要的命令的 备忘单 以及有关如何在脚本和应用程序中使用 Zypper 的信息,请参阅 https://en.opensuse.net.cn/SDB:Zypper_usage。有关最新 openSUSE Leap 版本的软件更改列表,请参见 https://en.opensuse.net.cn/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 PACKAGE-1.2.3.rpm,以确定该软件包是否来自 SUSE 或来自其他可信赖的机构。特别是对于来自互联网的更新软件包,建议这样做。
通常,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 文件以避免将来更新时出现问题。
.rpmnew 文件出现在配置文件已经存在并且在 .spec 文件中指定了 noreplace 标签的情况下。
更新后,应在比较后删除 .rpmsave 和 .rpmnew 文件,以免妨碍未来的更新。.rpmorig 扩展名分配给文件,如果该文件先前未被 RPM 数据库识别。
换句话说,.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 数据库可能会有所帮助。
Delta RPM 软件包包含 RPM 软件包的旧版本和新版本之间的差异。将 delta RPM 应用于旧 RPM 会产生一个完全的新 RPM。不必拥有旧 RPM 的副本,因为 delta RPM 也可以与已安装的 RPM 一起工作。delta RPM 软件包的尺寸甚至小于补丁 RPM,这在通过互联网传输更新软件包时具有优势。缺点是使用 delta RPM 涉及的更新操作消耗的 CPU 周期比普通或补丁 RPM 多得多。
二进制文件 makedeltarpm 和 applydelta 是 delta RPM 套件的一部分(软件包 deltarpm),并帮助您创建和应用 delta RPM 软件包。使用以下命令,您可以创建一个名为 new.delta.rpm 的 delta RPM。以下命令假定存在 old.rpm 和 new.rpm
>sudomakedeltarpm old.rpm new.rpm new.delta.rpm
使用 applydeltarpm,如果您已经安装了旧软件包,则可以从文件系统重建新的 RPM
>sudoapplydeltarpm new.delta.rpm new.rpm
要从不访问文件系统的旧 RPM 派生它,请使用选项 -r
>sudoapplydeltarpm -r old.rpm new.delta.rpm new.rpm
有关技术详细信息,请参阅 /usr/share/doc/packages/deltarpm/README。
使用选项 -q,rpm 启动查询,从而可以检查 RPM 归档文件(通过添加选项 -p)并查询已安装软件包的 RPM 数据库。有几个开关可用于指定所需的信息类型。请参阅 表 2.1,“基本 RPM 查询选项”。
|
|
软件包信息 |
|
|
文件列表 |
|
|
查询包含文件 FILE 的软件包(必须使用完整路径指定 FILE) |
|
|
带有状态信息的的文件列表(意味着 |
|
|
仅列出文档文件(意味着 |
|
|
仅列出配置文件(意味着 |
|
|
带有完整详细信息的的文件列表(与 |
|
|
列出另一个软件包可以请求的功能 |
|
|
软件包所需的的功能 |
|
|
安装脚本(preinstall、postinstall、uninstall) |
例如,命令 rpm -q -i wget 显示 示例 2.2,“rpm -q -i wget” 中显示的信息。
rpm -q -i wget #Name : wget Name : wget Version : 1.19.5 Release : lp151.4.1 Architecture: x86_64 Install Date: Tue 30 Jul 2019 02:26:21 PM PDT Group : Productivity/Networking/Web/Utilities Size : 2881903 License : GPL-3.0+ Signature : RSA/SHA256, Thu 11 Apr 2019 02:23:42 AM PDT, Key ID b88b2fd43dbdc284 Source RPM : wget-1.19.5-lp151.4.1.src.rpm Build Date : Thu 11 Apr 2019 02:23:27 AM PDT Build Host : cloud114 Relocations : (not relocatable) Packager : https://bugs.opensuse.org Vendor : openSUSE URL : https://gnu.ac.cn/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: openSUSE Leap 15.1
选项 -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如果只知道文件名的一部分,请使用如下所示的 shell 脚本:示例 2.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/wgetrcRPM 数据库的文件位于 /var/lib/rpm。如果 /usr 分区的大小为 1 GB,则此数据库可以占用近 30 MB,尤其是在完全更新之后。如果数据库比预期大得多,则使用选项 --rebuilddb 重建数据库会很有用。在执行此操作之前,请备份旧数据库。 cron 脚本 cron.daily 每天都会复制数据库(使用 gzip 压缩)并将其存储在 /var/adm/backup/rpmdb 中。副本数量由变量 MAX_RPMDB_BACKUPS(默认值:5)在 /etc/sysconfig/backup 中控制。对于 /usr 中的 1 GB,单个备份的大小约为 1 MB。
所有源代码包都带有 .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 现在可以使用 rpm -i 或,最好使用 rpm -U 进行安装。使用 rpm 安装后,它将出现在 RPM 数据库中。
请记住,spec 文件中的 BuildRoot 指令已被弃用。如果您仍然需要此功能,请使用 --buildroot 选项作为解决方法。
许多软件包的危险在于,在构建过程中会添加不需要的文件到正在运行的系统中。为了防止这种情况,请使用 build,它会在定义的隔离环境中构建软件包。为了建立这个 chroot 环境,build 脚本必须提供一个完整的软件包树。可以通过硬盘、NFS 或 DVD 提供此树。使用 build --rpms DIRECTORY 设置位置。与 rpm 不同,build 命令会在源代码目录中查找 .spec 文件。要在系统中的 /media/dvd 下挂载 DVD 的情况下,使用以下命令以 root 身份构建 wget(如上面的示例所示)
#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 man 页面可以获取更多信息。