rpm2cpio从RPM中跳过文件

这些步骤来自运行CentOS 6.5的一个盒子。 我只是尝试将RPM软件包转换为CPIO存档文件,并且很惊奇地发现RPM中列出的文件,但是没有存档。 以下是采取的步骤。

在RPM中列出path:

$ 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 

保存档案中的文件列表。 sedfilter需要删除path名中的前导点条目。 这不是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因为我想查看一个示例configuration文件。 我们使用的是比CentOS更早的sssd软件包。 我用CentOS的软件包重复上述步骤。 结果是一样的。

sssd spec文件中的sssd条目是:

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

从最大RPM引用%ghost指令:

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

因此,与rpm相同的软件包中的rpm2cpio会在转换为CPIO存档时跳过ghost文件。

这些文件是空文件,因此,它们不包含在cpio压缩文件中,但是以rpm的forms列出,即使在安装rpm之后,如果使用rpm -V sssd检查它,它也会有正常输出,因为它已经被列出在rpmdb中,即使文件被删除,这里是SRPM的片段: 在这里输入图像说明

ps很有趣的情况!