我有一个较早版本的软件包,其中包含一个带有文件的子目录。升级是在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工具的不足还是我错过了什么?
答案 0 :(得分:0)
长期以来,这是一个突出的rpm问题。这是由CPIO引起的,CPIO无法按文件替换目录(反之亦然)。
如果您无法更改路径名,则有两个选择-都是丑陋的骇客:
您从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
由于这是CPIO问题,因此您可以:
%pre 如果[-d / opt / foo / etc / bar / z];然后 rm -rf / opt / foo / etc / bar / z fi
RPM会在删除旧软件包时大喊丢失/opt/foo/etc/bar/z
,但它应该通过(您未经测试)。