Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux rpm升级可以';不能用文件替换目录吗?_Linux_Centos_Rpm_Rhel_Rpm Spec - Fatal编程技术网

Linux 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,我会在调用

我维护了一个包的早期版本,其中包含一个子目录和文件。升级正在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
,我会在调用任何规范脚本之前收到一个错误:

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引起的,它不能用文件替换目录(反之亦然)

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

  • 您从A-1.0.rpm开始,它包括
    /opt/foo/etc/bar/z
    目录。然后创建一个-transition-1.1.rpm,它将没有
    /opt/foo/etc/bar/z
    目录(实际上,它可以是空包),并且将
    过时:A-transition->1:A-1.0

  • 由于这是CPIO问题,您可以:

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


  • 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