genişletilmiş özellikleri cp / rsync ile koruma


12

İle kopyalarken cp, genişletilmiş öznitelikler, açık olsa bile korunmaz

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

veya

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

Aynı şey rsync, yani

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

Ancak, hedef dosya sisteminde, el ile genişletilmiş öznitelik oluşturabilirim (ile chattr). Bu, hedef dosya sisteminin xattr'i desteklediği anlamına gelir.

Neden veya xattrile cpkoruyamıyorum rsync?

Ek bilgi:

  • Hem kaynak hem de hedef dosya sistemleri ext4'tür
  • Hem kaynak hem de hedef dosya sistemleri yereldir (nfs değil)
  • Debian Wheezy kullanıyorum

Bu hedef dosya sistemini nasıl bağlıyorsunuz? NFS üzerinden mi?
slm

hedef dosya sistemi yerel bir dosya sistemidir
Martin Vegter

mountBu dosya sisteminin çıktısını gösterebilir misiniz ?
slm

1
Hangi unix varyantı ve versiyonunda? Her iki uçta hangi dosya sistemi türleri, hangi bağlama seçenekleri ile?
Gilles 'SO- kötü olmayı bırak'

1
@MartinVegter Dosyanızın sahip olduğu örnek bir özelliği verebilir misiniz? İki dosyada ext4 dosya sistemi oluşturdum ve bir test yaptım setfattr -n system.name0 -v "value" test_file. test_file/ İle ext4 / jfs / xfs kopyalandı ve cp --preserve=allgenişletilmiş öznitelikleri koruyan herhangi bir sorun yoktu.
UVV

Yanıtlar:


14

Güncelleme

Bununla biraz daha uğraştıktan sonra chattrve diğer kodlara baktıktan sonra, e2fsprogstarafından chattrayarlanan 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 chattreşleşmeyen extdosya sistemi bayrakları ayarlar . Yok bunlardan herhangi çağrısıyla göstermek libattrs' 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_accessaşağıdaki bu özniteliklerden biriyle eşleme için yanlış yaptığım öznitelik, extdosya sistemi bayrakları ile ilgisi yoktur ve daha ziyade erişim denetim listeleriyle ilgilidir. Ilişkilistracemesajlar herhangi bir dosya için görünür ve yalnızca cp --preserve=xattrkullanıldığında kaybolur .

Tarafından belirlenen özniteliklerin dosya sistemlerine chattrözgü olduğu extve bunları etkilemenin tek yolunun e2fsprogsaraçlarla olduğu görülmektedir. Aslında mansayfa 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 cpve rsyncgö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 systemeş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 , chattrsadece daha çalışır extdosya 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

reiserfsWikipedia'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 ext4onurlandırılmaz. Bu bayrakları etkileyen ayarlama / bağlama seçenekleri de olabilir, ancak bulamadım.

Bununla birlikte, şu anda chattrLinux'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, rsyncdenemek bile değil gibi görünüyor. Gönderen -Xbölümünde rsyncbelgelerine:

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 chattrve kullanılan lsattradlandırılmış özniteliklerle eşleştirmek zordur (biri için internette liste yoktur). Testlerimden, Aöznitelik özniteliğe eşlenir system.posix_acl_accessve bu systemad alanı olduğundan, rsynckopyalamaya bile çalışmaz.manSnippet'te belirtilmeyen diğer iki ad alanı vardır trustedve securitybunları ayarlamak için kök ayrıcalıkları gerekir (ve rsynconsuz denemez).

Büyük olasılıkla ayarlamaya çalıştığınız öznitelikler, göz ardı edilen (ve muhtemelen akıllıca) systemad 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 cphedef 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 libattrolarak fsetattrçağrı dönünceye 0aslında niteliğini ayarlamadan başarı için.

Bu davranışı takıp ext4takmama 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ış fsetattrve dolayısıyla cpsessizce başarısız olmak.

Aslında user_xattrihtiyaç vardır ext2, ext3, reiserfsve muhtemelen bazıları diğerlerinden. İçin gerekli değilext4

Da unutmayın attraraçlar setfattr, getfattrve attr(ikincisi yalnızca olmaya belgelenmiştir XFSsadece, ama işin sadece yanı sıra diğerlerine görünüyor ext4) bir şey ama çalışan sorunlarla userad. Ben olsun Operation not supportedben kullanmaya çalışırsanız setfattrbir nitelik koymak için systemad (veya bu uyarınca hiçbir ad hata ). ve ad alanlarında setfattrbaş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 .trustedsecuritygetfattrsystemchattrchattrioctllibattr

Mükemmel bir şekilde işe yarayan şey, userad alanında genişletilmiş özniteliklerin ayarlanması setfattrve onlarla birlikte rsyncveya cpbozulmadan kopyalanmasıdır ( cpözniteliği oluştururken bir değer belirtmezseniz bile sorun yoktur ). Ben alt çizgi kullanarak olduğunu düşünüyorum systemad değerlerini şu andaadamcağız ve / veyaen azından Debian ve muhtemelen diğer dağıtımlarda desteklenmez. Muhtemelen rsyncgeliştiriciler bunu biliyor, bu yüzden onları görmezden geliyorlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.