2009-11-07 14 views
7

Sto lavorando a uno strumento di sincronizzazione file basato su Perl. Scarica i file in una directory temporanea (che è garantita per essere sullo stesso file system del file reale) e quindi sposta i file temporanei in posizione su quelli vecchi, preservando i metadati come autorizzazioni, proprietà e ACL. Mi chiedo come raggiungere l'ultimo passaggio su Linux.Il file atomico salva su Linux senza perdere i metadati

Su Mac OS X, almeno in C, vorrei utilizzare la funzione . Questo prende due nomi di file come argomenti e scambia i loro contenuti, lasciando intatti tutti i metadati (oltre a mtime). Garantisce che l'operazione sia atomica: tutti i lettori vedranno il vecchio file o il nuovo, mai qualcosa nel mezzo. Sfortunatamente, non penso sia disponibile su Linux.

So che rename si muove atomicamente, ma non conserva i metadati. D'altra parte, potrei aprire il file e sovrascrivere i dati con il contenuto di quello nuovo, che conserverebbe tutti i metadati ma non sarebbe un'operazione atomica. Qualche suggerimento su come affrontare questo problema?

+2

Che tipo di metadati stai lavorando così duramente per preservare? Tutto quello che c'è in Unix è proprietario/gruppo e permessi per proprietario/gruppo/tutti. Questo cambia così tanto che sarebbe un problema per te? –

+0

Molti file system Linux supportano anche attributi e ACL estesi e un utente non privilegiato potrebbe non disporre delle autorizzazioni necessarie per modificare l'utente e il gruppo del file temporaneo in quello precedente. Fondamentalmente, c'è un sacco di sottigliezze coinvolte qui, e mi chiedo se qualcosa già esiste per gestirlo. –

risposta

6

L'unico approccio che vedo qui è leggere i metadati dal file che si sta sostituendo, applicarlo al file temporaneo e quindi rinominare il file temporaneo sul vecchio file. (rename conserva gli attributi di file sorgente, ovviamente.)

+0

Tuttavia, è difficile sapere quali siano i metadati corretti. Ci sono attributi di file, attributi estesi, ACL, etichette di sicurezza, capacità di file e altre cose specifiche del filesystem o del sistema ... – ephemient

+2

Sembra una buona lista di cose da cui partire. "Il nemico del bene è grande." – jrockway

+0

Sì, se non c'è una soluzione completa (che non sembra essere, finora), quindi ottenere il problema almeno in parte è meglio di niente. Anche 'rsync' ha un insieme limitato di metadati di cui è a conoscenza/a cui interessa. – ephemient

4

specifici file system, ma ...

Il XFS_IOC_SWAPEXT ioctl scambia le estensioni di due descrittori di file su XFS.

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

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

Vedere le origini a xfs_fsr ad esempio l'utilizzo.

Problemi correlati