relocatable rpm 是指构建时声明支持路径重定位的软件包,其文件路径采用相对结构,并通过 _relocatable 1 或 relocations: 字段标识;仅此类包才可安全使用 --prefix 或 --relocate 安装到自定义路径,否则报错“not relocatable”。

relocatable RPM 是什么
relocatable RPM 指的是在构建时明确声明支持路径重定位的软件包。这类包内部文件路径采用相对结构(如 /usr/bin、/etc),且打包时通过 %define _relocatable 1 或 Relocations: 字段标记了可重定位能力。安装时才能安全使用 --prefix 或 --relocate 参数。不是所有 RPM 包都具备该特性,强行对不可重定位包使用这些选项会报错,例如 error: package xxx is not relocatable。
如何确认一个 RPM 是否可重定位
在安装前,用以下命令查看包元信息:
- rpm -qpi package.rpm | grep -i relocation —— 若输出类似 Relocations: /usr /etc,说明支持重定位,且列出了允许调整的原始路径
- rpm -qlp package.rpm | head -5 —— 观察文件路径是否集中于标准前缀(如全为 /usr/xxx 或 /etc/xxx),这是可重定位的常见特征
- 若无任何 relocation 提示,或明确显示 not relocatable,则该包默认不支持自定义路径安装
正确使用 --prefix 和 --relocate
仅对可重定位包有效,且需注意语义差异:
- --prefix=/opt/myapp:将整个包的安装路径“整体上移”,适用于所有文件共享同一根前缀(如包内路径全为 %{_bindir}/xxx → 实际变成 /opt/myapp/bin/xxx)
- --relocate /usr=/opt/myapp/usr --relocate /etc=/opt/myapp/etc:按路径逐项映射,更灵活,适合需拆分配置与二进制存放位置的场景
- 多个 --relocate 可同时使用,但必须覆盖所有原路径;遗漏会导致部分文件仍写入系统目录
- 不能混用 --prefix 和 --relocate;二者互斥
遇到不可重定位包怎么办
当 rpm 报错 not relocatable,又确实需要指定路径时,可绕过 rpm 安装机制:
- 用 rpm2cpio package.rpm | cpio -idmv 解压到目标目录(如 /opt/myapp)
- 手动检查解压后结构,调整脚本中的硬编码路径(如 shebang 行、配置文件中的 lib 路径)
- 设置环境变量确保运行正常:export PATH="/opt/myapp/bin:$PATH"、export LD_LIBRARY_PATH="/opt/myapp/lib"
- 注意:此方式不被 rpm 数据库记录,后续无法用 rpm -e 卸载,需自行清理











