杰夫约翰逊绝对正确,不应该这样做。然而,它肯定是可以做到的。
我已经在工作中的 RPM 中完成了此操作,用于分发,但请注意,这是一个包含的半结构化环境,所有系统都没有远程操作。如果您有远程访问权限,请使用“删除、安装”路径并编写脚本。
如果你真的觉得你应该这样做,那么这些就是指针。我不会向您确切展示我是如何做到的,因为它是“工作”,而不是我的分享。这些概念是我的:-)
首先,备份 /var/lib/rpm/Packages 文件 ( cp /var/lib/rpm/Packages /var/tmp/Packages.bkp
)。把它放在安全的地方。如果在您处理解决方案时任何其他人更改了系统,请更新您的备份。从周日开始,在每次更改或步骤之后,定期检查 RPM 计数并进行测试。
您将需要使用 db_unload 和 db_load 命令。为了速度,您需要使用“s2p”将任何 shell sed 模式转换为 perl。然后构建一个如下所示的管道:
db_unload /var/tmp/Packages.bkp |perl -i -e "s2p converted string" |db_load /var/tmp/Packages.new
然后,您可以尝试通过在原始文件上复制 ot 来测试 Packages.new。手动更改后始终运行 rpm --rebuilddb。如果您看到任何错误,请恢复备份并再次重建数据库。
如果您需要将其放入 RPM 中,则将其转换为 Lua,并将其放入 pretrans 或 posttrans scriptlet ( %pretrans -p <lua>
)。选择取决于您要达到的顺序。Lua 解释器是内置在 rpm 中的,因此即使您的 RPM 以某种方式被调用,它也会在新系统安装期间正常运行。我将我的“管道”包裹在一个 lua 长字符串中,并使其仅在系统已经存在时才执行。否则它什么也不做。如果您认为“这永远不会发生”,请查看“永不言败”。
顺便说一句,如果你搞砸了,你可以完全加强你的 RPM 基础,从而对系统进行未来的管理。如果你这样做了,并且没有后援或出路,那么很难知道你对自己的行为负责。只是说你被警告了!