rpm升级无法用文件替换目录吗?

时间:2019-06-19 12:53:24

标签: linux centos rpm rhel rpm-spec

我有一个较早版本的软件包,其中包含一个带有文件的子目录。升级是在RHEL / CentOS 7上进行的。例如,我的1.0 RPM版本包含:

/opt/foo/etc/bar/x/y
/opt/foo/etc/bar/z

等在此程序包的较新版本中,我必须用相同名称的文件替换整个/opt/foo/etc/bar目录(不幸的是,此工具需要此文件,对此我无能为力)。因此,在新版本的软件包中,它将包含

/opt/foo/etc/bar

这是一个文件。

如果我运行正常的rpm --upgrade pkg-2.0.rpm,在调用任何规范脚本之前,都会出现错误:

file /opt/foo/etc/bar from install of pkg-2.0-1.x86_64 conflicts with file from package pkg-1.0-1.x86_64

为了避免这种情况,我必须在--replacefiles命令行中添加rpm选项,这很重要。

即使我这样做,它也会在我的preinst scriptlet运行之后失败 ,并出现如下错误:

error: unpacking of archive failed on file /opt/foo/etc/bar: cpio: rename failed - Is a directory
error: pkg-2.0-1.x86_64: install failed
error: pkg-1.0-1.x86_64: erase skipped

据我所知,使这项工作唯一可行的方法是修改preinst以删除目录,并向--replacefiles添加rpm选项。即使在完成所有这些操作之后,虽然升级成功完成,但它会为“丢失”的每个文件引发警告(因为我删除了目录):

warning: file /opt/foo/etc/bar/x/y: remove failed: Not a directory
warning: file /opt/foo/etc/bar/z: remove failed: Not a directory

我不知道为什么会显示此错误,因为这些东西是 not 目录,而且从来没有,但是无论如何。

我到处搜索有关此特定问题的信息,尽管我发现许多类似的错误,但它们都是针对不同情况的,例如人们试图安装两个文件重叠或类似的软件包。在这里,我肯定会尝试将一个软件包的一个版本升级到同一软件包的新版本。

似乎没有办法使RPM中的内容整洁地工作。这仅仅是RPM工具的不足还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

长期以来,这是一个突出的rpm问题。这是由CPIO引起的,CPIO无法按文件替换目录(反之亦然)。

如果您无法更改路径名,则有两个选择-都是丑陋的骇客:

  1. 您从A-1.0.rpm开始,其中包括/opt/foo/etc/bar/z作为目录。然后,创建A-transition-1.1.rpm,它将没有/opt/foo/etc/bar/z目录(实际上-它可以是空包),您将Obsolete: A <= 0:1.0。前导零是时代。我认为您过去没有使用过它。然后,您将使用Epoch: 1创建一个新的A-1.0.rpm,并且您将Obsolete: A-transition < 0:2.0并且这次它可以包含/opt/foo/etc/bar/z作为文件。 RPM将执行升级0:A-1.0-> A转换-> 1:A-1.0

  2. 由于这是CPIO问题,因此您可以:

    %pre 如果[-d / opt / foo / etc / bar / z];然后   rm -rf / opt / foo / etc / bar / z fi

RPM会在删除旧软件包时大喊丢失/opt/foo/etc/bar/z,但它应该通过(您未经测试)。