cp / rsyncを使用した拡張属性の保持


12

を使用してコピーする場合cp、明示的な場合でも拡張属性は保持されません

cp -a --preserve=all /source /dest

または

cp -a --preserve=xattr /source /dest

同じことはrsync、つまり

rsync -aq -A -X --delete /source /dest

ただし、宛先ファイルシステムでは、(を使用してchattr)拡張属性を手動で作成できます。これは、ターゲットファイルシステムがxattrをサポートすることを意味します。

なぜ私は保存することができませんxattrcprsync

追加情報:

  • ソースとターゲットの両方のファイルシステムはext4です
  • ソースとターゲットの両方のファイルシステムはローカルです(nfsではありません)
  • Debian Wheezyを使用しています

この宛先ファイルシステムをどのようにマウントしていますか?NFS経由ですか?
slm

先のファイルシステムは、ローカルファイルシステムです
マーティンVegter

mountこのファイルシステムの出力を表示できますか?
slm

1
どのUNIXバリアントとバージョンですか?両端にどのファイルシステムタイプがあり、どのマウントオプションがありますか?
ジル「SO-悪であるのをやめる」14年

1
@MartinVegterあなたのファイルが持っているサンプル属性を教えてもらえますか?ext4ファイルシステムを2つのファイルに作成し、でテストを行いましたsetfattr -n system.name0 -v "value" test_filetest_fileext4 / jfs / xfsとの間でコピーしましたが、cp --preserve=all拡張属性を保持する問題はありませんでした。
UVV 14年

回答:


14

更新

これをもう少しいじり、chattrandのコードを見てみると、e2fsprogsによって設定された属性chattrとによって設定された属性libattr(例:commandを使用setfattr)は非常に異なっていることが明らかです。ファイルシステムフラグをchattr設定しextますが、これは単に名前付き属性または名前空間にマップしません。いずれもそれらのはへの呼び出しで現れていませんlibattrlistxattr。以下で想定されるように、おそらく名前空間の名前付き属性にマップする必要systemがありますが、現時点では完全に実装されていません。また、system.posix_acl_access以下のこれらの属性の1つへのマッピングと間違えた属性は、extファイルシステムフラグとは関係がなく、むしろアクセス制御リストと関係があります。関連するstraceメッセージはすべてのファイルに対して表示され、cp --preserve=xattr使用されている場合のみ消えます。

によって設定される属性chattrextファイルシステムに固有であり、それらに影響を与える唯一の方法はe2fsprogsツールを使用することであるようです。実際、manページは実際には「拡張属性」という用語を使用せず、むしろ「フ​​ァイル属性」を使用します。「実際の」拡張属性は、名前/値のペアでありlibattr、複数のファイルシステムで変更および実装できます。これらは、正しいオプションが与えられたときに、コピーされたファイルcprsync探して転送するものです。ただしsystemchattr属性を名前にマップし、最終的に他のファイルシステム上の同等の属性にマップするために名前空間が存在するように見えますが、現時点では機能しません。

いくつかの良い情報があるので、元の答えはそのままにしておきましたが、ある点ではかなり間違っています。

更新2

私は今までに再びこれに戻るべきでしたが、この答えによるとchattr単なるextファイルシステム以上のもので動作します。Wikipediaによると、これはchflagsBSDベースのシステムのコマンドと同等です。

いくつかのファイルシステムでこれらの属性の設定と読み取りをテストするスクリプトを作成し、次の結果を得ました。

ext4:
suS-iadAcj-t-e-- mnt/test_file
suSDiadAcj-tTe-- mnt/test_dir

reiserfs:
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_file
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_dir

xfs:
--S-iadA-------- mnt/test_file
--S-iadA-------- mnt/test_dir

btrfs:
--S-iadAc------C mnt/test_file
--SDiadAc------C mnt/test_dir

reiserfsいくつかの機能を備えているとしてウィキペディアにリストされているにもかかわらず、ファイルフラグの読み取り/設定を試みると、上記のエラーが発生することに注意してください。私はテストしませんでしたreiser4。また、cフラグを設定するext4ことはできますが、それは尊重されません。これらのフラグに影響するチューニング/マウントオプションもありますが、見つかりませんでした。

ただし、現在のところchattr、これらの属性を変更できるのはLinux上の唯一のユーティリティであるため、コピーユーティリティはこれらを保持できません。

元の回答

その理由は、rsync試してさえいないからだと思われます。ドキュメントの-Xセクションからrsync

For systems that support extended-attribute namespaces, a copy being done by a
super-user copies all namespaces except system.*.  A normal user only  copies
the user.* namespace.

で使用される属性文字にマップすることは困難であるchattrlsattr、ファイルシステムで使用される基礎となる名前の属性(1のためのインターネット上のリストがない)にします。私のテストからは、A属性は属性にマップされ、system.posix_acl_accessこれはsystem名前空間なので、rsyncコピーしようとさえしません。記載されていない他の2つのネームスペースmanスニペットがあるtrustedsecurity、root権限は、これらを設定する必要があります(とrsyncせずにしようとはしません)。

ほとんどの場合、設定しようとした属性は、無視する(おそらく賢明な)system名前空間に該当しますrsync。そうでないか、そうでないものを取得するには、rootになる必要があります。

に関してはcp、プレイ中にバグがあるようです。で実行straceするcp -aと、次の2つの興味深い行が表示されます。

fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)

そして

fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0

まず、fgetxattr呼び出しはデータを返さない(おそらく何も存在しないため-属性の存在が十分である)が、何らかの方法でcp28バイトの(ジャンク?)データを見つけて、宛先ファイルに属性値として設定します。これはバグのように思えるcpのではなく、問題を引き起こしているもののバグのようですlibattrとしてfsetattr呼び出しが戻っ0実際に属性を設定せずに成功するため。

ext4マウントするかどうかに関係なく、この動作を取得しuser_xattrます。「一部のシステム」では、拡張属性が機能するためにこのマウントオプションが必要であると言う以外に、これに関するドキュメントは見つかりません。一見私のもの(Debian Jessie)はそうではありません。私が見逃したマウントの問題がありますが、それは間違っているためfsetattrcp静かに失敗するのです。

実際user_xattrに必要とされext2ext3reiserfsそしておそらくいくつかの他。必要ありませんext4

また、attrツールsetfattrgetfattrおよびattr(後者はのみのために文書化さXFSれていますが、のために他と同様に動作するようですext4user名前空間以外で動作する問題があることに注意してください。名前空間に属性を配置するOperation not supportedために使用しようとした場合に取得setfattrsystemます(または、このバグのように名前空間なし)。と名前空間でsetfattr成功したように見えますが、その後、何も読み戻せず、で設定された名前空間から何も読み込めません。成功する理由は、呼び出しを使用するのではなく、呼び出しを使用するからです。trustedsecuritygetfattrsystemchattrchattrioctllibattr

ただし、完全に機能するのは、user名前空間に拡張属性を設定し、そのままsetfattr使用するrsynccp、そのまま使用してコピーすることです(cp属性の作成時に値を指定しなくても問題はありません)。一番下の行は、system名前空間値の使用が現在バギーおよび/または少なくともDebianやその他のディストリビューションではサポートされていません。rsync開発者はこれを知っている可能性が高いため、それらは無視されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.