2009-11-07 10 views
7

Perl tabanlı bir dosya senkronizasyon aracı üzerinde çalışıyorum. Dosyaları geçici bir dizine (gerçek dosyayla aynı dosya sisteminde olduğu garanti edilir) indirir ve daha sonra geçici dosyaları eski dosyalara yerleştirir, izinler, sahiplik ve ACL'ler gibi meta verileri korur. Linux'ta bu son adıma nasıl ulaşacağımı merak ediyorum.Meta veri kaybı olmadan Linux'ta atomik dosya kaydetme

Mac OS X'te, en azından C'de, exchangedata işlevini kullanırdım. Bu, iki dosya ismini argüman olarak alır ve içeriklerini değiştirir ve tüm meta verileri (mtime dışında) sağlam bırakır. Operasyonun atomik olmasını garanti eder - tüm okuyucular ya eski dosyayı ya da yenisini görürler, asla aralarında bir şey olmaz. Maalesef, Linux'ta mevcut olduğunu sanmıyorum.

rename'un atomik olarak hareket ettiğini biliyorum, ancak meta verileri koruyamıyor. Öte yandan, dosyayı açıp, tüm meta verileri koruyacak, ancak bir atomik işlem olmayacak olan, yeni olanın içeriğiyle verilerin üzerine yazabilirim. Bu sorunu çözmek için herhangi bir öneriniz var mı?

+2

Ne tür meta veriler korumak için çok çalışıyorsunuz? Unix'te tüm var sahip/grup ve sahip/grup/herkes için izinler. Bu o kadar değişiyor ki senin için bir sorun olur mu? –

+0

Birçok Linux dosya sistemi, genişletilmiş öznitelikleri ve ACL'leri de destekler ve ayrıcalıklı olmayan bir kullanıcı, geçici dosyanın kullanıcı ve grubunu eskisiyle değiştirmek için gerekli izinlere sahip olmayabilir. Temel olarak, burada çok fazla incelik var, ve bunu halledecek bir şey olup olmadığını merak ediyorum. –

cevap

6

Burada gördüğüm tek yaklaşım, değiştirdiğiniz dosyadan meta verileri okumak, bunu geçici dosyaya uygulamak ve sonra geçici dosyayı eski dosya üzerinde yeniden adlandırmaktır.

+0

Tüm doğru meta verilerin ne olduğunu bilmek zor. Dosya öznitelikleri, genişletilmiş öznitelikler, ACL'ler, güvenlik etiketleri, dosya yetenekleri ve diğer dosya sistemi veya sisteme özel şeyler var ... – ephemient

+2

Bu, başlangıçta iyi bir şeyler listesi gibi görünüyor. "İyinin düşmanı harikadır." – jrockway

+0

Evet, eğer tam bir çözüm yoksa (ki şu ana kadarki gibi görünmüyorsa), problemi en azından kısmen doğru almak hiçte yoktan iyidir. “Rsync” bile bildiği/önemsediği sınırlı bir meta verilere sahiptir. – ephemient

4

Dosya Sistemi özgü (rename. Açıkçası, kaynak dosya özelliklerini korur), ama ...

XFS_IOC_SWAPEXT ioctl XFS iki dosya tanımlayıcıları kapsamlarını değiştirir.

#include <xfs/xfs.h> 
#include <xfs/xfs_dfrag.h> 

xfs_swapext_t sx = { 
    ..., 
    .sx_fdtarget = fd1, 
    .sx_fdtmp = fd2, 
    ... 
}; 
xfs_swapext(fd1, &sx); 

örneğin kullanım için xfs_fsr için kaynaklarına bakınız.