使用 RPM

最常见的情况是,当我们想要安装本地下载的 .rpm 包时,我们会遇到使用 rpm 而不是 DNF 的情况。
当然,DNF 可以处理这个问题,但是如果由于某种原因它不可用,我们可以依靠 rpm。
这看起来像这样:

sudo rpm -i /path/to/packagename.rpm

-i 标志告诉 rpm 安装,路径指向要安装的包。

大多数人使用标志的组合 -ivh 来在 rpm 命令安装软件包时显示更详细的信息。

sudo rpm -ivh /path/to/packagename.rpm

rpm 命令也适用于网络,允许我们同时下载和安装软件包。

sudo rpm -ivh https://example.com/fedora/32/packagename.rpm

如果我们已经安装了一个软件包,但我们希望安装更高版本,则可以使用 rpm 对其进行升级。
升级选项 -U 本质上是安装功能的一个变体,它将寻找用更新版本替换现有包,保留以前版本的备份,以防我们想回滚。

sudo rpm -Uvh https://example.com/fedora/32/packagename.rpm

与任何其他包管理器一样,我们也可以使用 rpm 从系统中删除包。
使用 -e fag 和 -vv 进行非常详细的输出,以确保我们不会意外删除所需的内容。

sudo rpm -evv packagename

如果我们在安装之前想了解有关软件包的更多信息,rpm 也可以满足需求。
-q 标志将让我们查询包。
将它与 -p 和 -R 结合使用以获得有关包功能及其所需依赖项的详细报告。
总而言之,它看起来像这样:

sudo rpm -qpR /path/to/packagename.rpm

我们还可以使用 rpm 列出已安装的软件包。

sudo rpm -qa

这可能会让人不知所措,因此如果我们正在寻找特定的东西,请将其通过管道传递给 grep。

sudo rpm -qa | grep -i search

如果我们只想查看最近添加的内容,也可以这样做。

sudo rpm -qa --last

这些都是我们会发现自己使用 rpm 命令的最常见方式。

查询和验证包

rpm {-q|--query} [select-options] [query-options]
rpm {-V|--verify} [select-options] [verify-options]
rpm --import PUBKEY ...
rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...

安装、升级和删除软件包

rpm {-i|--install} [install-options] PACKAGE_FILE ...
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--repackage] [--test] PACKAGE_NAME ...

杂项

rpm {--initdb|--rebuilddb}
rpm {--addsign|--resign} PACKAGE_FILE ...
rpm {--querytags|--showrc}
rpm {--setperms|--setugids} PACKAGE_NAME ...

select选项

[PACKAGE_NAME] [-a,--all ] [-f,--file  FILE] [-g,--group  GROUP] {-p,--package  PACKAGE_FILE] [--fileid  MD5] [--hdrid  SHA1] [--pkgid  MD5] [--tid  TID] [--querybynumber  HDRNUM] [--triggeredby  PACKAGE_NAME] [--whatprovides  CAPABILITY] [--whatrequires  CAPABILITY]

查询选项

[--changelog] [-c,--configfiles] [-d,--docfiles] [--dump] [--filesbypkg] [-i,--info] [--last] [-l,--list] [--provides] [--qf,--queryformat QUERYFMT] [-R,--requires] [--scripts] [-s,--state] [--triggers,--triggerscripts]

验证选项

[--nodeps] [--nofiles] [--noscripts] [--nodigest] [--nosignature] [--nolinkto] [--nomd5] [--nosize] [--nouser] [--nogroup] [--nomtime] [--nomode] [--nordev]

安装选项

[--aid] [--allfiles] [--badreloc] [--excludepath OLDPATH] [--excludedocs] [--force] [-h,--hash] [--ignoresize] [--ignorearch] [--ignoreos] [--includedocs] [--justdb] [--nodeps] [--nodigest] [--nosignature] [--nosuggest] [--noorder] [--noscripts] [--notriggers] [--oldpackage] [--percent] [--prefix NEWPATH] [--relocate OLDPATH=NEWPATH] [--repackage] [--replacefiles] [--replacepkgs] [--test]

FTP/HTTP 选项

rpm can act as an FTP and/or HTTP client so that packages can be queried or installed from the internet. Package files for install, upgrade, and query operations may be specified as an ftp or httpstyle URL:

ftp://USER:PASSWORD@HOST:PORT/path/to/package.rpm

如果省略 :PASSWORD 部分,将提示输入密码(每个用户/主机名对一次)。
如果用户和密码都被省略,则使用匿名 ftp。
在所有情况下,都会执行被动 (PASV) ftp 传输。

rpm allows the following options to be used with ftp URLs:
--ftpproxy HOST

主机 HOST 将用作所有 ftp 传输的代理服务器,这允许用户通过使用代理系统的防火墙机器进行 ftp。
这个选项也可以通过配置宏 %_ftpproxy 来指定。

--ftpport HOST

用于代理 ftp 服务器上的 ftp 连接的 TCP 端口号,而不是默认端口。
这个选项也可以通过配置宏 %_ftpport 来指定。

rpm allows the following options to be used with http URLs:
--httpproxy HOST

主机 HOST 将用作所有 http 传输的代理服务器。
这个选项也可以通过配置宏 %_httpproxy 来指定。

--httpport PORT

用于代理 http 服务器上的 http 连接的 TCP 端口号,而不是默认端口。
这个选项也可以通过配置宏 %_httpport 来指定。

数字签名和摘要验证

rpm 数字签名命令的一般形式是

rpm --import PUBKEY ...
rpm {--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...

--checksig 选项检查包含在 PACKAGE_FILE 中的所有摘要和签名,以确保包的完整性和来源。
请注意,现在每当读取包时都会验证签名,并且 --checksig 可用于验证与包关联的所有摘要和签名。

没有公钥就无法验证数字签名。
可以使用 --import 将一个 ascii 装甲公钥添加到 rpm 数据库。
导入的公钥携带在头部,密钥环管理与包管理完全相同。
例如,所有当前导入的公钥可以通过以下方式显示:

rpm -qa gpg-pubkey*

导入时可以通过查询显示有关特定公钥的详细信息。
以下是有关 Red Hat GPG/DSA 密钥的信息:

rpm -qi gpg-pubkey-db42a60e

最后,可以像包一样导入后删除公钥。
以下是删除 Red Hat GPG/DSA 密钥的方法

rpm -e gpg-pubkey-db42a60e

重建数据库选项

rpm 重建数据库命令的一般形式是

rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]

使用 --initdb 创建新数据库,使用 --rebuilddb 从已安装的包头重建数据库索引。

showrc

命令

rpm --showrc

显示 rpm 将用于当前在 rpmrc 和宏配置文件中设置的所有选项的值。

软件包查询选项

--changelog

显示包的更改信息。

-c, --configfiles

仅列出配置文件(提示 -l )。

-d, --docfiles

仅列出文档文件(提示 -l )。

--dump

转储文件信息如下:

path size mtime md5sum mode owner group isconfig isdoc rdev symlink

此选项必须至少与 -l 、 -c 、 -d 之一一起使用。

--filesbypkg

列出每个选定包中的所有文件。

-i, --info

显示包信息,包括名称、版本和描述。
如果已指定,则使用 --queryformat 。

--last

按安装时间对软件包列表进行排序,以便最新的软件包位于顶部。

-l, --list

列出包中的文件。

--provides

列出此包提供的功能。

-R, --requires

列出此包所依赖的包。

--scripts

列出在安装和卸载过程中使用的特定于包的 scriptlet。

-s, --state

显示包中文件的状态(提示 -l )。
每个文件的状态是正常、未安装或者替换之一。

--triggers, --triggerscripts

显示包中包含的触发器脚本(如果有)。

签署软件包

rpm --addsign|--resign PACKAGE_FILE ...

--addsign 和 --resign 选项都为给定的每个 packagePACKAGE_FILE 生成并插入新签名,替换任何现有签名。
由于历史原因,有两种选择,目前行为上没有区别。

验证选项

rpm 验证命令的一般形式是

rpm {-V|--verify} [select-options] [verify-options]

验证软件包会将有关软件包中已安装文件的信息与有关从 rpm 数据库中存储的软件包元数据中获取的文件的信息进行比较。
除其他外,验证比较每个文件的大小、MD5 总和、权限、类型、所有者和组。
显示任何差异。
未从包中安装的文件,例如,在安装时使用“--excludedocs”选项排除的文档文件,将被静默忽略。

包选择选项与包查询相同(包括包列表文件作为参数)。
验证模式独有的其他选项是:

--nodeps

不要验证包的依赖关系。

--nodigest

阅读时不要验证包或者标题摘要。

--nofiles

不要验证包文件的任何属性。

--noscripts

不要执行 %verifyscript scriptlet(如果有)。

--nosignature

阅读时不要验证包或者标头签名。

--nolinkto
--nomd5
--nosize
--nouser
--nogroup
--nomtime
--nomode
--nordev

不要验证相应的文件属性。

输出的格式是一个 8 个字符的字符串,一个可能的属性标记:

c %config configuration file.
d %doc documentation file.
g %ghost file (i.e. the file contents are not included in the package payload).
l %license license file.
r %readme readme file.

从包头开始,后跟文件名。
8 个字符中的每一个都表示将文件的属性与数据库中记录的那些属性的值进行比较的结果。
单个“.”(句点)表示测试通过,而单个“?”(问号)表示测试无法执行(例如文件权限阻止读取)。
否则,(助记符 emB oldened)字符表示相应的 --verify 测试失败:

S file Size differs
M Mode differs (includes permissions and file type)
5 MD5 sum differs
D Device major/minor number mis-match
L readLink(2) path mis-match
U User ownership differs
G Group ownership differs
T mTime differs
Unix/Linux RPM 命令

rpm 命令是最初的 Linux 包管理器之一。

RPM 代表 Redhat Package Manager。
与更高级的包管理器(如 DNF)不同,rpm 很简单,需要更多的手动干预。
也就是说,它仍然是一个功能强大的包管理解决方案,可作为 Redhat 系列 Linux 发行版的出色备份。

查询选项

rpm 查询命令的一般形式是

rpm {-q|--query} [select-options] [query-options]

我们可以指定打印包信息的格式。
为此,我们可以使用

--qf|--queryformat QUERYFMT

选项,后跟 QUERYFMT 格式字符串。
查询格式是标准 printf(3) 格式的修改版本。
该格式由静态字符串(可能包括换行符、制表符和其他特殊字符的标准 C 字符转义符)和 printf(3) 类型格式化程序组成。
由于 rpm 已经知道要打印的类型,但是必须省略类型说明符,并替换为要打印的标头标签的名称,用 {} 字符括起来。
标签名称不区分大小写,标签名称的前导 RPMTAG_ 部分也可以省略。

可以通过在标签后面加上:typetag 来请求替代输出格式。
目前,支持以下类型:

:armor

将公钥软件包在 ASCII 中。

:base64

使用 base64 编码二进制数据。

:date

使用 strftime(3) "%c" 格式。

:day

使用 strftime(3) "%a %b %d %Y" 格式。

:depflags

格式依赖标志。

:fflags

格式化文件标志。

:hex

以十六进制格式。

:octal

八进制格式。

:perms

格式化文件权限。

:shescape

转义单引号以在脚本中使用。

:triggertype

显示触发器后缀。

例如,要仅打印查询的包的名称,我们可以使用 %{NAME} 作为格式字符串。
要在两列中打印包名称和分发信息,我们可以使用 %-30{NAME}%{DISTRIBUTION} 。
当使用 --querytags 参数调用时,rpm 将打印它知道的所有标签的列表。

查询选项有两个子集:包选择和信息选择。

Package选择选项

软件包名字 PACKAGE_NAME

查询名为 PACKAGE_NAME 的已安装包。

-a, --all

查询所有已安装的包。

-f, --file FILE

查询拥有 FILE 的包。

--fileid MD5

查询包含给定文件标识符的包,例如:文件内容的 MD5 摘要。

-g, --group GROUP

使用 GROUP 组查询包。

--hdrid SHA1

包含给定标头标识符的查询包,例如:不可变标头区域的 SHA1 摘要。

-p, --package PACKAGE_FILE

查询(卸载的)包 PACKAGE_FILE。
PACKAGE_FILE 可以指定为 anftp 或者 http 样式的 URL,在这种情况下,将下载和查询包头。
有关 rpm 内部 ftp 和 http 客户端支持的信息,请参阅FTP/HTTP OPTIONS。
PACKAGE_FILE 参数,如果不是二进制包,将被解释为 ASCII 包列表。
允许以“#”开头的注释,并且包列表文件的每一行都可以包含空格分隔的 glob 表达式,包括带有远程 glob 表达式的 URL,这些表达式将扩展为替换包列表的路径,如查询的添加 PACKAGE_FILE 参数。

--pkgid MD5

查询包含给定包标识符的包,例如:组合头和负载内容的 MD5 摘要。

--querybynumber HDRNUM

直接查询HDRNUMth数据库条目;这仅对调试有用。

--specfile SPECFILE

解析和查询 SPECFILE 就好像它是一个包一样。
尽管并非所有信息(例如文件列表)都可用,但这种类型的查询允许使用 rpm 从规范文件中提取信息,而无需编写规范文件解析器。

--tid TID

查询具有给定 TID 事务标识符的包。
Unix 时间戳当前用作事务标识符。
在单个事务中安装或者删除的所有包都有一个公共标识符。

--triggeredby PACKAGE_NAME

查询由包 PACKAGE_NAME 触发的包。

--whatprovides CAPABILITY

查询所有提供 CAPABILITY 功能的包。

--whatrequires CAPABILITY

查询需要 CAPABILITY 才能正常运行的所有包。

安装和升级选项

rpm install 命令的一般形式是

rpm {-i|--install} [install-options] PACKAGE_FILE ...

这将安装一个新包。

rpm 升级命令的一般形式是

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

这会将当前安装的软件包升级或者安装到较新的版本。
这与安装相同,除了在安装新软件包后删除所有其他版本的软件包。

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

这将升级包,但前提是当前存在早期版本。
PACKAGE_FILE 可以指定为 FTP 或者 http URL,在这种情况下,将在安装之前下载包。

有关 rpm 的内部 ftp 和 http 客户端支持的信息,请参阅 FTP/HTTP 选项。

--aid

需要时将建议的包添加到事务集。

--allfiles

安装或者升级包中所有丢失的文件,无论它们是否存在。

--badreloc

与 --relocate 一起使用,允许对所有文件路径进行重定位,而不仅仅是包含在二进制包重定位提示中的那些 OLDPATH。

--excludepath OLDPATH

不要安装名称以 OLDPATH 开头的文件。

--excludedocs

不要安装任何标记为文档的文件(包括手册页和 texinfo 文档)。

--force

与使用 --replacepkgs 、 --replacefiles 和 --oldpackage 相同。

-h, --hash

在解压包存档时打印 50 个哈希标记。
与 -v|--verbose 一起使用以获得更好的显示效果。

--ignoresize

在安装此软件包之前,不要检查挂载文件系统是否有足够的磁盘空间。

--ignorearch

即使二进制包和主机的架构不匹配,也允许安装或者升级。

--ignoreos

即使二进制包和主机的操作系统不匹配,也允许安装或者升级。

--includedocs

安装文档文件。
这是默认行为。

--justdb

只更新数据库,不更新文件系统。

--nodigest

阅读时不要验证包或者标题摘要。

--nosignature

阅读时不要验证包或者标头签名。

--nodeps

在安装或者升级软件包之前不要进行依赖性检查。

--nosuggest

不要建议提供缺少依赖项的包。

--noorder

不要为安装重新排序软件包。
包列表通常会重新排序以满足依赖关系。

--noscripts
--nopre
--nopost
--nopreun
--nopostun

不要执行同名的scriptlet。
--noscripts 选项等效于

--nopre --nopost --nopreun --nopostun

并关闭相应的 %pre 、 %post 、 %preun 和 %postun scriptlet(s) 的执行。

--notriggers
--notriggerin
--notriggerun
--notriggerpostun

不要执行任何指定类型的触发器脚本。
--notriggers 选项等效于

--notriggerin --notriggerun --notriggerpostun

并关闭相应 %triggerin 、 %triggerun 和 %triggerpostun scriptlet 的执行。

--oldpackage

允许升级以用较旧的包替换较新的包。

--percent

从包存档中解压缩文件时打印百分比。
这是为了使 rpm 易于从其他工具运行。

--prefix NEWPATH

对于可重定位的二进制包,将包重定位提示中以安装前缀开头的所有文件路径转换为 NEWPATH。

--relocate OLDPATH=NEWPATH

对于可重定位的二进制包,将包重定位提示中以 OLDPATH 开头的所有文件路径转换为 NEWPATH。
如果要重新定位包中的多个 OLDPATH,则可以重复使用此选项。

--repackage

在擦除之前重新打包文件。
之前安装的包将根据宏 %_repackage_name_fmt 命名,并在宏 %_repackage_dir 命名的目录中创建(默认值为 /var/tmp)。

--replacefiles

安装这些软件包,即使它们替换了其他已安装的软件包中的文件。

--replacepkgs

即使某些软件包已安装在此系统上,也请安装这些软件包。

--test

不要安装软件包,只需检查并报告潜在的冲突。

擦除选项

rpm 擦除命令的一般形式是

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--repackage] [--test] PACKAGE_NAME ...

也可以使用以下选项:

--allmatches

删除与 PACKAGE_NAME 匹配的所有版本的包。
如果 PACKAGE_NAME 匹配多个包,通常会发出错误。

--nodeps

在卸载软件包之前不要检查依赖项。

--noscripts
--nopreun
--nopostun

不要执行同名的scriptlet。
包擦除期间的 --noscripts 选项等效于

--nopreun --nopostun

并关闭相应的 %preun 和 %postun scriptlet(s) 的执行。

--notriggers
--notriggerun
--notriggerpostun

不要执行任何指定类型的触发器脚本。
--notriggers 选项等效于

--notriggerun --notriggerpostun

并关闭相应 %triggerun 和 %triggerpostun scriptlet 的执行。

--repackage

在擦除之前重新打包文件。
之前安装的包将根据宏 %_repackage_name_fmt命名,并在宏 %_repackage_dir命名的目录中创建(默认值为 /var/tmp)。

--test

不要真的卸载任何东西,只是通过动作。
与 -vv 方法一起用于调试。

RPM说明

rpm是一个功能强大的软件包管理器,可用于构建、安装、查询、验证、更新和删除单个软件包。软件包由文件存档和用于安装和删除存档文件的元数据组成。元数据包括助手脚本、文件属性和有关包的描述性信息。软件包有两种:二进制软件包(用于封装要安装的软件)和源软件包(包含生成二进制软件包所需的源代码和配方)。

必须选择以下基本模式之一: Query, Verify, Signature Check, Install/Upgrade/Freshen, Uninstall, Initialize Database, Rebuild Database, Resign, Add Signature, Set Owners/Groups, Show Querytags, and Show Configuration.

遗留问题:执行 rpmbuild

rpm 的构建模式现在驻留在 /usr/bin/rpmbuild 可执行文件中。
虽然下面popt别名提供的遗留兼容性已经足够了,但兼容性并不完美;因此,正在从 rpm 中删除通过 popt 别名的构建模式兼容性。
安装 rpmbuild 包,请参阅 rpmbuild (8) 以获取先前在 rpm (8) 中记录的所有 rpm 构建模式的文档。

如果我们希望继续从 rpm 命令行调用 rpmbuild,请将以下几行添加到 /etc/popt:

rpm exec --bp rpmb -bp
rpm exec --bc rpmb -bc
rpm exec --bi rpmb -bi
rpm exec --bl rpmb -bl
rpm exec --ba rpmb -ba
rpm exec --bb rpmb -bb
rpm exec --bs rpmb -bs 
rpm exec --tp rpmb -tp 
rpm exec --tc rpmb -tc 
rpm exec --ti rpmb -ti 
rpm exec --tl rpmb -tl 
rpm exec --ta rpmb -ta
rpm exec --tb rpmb -tb
rpm exec --ts rpmb -ts 
rpm exec --rebuild rpmb --rebuild
rpm exec --recompile rpmb --recompile
rpm exec --clean rpmb --clean
rpm exec --rmsource rpmb --rmsource
rpm exec --rmspec rpmb --rmspec
rpm exec --target rpmb --target
rpm exec --short-circuit rpmb --short-circuit

使用 GPG 对包进行签名

为了使用 GPG 对包进行签名,必须将 rpm 配置为运行 GPG 并能够找到具有适当密钥的密钥环。
默认情况下,rpm 使用与 GPG 相同的约定来查找密钥环,即 $GNUPGHOME 环境变量。
如果密钥环不在 GPG 预期的位置,我们需要将宏 %_gpg_path 配置为要使用的 GPG 密钥环的位置。

为了兼容旧版本的 GPG、PGP 和 rpm,只应配置 V3 OpenPGP 签名包。
可以使用 DSA 或者 RSA 验证算法,但首选 DSA。

如果我们希望能够对自己创建的包进行签名,则还需要创建自己的公钥和私钥对(请参阅 GPG 手册)。
我们还需要配置 rpm 宏

%_signature

签名类型 目前只支持 gpg 和 pgp。

%_gpg_name

我们希望使用其密钥对包进行签名的“用户”的名称。

例如,为了能够使用 GPG 以用户“John Doe”的身份从位于 /etc/rpm/.gpg 中的密钥环中使用可执行文件 /usr/bin/gpg 对包进行签名,我们将包括

%_signature gpg
%_gpg_path /etc/rpm/.gpg
%_gpg_name John Doe 
%_gpgbin /usr/bin/gpg

在宏配置文件中。
使用 /etc/rpm/macros 进行每个系统的配置,使用 ~/.rpmmacros 进行每个用户的配置。

常规选项

这些选项可用于所有不同的模式。

-?, --help

打印一条更长的使用消息然后正常。

--version

打印包含正在使用的 rpm 版本号的一行。

--quiet

尽量少打印,通常只会显示错误消息。

-v

打印详细信息通常会显示常规进度消息。

-vv

打印大量的调试信息。

--rcfile FILELIST

以冒号分隔的 FILELIST 中的每个文件都由 rpm 顺序读取以获取配置信息。
只有列表中的第一个文件必须存在,波浪号将被扩展为 $HOME 的值。
默认的 FILELIST 是 /usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:~/.rpmrc。

--pipe CMD

将 rpm 的输出传送到命令 CMD。

--dbpath DIRECTORY

使用目录中的数据库而不是默认路径 /var/lib/rpm

--root DIRECTORY

使用以 DIRECTORY 为根的文件系统树进行所有操作。
请注意,这意味着 DIRECTORY 中的数据库将用于依赖项检查,并且任何 scriptlet(例如 %post 如果安装,或者 %prep 如果构建,一个包)将在 chroot(2) toDIRECTORY 之后运行。

日期:2020-07-15 11:16:47 来源:oir作者:oir