これらの手順は、CentOS6.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
に興味がありました。 CentOS からのものよりも古いsssd
パッケージを使用しています。 CentOSのパッケージを使用して上記の手順を繰り返しました。結果は同じでした。
sssd
スペックファイルからのsssd.conf
のエントリは次のとおりです。
%ghost %attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sssd/sssd.conf
最大RPM%ghost
ディレクティブについての引用:
このディレクティブをファイルを含む行に追加することにより、RPMはゴースト化されたファイルを認識しますが、パッケージには追加しません。ただし、それでもビルドルートにある必要があります。
したがって、rpm
と同じパッケージの一部であるrpm2cpio
は、CPIOアーカイブに変換するときにゴーストファイルをスキップします。
これらのファイルは空のファイルであるため、cpioアーカイブには含まれませんが、rpmをインストールした後でも、rpmでリストされ、rpm -V sssd
で確認すると、通常の出力になります。そのようにrpmdbにリストされているのは、ファイルが削除された場合でも、SRPMからのスニペットです。
p.s.非常に興味深いケースです!