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

RPM升级时如何确定需删除的文件?打包新手技术问询

关于RPM升级中文件删除逻辑的详解

嘿,作为日常和RPM包打交道的老玩家,我来给你把这个问题讲明白~

首先得先搞懂:RPM之所以能精准管理文件,全靠它在本地维护的RPM数据库(默认路径是/var/lib/rpm/)。这个数据库里记录了每一个已安装包的所有文件信息——包括文件路径、校验和、所属包、权限属性等等,相当于RPM的“账本”。

针对你问的第5步:如何识别“未被新版本覆盖的旧文件”

当执行RPM升级时,这一步的判断逻辑是这样的:

  • RPM会先把旧包的完整文件列表和新包的文件列表做对比
  • 找出那些「旧包里存在,但新包里完全没有」的文件,这些就是“未被新版本覆盖的旧文件”
  • 但有两个例外情况不会直接删除:
    1. 如果这个旧文件被用户手动修改过(RPM会通过数据库里存的校验和和实际文件对比,用rpm -V <旧包名>就能看到修改痕迹),RPM会把它重命名为<文件名>.rpmsave保留下来,不会直接删除,避免丢失你的自定义内容
    2. 如果这个文件是旧包的配置文件(在包的.spec构建文件里被标记为%config),哪怕新包没有这个文件,RPM也会默认保留(或者重命名),因为这类文件通常包含用户的个性化配置

升级过程中RPM确定删除文件的完整逻辑

结合你列出的升级步骤,整个文件删除的判断流程是嵌套在升级流程里的:

  1. 先执行新包的%pre脚本、安装新包文件、执行%post脚本(对应你列的1-3步)
  2. 执行旧包的%preun脚本(第4步)
  3. 进入文件清理阶段(第5步):
    • 对比新旧包的文件清单,筛选出旧包独有的文件
    • 排除被用户修改过的文件(自动备份)
    • 排除标记为%config的配置文件(除非.spec里明确配置了强制删除规则,但这种情况很少见)
    • 剩下的符合条件的旧文件,才会被RPM删除
  4. 最后执行旧包的%postun脚本(第6步)

实用小工具推荐

  • 用rpm -ql <包名>可以查看某个已安装包的所有文件列表,方便你自己对比新旧包的文件差异
  • 用rpm -V <包名>可以检查包内文件是否被修改过,能提前知道哪些文件会被RPM备份而不是删除

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:26:14