Linux rpm升级可以';不能用文件替换目录吗?
我维护了一个包的早期版本,其中包含一个子目录和文件。升级正在RHEL/CentOS 7上进行。例如,我的1.0 RPM版本包含:Linux rpm升级可以';不能用文件替换目录吗?,linux,centos,rpm,rhel,rpm-spec,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——升级pkg-2.0.rpm,我会在调用
/opt/foo/etc/bar/x/y
/opt/foo/etc/bar/z
等等。在这个包的更新版本中,我必须用相同名称的文件替换整个/opt/foo/etc/bar
目录(不幸的是,这是工具所必需的,对此我无能为力)。因此,在新版本的包中,它将包含
/opt/foo/etc/bar
这是一个文件
如果我运行普通的rpm——升级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
。即使在我完成所有这些之后,虽然升级成功,但它会对每个“丢失”的文件发出警告(因为我删除了目录):
我不知道为什么它会显示这个错误,因为这些东西不是目录,也从来不是,但无论如何
我已经搜索了所有关于这个特定问题的信息,虽然我发现了很多类似的错误,但它们都适用于不同的情况,例如人们试图安装两个文件重叠或类似的软件包。在这里,我肯定会尝试将一个包的一个版本升级到同一个包的新版本
似乎没有任何可能的方法可以使它在RPM中干净地工作;这只是RPM工具的缺陷还是我遗漏了什么?这是RPM的一个长期悬而未决的问题。这是由CPIO引起的,它不能用文件替换目录(反之亦然) 如果无法更改路径名,则有两个选项-都是丑陋的黑客:
/opt/foo/etc/bar/z
目录。然后创建一个-transition-1.1.rpm,它将没有/opt/foo/etc/bar/z
目录(实际上,它可以是空包),并且将过时:A-transition->1:A-1.0
RPM在删除旧软件包时会大喊缺少
/opt/foo/etc/bar/z
,但它应该通过(未经测试)。我们曾经遇到过同样的问题,用符号链接替换目录。。。。很遗憾,我们没有找到解决办法。。。除了更改目录位置外,我觉得投票失败似乎是假的。如果编写SQL查询、Excel函数、cmake文件等被视为“编程”,那么编写RPM规范文件也绝对符合条件。谢谢。最后我确实做了类似于第二步的事情。我所做的是(a)在我的pre中,我重命名了目录(这样我就可以将它们放回故障状态),(b)我必须告诉人们使用--replacefiles rpm选项,否则他们会失败,以及(c)告诉他们忽略发出的警告。很不愉快,但很有效。谢谢你让我放心,我不会错过什么。
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