这些步骤来自运行 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.conf
spec 文件中的条目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 的片段:
附言:非常有趣的案例!