Memperbarui
Setelah bermain-main dengan ini lagi dan melihat kode untuk chattr
dan lainnya e2fsprogs
, jelas bahwa atribut yang ditetapkan oleh chattr
dan yang ditetapkan oleh libattr
(misalnya dengan perintah setfattr
) sangat berbeda. chattr
set ext
flag 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 system
namespace seperti yang diasumsikan di bawah ini, tetapi sampai sekarang ini sepenuhnya tidak diterapkan. Juga system.posix_acl_access
atribut saya mengira untuk pemetaan ke salah satu atribut di bawah ini, tidak ada hubungannya dengan ext
bendera filesystem dan agak hubungannya dengan daftar kontrol akses. Terkaitstrace
pesan muncul untuk file apa saja dan menghilang saat hanya cp --preserve=xattr
digunakan.
Tampaknya atribut yang ditetapkan chattr
khusus untuk ext
sistem file dan bahwa satu-satunya cara untuk mempengaruhi mereka adalah melalui e2fsprogs
alat. Sebenarnya man
halaman tersebut tidak benar-benar menggunakan istilah 'atribut diperluas' untuk mereka, melainkan 'atribut file'. Atribut diperluas 'nyata' adalah pasangan nama / nilai yang dapat diubah oleh libattr
dan diimplementasikan pada banyak sistem file. Ini adalah apa cp
dan rsync
mencari dan mentransfer ke file yang disalin ketika opsi yang tepat diberikan. Namun sepertinya system
namespace ada untuk memetakan chattr
atribut 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 , chattr
bekerja pada lebih dari sekedar ext
sistem file. Menurut Wikipedia , ini setara dengan chflags
perintah 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 reiserfs
flag file memberikan kesalahan di atas, meskipun terdaftar di Wikipedia memiliki beberapa fungsi. Saya tidak menguji reiser4
. Juga sementara c
bendera dapat diatur di ext4
atasnya tidak dihormati. Mungkin juga ada opsi tuning / mount yang mempengaruhi flag-flag ini, tetapi saya tidak dapat menemukannya.
Namun sepertinya saat ini chattr
adalah satu-satunya utilitas di Linux yang mampu memodifikasi atribut ini dan sehingga tidak ada utilitas salinan yang mampu melestarikannya.
Jawaban Asli
Alasan untuk rsync
itu adalah bahkan tidak mencoba. Dari -X
bagian rsync
dokumentasi:
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 chattr
dan lsattr
ke atribut bernama yang mendasari yang digunakan dalam sistem file (untuk yang tidak ada daftar di internet). Dari pengujian saya, A
atribut memetakan ke system.posix_acl_access
atribut dan karena ini adalah system
namespace, rsync
bahkan tidak akan mencoba untuk menyalinnya.Dua ruang nama lain yang tidak disebutkan dalam man
snippet adalah trusted
dan security
, hak akses root diperlukan untuk mengatur ini (dan rsync
tidak akan mencoba tanpanya).
Kemungkinan besar atribut yang telah Anda coba atur jatuh di system
namespace yang rsync
mengabaikan (dan mungkin dengan bijak). Entah itu atau Anda harus menjadi root untuk mendapatkan yang tidak.
Adapun cp
, tampaknya ada bug yang berperan.Menjalankan strace
pada 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 fgetxattr
panggilan tidak mengembalikan data apa pun (mungkin karena tidak ada - keberadaan atribut sudah cukup), namun entah bagaimana cp
menemukan 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 libattr
saat fsetattr
panggilan kembali 0
untuk sukses tanpa benar-benar mengatur atribut.
Saya mendapatkan perilaku ini ext4
terlepas 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 fsetattr
dan karenanya cp
gagal secara diam-diam.
Sebenarnya user_xattr
yang dibutuhkan pada ext2
, ext3
, reiserfs
dan mungkin beberapa orang lain. Itu tidak perlu untukext4
Perhatikan juga bahwa attr
alat - alat setfattr
, getfattr
dan attr
(yang terakhir didokumentasikan hanya untuk XFS
hanya, tetapi tampaknya berfungsi sama baiknya dengan yang lain untuk ext4
) memiliki masalah bekerja di apa pun kecuali user
namespace. Saya dapatkan Operation not supported
jika saya mencoba menggunakan setfattr
untuk meletakkan atribut di system
namespace (atau tidak ada namespace sesuai bug ini ). setfattr
tampaknya berhasil di ruang nama trusted
dan security
, tetapi kemudian getfattr
gagal membaca kembali dan juga gagal membaca apa pun dari system
namespace yang ditetapkan oleh chattr
. Alasan yang chattr
berhasil adalah karena ia menggunakan ioctl
panggilan dan tidak libattr
.
Apa yang tidak bekerja dengan sempurna, adalah menetapkan atribut diperluas di user
namespace dengan setfattr
dan menggunakan rsync
atau cp
untuk menyalinnya utuh (bahkan tidak ada masalah dengan cp
jika Anda tidak menentukan nilai saat membuat atribut). Saya pikir intinya adalah bahwa menggunakan system
nilai namespace saat inikereta dan / atautidak didukung, setidaknya di Debian dan mungkin distro lain juga. Kemungkinan rsync
pengembang tahu ini, itulah sebabnya mereka mengabaikannya.