menjaga atribut yang diperluas dengan cp / rsync

12

Saat menyalin dengan cp, atribut yang diperluas tidak dipertahankan, bahkan dengan eksplisit

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

atau

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

Hal yang sama dengan rsync, yaitu

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

Namun, pada sistem file tujuan, saya dapat membuat atribut diperluas secara manual (dengan chattr). Ini berarti bahwa sistem file target mendukung xattr.

Mengapa saya tidak bisa bertahan xattrdengan cpatau rsync?

Informasi tambahan:

  • Sistem file source dan target adalah ext4
  • Sistem file sumber dan target adalah lokal (bukan nfs)
  • Saya menggunakan Debian Wheezy
Martin Vegter
sumber
Bagaimana Anda memasang sistem file tujuan ini? Apakah lebih dari NFS?
slm
sistem file tujuan adalah sistem file lokal
Martin Vegter
Bisakah Anda menunjukkan output mountuntuk sistem file ini?
slm
1
Pada varian dan versi apa unix? Jenis sistem file apa di kedua ujungnya, dengan opsi pemasangan apa?
Gilles 'SO- stop being evil'
1
@ MartinVegter Bisakah Anda memberikan atribut sampel yang dimiliki file Anda? Saya baru saja membuat sistem file ext4 dalam dua file dan melakukan tes dengan setfattr -n system.name0 -v "value" test_file. Saya menyalin test_fileke / dari ext4 / jfs / xfs dengan cp --preserve=alldan tidak memiliki masalah melestarikan atribut yang diperluas.
UVV

Jawaban:

14

Memperbarui

Setelah bermain-main dengan ini lagi dan melihat kode untuk chattrdan lainnya e2fsprogs, jelas bahwa atribut yang ditetapkan oleh chattrdan yang ditetapkan oleh libattr(misalnya dengan perintah setfattr) sangat berbeda. chattrset extflag filesystem yang tidak memetakan ke atribut bernama atau namespace. Tak satu pun dari mereka muncul dengan panggilan apapun untuk libattr's listxattr. Mereka mungkin harus memetakan ke atribut yang dinamai dalam systemnamespace seperti yang diasumsikan di bawah ini, tetapi sampai sekarang ini sepenuhnya tidak diterapkan. Juga system.posix_acl_accessatribut saya mengira untuk pemetaan ke salah satu atribut di bawah ini, tidak ada hubungannya dengan extbendera filesystem dan agak hubungannya dengan daftar kontrol akses. Terkaitstracepesan muncul untuk file apa saja dan menghilang saat hanya cp --preserve=xattrdigunakan.

Tampaknya atribut yang ditetapkan chattrkhusus untuk extsistem file dan bahwa satu-satunya cara untuk mempengaruhi mereka adalah melalui e2fsprogsalat. Sebenarnya manhalaman tersebut tidak benar-benar menggunakan istilah 'atribut diperluas' untuk mereka, melainkan 'atribut file'. Atribut diperluas 'nyata' adalah pasangan nama / nilai yang dapat diubah oleh libattrdan diimplementasikan pada banyak sistem file. Ini adalah apa cpdan rsyncmencari dan mentransfer ke file yang disalin ketika opsi yang tepat diberikan. Namun sepertinya systemnamespace ada untuk memetakan chattratribut ke nama dan akhirnya ke atribut yang setara pada sistem file lain, tetapi untuk sekarang ini tidak berfungsi.

Saya telah meninggalkan jawaban asli tetap utuh karena ada beberapa informasi yang baik di sana, meskipun pada titik-titik yang jauh salah.

Perbarui 2

Saya seharusnya kembali ke ini lagi sebelum sekarang, tetapi sesuai jawaban ini , chattrbekerja pada lebih dari sekedar extsistem file. Menurut Wikipedia , ini setara dengan chflagsperintah pada sistem berbasis BSD.

Saya menulis sebuah skrip untuk menguji pengaturan dan membaca atribut-atribut ini pada beberapa sistem file dan mendapatkan hasil sebagai berikut:

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

Perhatikan bahwa semua upaya untuk membaca / mengatur reiserfsflag file memberikan kesalahan di atas, meskipun terdaftar di Wikipedia memiliki beberapa fungsi. Saya tidak menguji reiser4. Juga sementara cbendera dapat diatur di ext4atasnya tidak dihormati. Mungkin juga ada opsi tuning / mount yang mempengaruhi flag-flag ini, tetapi saya tidak dapat menemukannya.

Namun sepertinya saat ini chattradalah satu-satunya utilitas di Linux yang mampu memodifikasi atribut ini dan sehingga tidak ada utilitas salinan yang mampu melestarikannya.

Jawaban Asli

Alasan untuk rsyncitu adalah bahkan tidak mencoba. Dari -Xbagian rsyncdokumentasi:

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.

Sulit untuk memetakan huruf atribut yang digunakan oleh chattrdan lsattrke atribut bernama yang mendasari yang digunakan dalam sistem file (untuk yang tidak ada daftar di internet). Dari pengujian saya, Aatribut memetakan ke system.posix_acl_accessatribut dan karena ini adalah systemnamespace, rsyncbahkan tidak akan mencoba untuk menyalinnya.Dua ruang nama lain yang tidak disebutkan dalam mansnippet adalah trusteddan security, hak akses root diperlukan untuk mengatur ini (dan rsynctidak akan mencoba tanpanya).

Kemungkinan besar atribut yang telah Anda coba atur jatuh di systemnamespace yang rsyncmengabaikan (dan mungkin dengan bijak). Entah itu atau Anda harus menjadi root untuk mendapatkan yang tidak.

Adapun cp, tampaknya ada bug yang berperan.Menjalankan stracepada cp -a, saya mendapatkan dua baris berikut menarik:

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

dan

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

Pertama fgetxattrpanggilan tidak mengembalikan data apa pun (mungkin karena tidak ada - keberadaan atribut sudah cukup), namun entah bagaimana cpmenemukan 28 byte data (sampah?) Untuk ditetapkan sebagai nilai atribut dalam file tujuan. Sepertinya ini adalah bug cp, tetapi apa yang menyebabkan masalah tersebut sepertinya bug libattrsaat fsetattrpanggilan kembali 0untuk sukses tanpa benar-benar mengatur atribut.

Saya mendapatkan perilaku ini ext4terlepas dari apakah saya mount dengan user_xattr. Saya tidak dapat menemukan dokumentasi apa pun selain ini untuk mengatakan bahwa 'beberapa sistem' memerlukan opsi pemasangan ini agar atribut yang diperluas berfungsi. Tampaknya milikku (Debian Jessie) tidak. Bahkan ada masalah pemasangan yang saya lewatkan, itu salah fsetattrdan karenanya cpgagal secara diam-diam.

Sebenarnya user_xattryang dibutuhkan pada ext2, ext3, reiserfsdan mungkin beberapa orang lain. Itu tidak perlu untukext4

Perhatikan juga bahwa attralat - alat setfattr, getfattrdan attr(yang terakhir didokumentasikan hanya untuk XFShanya, tetapi tampaknya berfungsi sama baiknya dengan yang lain untuk ext4) memiliki masalah bekerja di apa pun kecuali usernamespace. Saya dapatkan Operation not supportedjika saya mencoba menggunakan setfattruntuk meletakkan atribut di systemnamespace (atau tidak ada namespace sesuai bug ini ). setfattrtampaknya berhasil di ruang nama trusteddan security, tetapi kemudian getfattrgagal membaca kembali dan juga gagal membaca apa pun dari systemnamespace yang ditetapkan oleh chattr. Alasan yang chattrberhasil adalah karena ia menggunakan ioctlpanggilan dan tidak libattr.

Apa yang tidak bekerja dengan sempurna, adalah menetapkan atribut diperluas di usernamespace dengan setfattrdan menggunakan rsyncatau cpuntuk menyalinnya utuh (bahkan tidak ada masalah dengan cpjika Anda tidak menentukan nilai saat membuat atribut). Saya pikir intinya adalah bahwa menggunakan systemnilai namespace saat inikereta dan / atautidak didukung, setidaknya di Debian dan mungkin distro lain juga. Kemungkinan rsyncpengembang tahu ini, itulah sebabnya mereka mengabaikannya.

Graeme
sumber