如何在fpm中无交互地将文件标记为%config(missingok),或解决RPM卸载时已删除文件的报错问题?
我明白你遇到的痛点:用fpm打包后,post-install脚本删除了部分文件节省空间,但卸载时RPM因为这些文件还在追踪列表里而报错,而且不想用修改编辑器脚本或pre-remove创建文件的方案。下面针对你的两个需求给出更优雅的解决办法:
需求b:通过fpm将文件标记为%config(missingok)
fpm其实提供了直接给文件设置RPM属性的参数——--rpm-file-attr,可以用来为指定文件添加%config(missingok)标记,完全不需要手动修改spec文件。
使用示例:
fpm -s dir -t rpm \ --name your-package-name \ --version 1.0.0 \ --rpm-file-attr "%config(missingok)" /path/to/your/target-file \ ./your-source-files/
这个参数会在生成的spec文件中,对应文件的行自动加上%config(missingok)属性,这样RPM在卸载时检测到文件不存在,也不会抛出错误,完美匹配你的需求。
需求a:让RPM不再追踪这些文件
如果你确实想让RPM彻底停止追踪这些文件,有两种可靠的方式:
不将文件加入RPM的追踪列表
如果你只是需要这些文件在安装过程中临时使用,那完全可以把它们放到包的一个临时目录(比如/usr/share/your-package/temp/),然后在fpm打包时用--exclude参数排除这些文件,这样它们不会被RPM追踪。之后在post-install脚本中调用这些临时文件,使用完成后直接删除即可。示例命令:
fpm -s dir -t rpm \ --name your-package-name \ --version 1.0.0 \ --exclude "/usr/share/your-package/temp/*" \ ./your-source-files/从RPM数据库中移除文件追踪
如果必须将这些文件包含在包的初始文件列表中,那么可以在post-install脚本删除文件后,用rpm命令将该文件从RPM的追踪数据库中移除,这样卸载时RPM就不会再检查它。在你的post-install脚本中添加以下内容:
# 删除目标文件 rm -f /path/to/your/target-file # 从RPM数据库中移除该文件的追踪记录 rpm --erase --justdb --nodeps your-package-name /path/to/your/target-file注意替换
your-package-name为你的包的实际名称,这个操作由root执行,权限没问题,而且只会修改RPM数据库,不会影响其他文件。
优先推荐需求b的方案,因为它完全符合RPM的规范,操作也更简洁。
内容的提问来源于stack exchange,提问作者EphemeralTile

