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 xattr
dengan cp
atau rsync
?
Informasi tambahan:
- Sistem file source dan target adalah ext4
- Sistem file sumber dan target adalah lokal (bukan nfs)
- Saya menggunakan Debian Wheezy
filesystems
rsync
cp
xattr
Martin Vegter
sumber
sumber
mount
untuk sistem file ini?setfattr -n system.name0 -v "value" test_file
. Saya menyalintest_file
ke / dari ext4 / jfs / xfs dengancp --preserve=all
dan tidak memiliki masalah melestarikan atribut yang diperluas.Jawaban:
Memperbarui
Setelah bermain-main dengan ini lagi dan melihat kode untuk
chattr
dan lainnyae2fsprogs
, jelas bahwa atribut yang ditetapkan olehchattr
dan yang ditetapkan olehlibattr
(misalnya dengan perintahsetfattr
) sangat berbeda.chattr
setext
flag filesystem yang tidak memetakan ke atribut bernama atau namespace. Tak satu pun dari mereka muncul dengan panggilan apapun untuklibattr
'slistxattr
. Mereka mungkin harus memetakan ke atribut yang dinamai dalamsystem
namespace seperti yang diasumsikan di bawah ini, tetapi sampai sekarang ini sepenuhnya tidak diterapkan. Jugasystem.posix_acl_access
atribut saya mengira untuk pemetaan ke salah satu atribut di bawah ini, tidak ada hubungannya denganext
bendera filesystem dan agak hubungannya dengan daftar kontrol akses. Terkaitstrace
pesan muncul untuk file apa saja dan menghilang saat hanyacp --preserve=xattr
digunakan.Tampaknya atribut yang ditetapkan
chattr
khusus untukext
sistem file dan bahwa satu-satunya cara untuk mempengaruhi mereka adalah melaluie2fsprogs
alat. Sebenarnyaman
halaman tersebut tidak benar-benar menggunakan istilah 'atribut diperluas' untuk mereka, melainkan 'atribut file'. Atribut diperluas 'nyata' adalah pasangan nama / nilai yang dapat diubah olehlibattr
dan diimplementasikan pada banyak sistem file. Ini adalah apacp
danrsync
mencari dan mentransfer ke file yang disalin ketika opsi yang tepat diberikan. Namun sepertinyasystem
namespace ada untuk memetakanchattr
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 sekedarext
sistem file. Menurut Wikipedia , ini setara denganchflags
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:
Perhatikan bahwa semua upaya untuk membaca / mengatur
reiserfs
flag file memberikan kesalahan di atas, meskipun terdaftar di Wikipedia memiliki beberapa fungsi. Saya tidak mengujireiser4
. Juga sementarac
bendera dapat diatur diext4
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
bagianrsync
dokumentasi:Sulit untuk memetakan huruf atribut yang digunakan olehDua ruang nama lain yang tidak disebutkan dalamchattr
danlsattr
ke atribut bernama yang mendasari yang digunakan dalam sistem file (untuk yang tidak ada daftar di internet). Dari pengujian saya,A
atribut memetakan kesystem.posix_acl_access
atribut dan karena ini adalahsystem
namespace,rsync
bahkan tidak akan mencoba untuk menyalinnya.man
snippet adalahtrusted
dansecurity
, hak akses root diperlukan untuk mengatur ini (danrsync
tidak akan mencoba tanpanya).Kemungkinan besar atribut yang telah Anda coba atur jatuh di
system
namespace yangrsync
mengabaikan (dan mungkin dengan bijak). Entah itu atau Anda harus menjadi root untuk mendapatkan yang tidak.AdapunMenjalankancp
, tampaknya ada bug yang berperan.strace
padacp -a
, saya mendapatkan dua baris berikut menarik:dan
Pertamafgetxattr
panggilan tidak mengembalikan data apa pun (mungkin karena tidak ada - keberadaan atribut sudah cukup), namun entah bagaimanacp
menemukan 28 byte data (sampah?) Untuk ditetapkan sebagai nilai atribut dalam file tujuan. Sepertinya ini adalah bugcp
, tetapi apa yang menyebabkan masalah tersebut sepertinya buglibattr
saatfsetattr
panggilan kembali0
untuk sukses tanpa benar-benar mengatur atribut.Saya mendapatkan perilaku ini
ext4
terlepas dari apakah saya mount denganuser_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 salahfsetattr
dan karenanyacp
gagal secara diam-diam.Sebenarnya
user_xattr
yang dibutuhkan padaext2
,ext3
,reiserfs
dan mungkin beberapa orang lain. Itu tidak perlu untukext4
Perhatikan juga bahwa
attr
alat - alatsetfattr
,getfattr
danattr
(yang terakhir didokumentasikan hanya untukXFS
hanya, tetapi tampaknya berfungsi sama baiknya dengan yang lain untukext4
) memiliki masalah bekerja di apa pun kecualiuser
namespace. Saya dapatkanOperation not supported
jika saya mencoba menggunakansetfattr
untuk meletakkan atribut disystem
namespace (atau tidak ada namespace sesuai bug ini ).setfattr
tampaknya berhasil di ruang namatrusted
dansecurity
, tetapi kemudiangetfattr
gagal membaca kembali dan juga gagal membaca apa pun darisystem
namespace yang ditetapkan olehchattr
. Alasan yangchattr
berhasil adalah karena ia menggunakanioctl
panggilan dan tidaklibattr
.Apa yang tidak bekerja dengan sempurna, adalah menetapkan atribut diperluas di
user
namespace dengansetfattr
dan menggunakanrsync
ataucp
untuk menyalinnya utuh (bahkan tidak ada masalah dengancp
jika Anda tidak menentukan nilai saat membuat atribut). Saya pikir intinya adalah bahwa menggunakansystem
nilai namespace saat inikereta dan / atautidak didukung, setidaknya di Debian dan mungkin distro lain juga. Kemungkinanrsync
pengembang tahu ini, itulah sebabnya mereka mengabaikannya.sumber