Güncelleme
Bununla biraz daha uğraştıktan sonra chattr
ve diğer kodlara baktıktan sonra, e2fsprogs
tarafından chattr
ayarlanan ve libattr
(örneğin komutla setfattr
) tarafından ayarlanan özniteliklerin çok farklı olduğu açıktır . adlandırılmış bir öznitelik veya ad alanı ile chattr
eşleşmeyen ext
dosya sistemi bayrakları ayarlar . Yok bunlardan herhangi çağrısıyla göstermek libattr
s' listxattr
. Muhtemelen ,system
aşağıda varsayıldığı gibi ad alanındaki adlandırılmış niteliklerle eşleşmelidirler, ancak henüz bu tamamen uygulanmamıştır. Ayrıca, system.posix_acl_access
aşağıdaki bu özniteliklerden biriyle eşleme için yanlış yaptığım öznitelik, ext
dosya sistemi bayrakları ile ilgisi yoktur ve daha ziyade erişim denetim listeleriyle ilgilidir. Ilişkilistrace
mesajlar herhangi bir dosya için görünür ve yalnızca cp --preserve=xattr
kullanıldığında kaybolur .
Tarafından belirlenen özniteliklerin dosya sistemlerine chattr
özgü olduğu ext
ve bunları etkilemenin tek yolunun e2fsprogs
araçlarla olduğu görülmektedir. Aslında man
sayfa aslında onlar için "genişletilmiş öznitelikler" terimini değil, "dosya öznitelikleri" terimini kullanır. 'Gerçek' genişletilmiş öznitelikler libattr
, birden çok dosya sistemi tarafından değiştirilebilen ve bunlara uygulanabilen ad / değer çiftleridir . Bunlar nelerdir cp
ve rsync
görünüm için ve sağ seçenekleri verildiğinde kopyalanan dosyalar aktarılmaz. Ancak , adların öznitelikleri adlarla ve sonuç olarak diğer dosya sistemlerindeki eşdeğer özniteliklerle system
eşleştirmek için ad alanının var olduğu görülüyor chattr
, ancak şimdilik bu çalışmıyor.
Noktalarda oldukça yanlış gitmesine rağmen, bazı iyi bilgiler olduğu için orijinal cevabı sağlam bıraktım.
Güncelleme 2
Tekrar önce şimdi buna geri geldi ama başına olması gereken bu cevap , chattr
sadece daha çalışır ext
dosya sistemleri. Wikipedia'ya göre chflags
, BSD tabanlı sistemlerde komuta eşdeğerdir .
Birkaç dosya sisteminde bu özniteliklerin ayarını ve okunmasını test etmek için bir komut dosyası yazdım ve aşağıdaki sonuçları aldım:
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
Wikipedia'da bazı işlevlere sahip olarak listelenmesine rağmen, dosya bayraklarını okuma / ayarlama tüm girişimlerinin yukarıdaki hatayı verdiğini unutmayın. Test etmedim reiser4
. Ayrıca c
üzerine bayrak koyabilirken ext4
onurlandırılmaz. Bu bayrakları etkileyen ayarlama / bağlama seçenekleri de olabilir, ancak bulamadım.
Bununla birlikte, şu anda chattr
Linux'ta bu öznitelikleri değiştirebilen tek yardımcı program olduğu ve dolayısıyla hiçbir kopyalama yardımcı programının bunları koruyamadığı görülmektedir.
Orijinal Yanıt
Bunun nedeni, rsync
denemek bile değil gibi görünüyor. Gönderen -X
bölümünde rsync
belgelerine:
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.
Dosya sisteminde kullanılan öznitelik harflerini chattr
ve kullanılan lsattr
adlandırılmış özniteliklerle eşleştirmek zordur (biri için internette liste yoktur). Testlerimden, A
öznitelik özniteliğe eşlenir system.posix_acl_access
ve bu system
ad alanı olduğundan, rsync
kopyalamaya bile çalışmaz.man
Snippet'te belirtilmeyen diğer iki ad alanı vardır trusted
ve security
bunları ayarlamak için kök ayrıcalıkları gerekir (ve rsync
onsuz denemez).
Büyük olasılıkla ayarlamaya çalıştığınız öznitelikler, göz ardı edilen (ve muhtemelen akıllıca) system
ad alanına düşer rsync
. Ya o ya da olmayanları almak için kök olmanız gerekir.
Gelince cp
, oyunda hatalar var gibi görünüyor.Koşu strace
üzerinde cp -a
, aşağıdaki iki ilginç satırları almak:
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
ve
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
İlk olarak fgetxattr
çağrı herhangi bir veri döndürmez (muhtemelen herhangi bir veri olmadığı için - özelliğin varlığı yeterlidir), ancak bir şekilde cp
hedef dosyada öznitelik değeri olarak ayarlamak için 28 baytlık (önemsiz?) Veri bulur. Bu bir hata gibi görünüyor cp
, bunun yerine sorunlara neden oluyorsa ne bir hata gibi görünüyor libattr
olarak fsetattr
çağrı dönünceye 0
aslında niteliğini ayarlamadan başarı için.
Bu davranışı takıp ext4
takmama bakılmaksızın alıyorum user_xattr
. Bu konuda, 'bazı sistemlerin' genişletilmiş özniteliklerin çalışması için bu bağlama seçeneğine ihtiyacı olduğunu söylemek dışında herhangi bir belge bulamıyorum. Görünüşe göre benimki (Debian Jessie) değil. Kaçırdığım bir montaj sorunu olsa bile, yanlış fsetattr
ve dolayısıyla cp
sessizce başarısız olmak.
Aslında user_xattr
ihtiyaç vardır ext2
, ext3
, reiserfs
ve muhtemelen bazıları diğerlerinden. İçin gerekli değilext4
Da unutmayın attr
araçlar setfattr
, getfattr
ve attr
(ikincisi yalnızca olmaya belgelenmiştir XFS
sadece, ama işin sadece yanı sıra diğerlerine görünüyor ext4
) bir şey ama çalışan sorunlarla user
ad. Ben olsun Operation not supported
ben kullanmaya çalışırsanız setfattr
bir nitelik koymak için system
ad (veya bu uyarınca hiçbir ad hata ). ve ad alanlarında setfattr
başarılı görünüyor , ancak daha sonra hiçbir şeyi geri okuyamıyor ve aynı zamanda tarafından ayarlanan ad alanından hiçbir şey okuyamıyor . Başarılı olmasının nedeni bir çağrı kullanmasıdır .trusted
security
getfattr
system
chattr
chattr
ioctl
libattr
Mükemmel bir şekilde işe yarayan şey, user
ad alanında genişletilmiş özniteliklerin ayarlanması setfattr
ve onlarla birlikte rsync
veya cp
bozulmadan kopyalanmasıdır ( cp
özniteliği oluştururken bir değer belirtmezseniz bile sorun yoktur ). Ben alt çizgi kullanarak olduğunu düşünüyorum system
ad değerlerini şu andaadamcağız ve / veyaen azından Debian ve muhtemelen diğer dağıtımlarda desteklenmez. Muhtemelen rsync
geliştiriciler bunu biliyor, bu yüzden onları görmezden geliyorlar.