You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在fpm中无交互地将文件标记为%config(missingok),或解决RPM卸载时已删除文件的报错问题?

解决fpm制作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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:32:56