我遇到了一个问题。我正在将一个现有项目打包成 RPM。它构建得很好,但是当我运行
sudo yum localinstal --nogpgcheck <path to rpm>
我收到以下错误消息:
Error: unpacking of archive failed on file <path to symlink>;5656d545: cpio: symlink
RPM 将项目提取到目录中,然后latest
通过执行以下操作更新现有的符号链接以指向它ln -sfn <app name and version>/ latest
谷歌在这个问题上几乎没有做出任何回应,所以我希望有更多经验的人可以提供帮助。
答案1
当 rpm 软件包拥有某个目录或文件,而磁盘上的文件/目录是符号链接时,就会发生这种情况。反之亦然。这是一个众所周知的问题。
您要么必须在安装/升级软件包之前手动删除符号链接,要么更改软件包以使其不拥有该文件。
答案2
我在使用 CentOS 7.6 和 Crystal 时也遇到了类似的问题。
Downloading packages:
crystal-0.27.2-1.x86_64.rpm | 38 MB 00:00:02
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : crystal-0.27.2-1.x86_64 1/1
Error unpacking rpm package crystal-0.27.2-1.x86_64
error: unpacking of archive failed on file /usr/share/crystal/src/lib_c/amd64-unknown-openbsd: cpio: rename
Verifying : crystal-0.27.2-1.x86_64 1/1
Failed:
crystal.x86_64 0:0.27.2-1
Complete!
我最终删除了有问题的整个路径:/usr/share/crystal/*
这解决了这个问题。
答案3
对我来说,当我有一个指向不存在的目录的符号链接时,就会发生这种情况;例如,我有一个指向的符号链接/opt/
,/data/
但/data/
由于我在挂载驱动器时出现拼写错误,所以它不存在(/daat/
如果你想知道的话)。
如果您的符号链接应该存在,请确保它指向有效位置。
答案4
我遇到了类似(但不同)的问题,由于这个问答是我在搜索时得到的第一个结果,所以我想在这里记录我的经历。
就我而言,rpm 的错误消息是:
Error: unpacking of archive failed on file /dir1/file;xxxxxxxx: cpio: link failed: Directory not empty
对我来说,/dir1/file
是 RPM 包中另一个文件的硬链接;称之为/dir2/file
。
使用 strace,我了解了导致失败的事件顺序:
- rpm 在包中创建目录
- rpm 提取
/dir2/file
成功 - rpm 调用
linkat
创建硬链接/dir1/file
,但失败EXDEV
(不允许跨设备链接) - rpm 删除已安装的内容,包括目录
- 其中一个目录已经存在且包含内容,因此
rmdir
失败ENOTEMPTY
- rpm 失败并显示上述错误消息
我试图在/dir1
和/dir2
位于不同分区的系统上安装该软件包,导致EXDEV
创建硬链接时失败。然而,rpm 并没有记录该失败,而是报告了rmdir
在清理期间执行的后者的错误号。这似乎是 rpm 中的一个错误;在我的情况下,版本为 4.16.1.3。