有一个 .spec 文件可以为我们的软件构建 rpm 包。在 .spec 文件的 %pre 部分中,会检查是否安装了我们软件的先前主要版本。如果是,安装将中止,并显示一条不错的错误消息。在以前的 RHEL 版本中,一切都工作正常。
在 RHEL 6.7 中(似乎也在 RHEL 6.5 中),rpm 安装程序无法到达(或忽略?)%pre 部分,并抱怨“文件...来自 our-software-server-23.01-1.el6 的安装”。 i386 与包 our-software-server-22.07-1.el6.i386 中的文件冲突,然后安装中止。这样的文件有很多。这正是 .spec 文件中的 %pre 部分所关注的情况。
最近版本之间的 rpm 处理发生了哪些变化?到目前为止我什么也没发现。
rpm --版本显示 4.8.0
任何帮助深表感谢!
%pre server
if [ $1 -gt 1 ]; then
# Check for an unsupported major version upgrade
INSTALLED_VER=$(rpm -q our-software-server|sed -e 's/our-software-server-\([0-9]\+\).*/\1/')
echo "Upgrade check:"
echo "installed : $INSTALLED_VER"
echo "new version: %{majorver}"
if [ "$INSTALLED_VER" -ne "%{majorver}" ]; then
echo
echo "ERROR:"
echo "An automatic RPM upgrade across major versions is not supported!"
echo "Please refer to the Upgrade Notes on how to manually perform"
echo "an upgrade and migrate the configuration data."
echo
exit 1
fi
...
答案1
rpm-4.8.0 在 /var/lib/rpm/.rpm.lock 中添加了全局文件锁,可防止通过在 %post 中调用 rpm 来递归安装 rpm。
同时,几乎不需要拥有/使用全局进程间锁:rpm(以及依赖于 rpmlib 的进程,如 yum)几乎不会争用全局锁。
简短回答:在 %post 中尝试 rpm -q 之前重命名锁定文件,并在退出 %post 之前恢复该文件。在实践中,通过重命名全局锁定文件打开的锁定竞争窗口非常小。
请注意,使用依赖项,而不是在 %pre 中调用 rpm,是比您尝试的解决方案更好的解决方案。