RPM 的落点在打包时就写进包里,装之前用 rpm -qpl 就能看清;只有带前缀提示的包才允许 –prefix 改路径。
装前先看包内路径
rpm -qpl demo-1.0-1.x86_64.rpm
rpm -qp --qf "%{NAME} %{PREFIXES}\n" demo-1.0-1.x86_64.rpm
-qpl 列出这个 .rpm 装完会落在哪些路径 [1]。第二行的 PREFIXES 是打包时写进包头的可重定位前缀提示:spec 里写了 Prefix: <dir>、且 %files 里每个文件都以该前缀开头,包才算可重定位 [2]。提示为空,就意味着这包不能改落点。WSL 实测:带前缀提示的测试包返回 /opt/demo,不带的返回空。
–prefix 只对可重定位包有效
手册措辞是 For relocatable binary packages——前缀改写只针对可重定位包 [1]。对普通包跑 –prefix,实测直接报错 package plain is not relocatable,文件不会去你指定的目录。可重定位包才按命令行前缀落地:
rpm -i --root /tmp/fakeroot --prefix /opt/demo2 demo.rpm
这条同时用了 –root,把整笔安装写进一个假根目录:文件落在 /tmp/fakeroot/opt/demo2/bin/hello,数据库也建在该假根里,不碰真实系统 [1]。官方文档给的常规写法是 rpm ... --prefix /usr/opt,多个前缀可以用 --relocate /opt=/usr/opt 分别改写 [2]。
不想装,只想把文件取出来
rpm2cpio 把 .rpm 转成 cpio 归档写到标准输出,配合 cpio 就地解包:路径按包内相对路径落在当前目录,不写数据库、不登记包 [3]。
mkdir extract && cd extract
rpm2cpio demo-1.0-1.x86_64.rpm | cpio -idmv
实测解出的是 ./opt/demo/bin/hello。手册同时提醒 cpio 格式单文件不能超过 4GB,这个工具已被视为过时,官方建议改用 rpm2archive [3]。Debian/Ubuntu 里 rpm2cpio 是独立小包,随 rpm 的依赖装上——Ubuntu 24.04 的 rpm 包在 universe,版本 4.18.2 [5]。
已装文件反查,和数据库位置
rpm -qf /usr/bin/ls
rpm --root /tmp/fakeroot -qf /opt/demo2/bin/hello
rpm --root /tmp/fakeroot -ql demo
-f 按文件反查归属包 [1]。实测在假根里查 /opt/demo2/bin/hello 返回包名,查无归属时输出 file … is not owned by any package。反查靠 rpm 数据库:文档默认路径是 /var/lib/rpm [4],但 Ubuntu 打包把 %_dbpath 宏定义成 ~/.rpmdb(包内 /usr/lib/rpm/macros 可核对,本机 rpm --eval "%{_dbpath}" 返回 /root/.rpmdb),这就是同一台机器上”查不到数据库”的常见原因。
回滚与排错速查
rpm -e 包名 卸载再按正确前缀重装;用 –root 装的假根直接删目录,真实系统没动过。参考资料
- [1] rpm(8) – Linux manual page(man7 rpm(8))
- [2] Relocatable packages – RPM official docs(RPM 官方文档)
- [3] rpm2cpio(1) – Linux manual page(man7 rpm2cpio(1))
- [4] rpm-common(8) – Linux manual page(man7 rpm-common(8))
- [5] rpm – Ubuntu packages (24.04 noble)(Ubuntu rpm 包页)
文中主要命令已在 WSL Ubuntu(24.04)实测,个别条目(未装工具/安装类命令)仅核对官方文档,未实际执行。