rpm2cpio 跳过 RPM 中的文件

rpm2cpio 跳过 RPM 中的文件

这些步骤来自运行 CentOS 6.5 的机器。我只是尝试将 RPM 包转换为 CPIO 存档,并惊讶地发现 RPM 中列出的文件在存档中却不存在。以下是采取的步骤。

列出 RPM 中的路径:

$ rpm -qlp sssd-1.9.2-82.4.el6_4.x86_64.rpm | sort > rpm.lst

将 RPM 转换为 CPIO 档案:

$ rpm2cpio sssd-1.9.2-82.4.el6_4.x86_64.rpm > sssd-1.9.2-82.4.el6_4.x86_64.cpio

保存存档中的文件列表。sed过滤器需要从路径名中删除前导点条目。这对于 RPM 列表不是必需的。

$ cpio -i -t < sssd-1.9.2-82.4.el6_4.x86_64.cpio | sed -e 's|^.||' | sort > cpio.lst

最后,显示丢失的文件的差异:

$ diff -u cpio.lst rpm.lst

--- cpio.lst        2015-07-16 19:54:06.020494348 +0530
+++ rpm.lst         2015-07-16 19:53:38.012494371 +0530
@@ -2,6 +2,7 @@
 /etc/rc.d/init.d/sssd
 /etc/rwtab.d/sssd
 /etc/sssd
+/etc/sssd/sssd.conf
 /usr/bin/sss_ssh_authorizedkeys
 /usr/bin/sss_ssh_knownhostsproxy
 /usr/lib64/ldb/modules/ldb/memberof.so
@@ -102,6 +103,8 @@
 /var/lib/sss
 /var/lib/sss/db
 /var/lib/sss/mc
+/var/lib/sss/mc/group
+/var/lib/sss/mc/passwd
 /var/lib/sss/pipes
 /var/lib/sss/pipes/private
 /var/lib/sss/pubconf

为什么 RPM 中有文件,而 CPIO 存档中却没有?我之所以特别感兴趣,是/etc/sssd/sssd.conf因为我想查看一个示例配置文件。我们使用的sssd软件包比来自CentOS我用 CentOS 的软件包重复了上述步骤。结果是一样的。

答案1

sssd.confspec 文件中的条目sssd是:

%ghost %attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sssd/sssd.conf

引自最大转速关于该%ghost指令:

通过将此指令添加到包含文件的行中,RPM 将知道幻影文件,但不会将其添加到包中。然而,它仍然需要位于 buildroot 中。

因此,它是与转换为 CPIO 档案时跳过的幽灵文件rpm2cpio相同的包的一部分。rpm

答案2

这些文件是空文件,因此,它们不包含在 cpio 档案中,但列在 rpm 中,即使在您安装 rpm 之后,如果您使用以下命令进行检查rpm -V sssd- 它将具有正常输出,因为它以这种方式列在 rpmdb 中,即使文件被删除,这里是来自 SRPM 的片段: 在此处输入图片描述

附言:非常有趣的案例!

相关内容