RPM升级时如何确定需删除的文件?打包新手技术问询
关于RPM升级中文件删除逻辑的详解
嘿,作为日常和RPM包打交道的老玩家,我来给你把这个问题讲明白~
首先得先搞懂:RPM之所以能精准管理文件,全靠它在本地维护的RPM数据库(默认路径是/var/lib/rpm/)。这个数据库里记录了每一个已安装包的所有文件信息——包括文件路径、校验和、所属包、权限属性等等,相当于RPM的“账本”。
针对你问的第5步:如何识别“未被新版本覆盖的旧文件”
当执行RPM升级时,这一步的判断逻辑是这样的:
- RPM会先把旧包的完整文件列表和新包的文件列表做对比
- 找出那些「旧包里存在,但新包里完全没有」的文件,这些就是“未被新版本覆盖的旧文件”
- 但有两个例外情况不会直接删除:
- 如果这个旧文件被用户手动修改过(RPM会通过数据库里存的校验和和实际文件对比,用
rpm -V <旧包名>就能看到修改痕迹),RPM会把它重命名为<文件名>.rpmsave保留下来,不会直接删除,避免丢失你的自定义内容 - 如果这个文件是旧包的配置文件(在包的.spec构建文件里被标记为
%config),哪怕新包没有这个文件,RPM也会默认保留(或者重命名),因为这类文件通常包含用户的个性化配置
- 如果这个旧文件被用户手动修改过(RPM会通过数据库里存的校验和和实际文件对比,用
升级过程中RPM确定删除文件的完整逻辑
结合你列出的升级步骤,整个文件删除的判断流程是嵌套在升级流程里的:
- 先执行新包的
%pre脚本、安装新包文件、执行%post脚本(对应你列的1-3步) - 执行旧包的
%preun脚本(第4步) - 进入文件清理阶段(第5步):
- 对比新旧包的文件清单,筛选出旧包独有的文件
- 排除被用户修改过的文件(自动备份)
- 排除标记为
%config的配置文件(除非.spec里明确配置了强制删除规则,但这种情况很少见) - 剩下的符合条件的旧文件,才会被RPM删除
- 最后执行旧包的
%postun脚本(第6步)
实用小工具推荐
- 用
rpm -ql <包名>可以查看某个已安装包的所有文件列表,方便你自己对比新旧包的文件差异 - 用
rpm -V <包名>可以检查包内文件是否被修改过,能提前知道哪些文件会被RPM备份而不是删除
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

