web-dev-qa-db-ja.com

rpm2cpioはRPMからファイルをスキップします

これらの手順は、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のパッケージを使用して上記の手順を繰り返しました。結果は同じでした。

4
pdp

sssdスペックファイルからのsssd.confのエントリは次のとおりです。

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

最大RPM%ghostディレクティブについての引用:

このディレクティブをファイルを含む行に追加することにより、RPMはゴースト化されたファイルを認識しますが、パッケージには追加しません。ただし、それでもビルドルートにある必要があります。

したがって、rpmと同じパッケージの一部であるrpm2cpioは、CPIOアーカイブに変換するときにゴーストファイルをスキップします。

2
tejus

これらのファイルは空のファイルであるため、cpioアーカイブには含まれませんが、rpmをインストールした後でも、rpmでリストされ、rpm -V sssdで確認すると、通常の出力になります。そのようにrpmdbにリストされているのは、ファイルが削除された場合でも、SRPMからのスニペットです。 enter image description here

p.s.非常に興味深いケースです!

2
GioMac