Esiste un filesystem che conserva solo una copia di un file e altre copie sono solo riferimenti?


18

La domanda potrebbe essere imprecisa, quindi cercherò di spiegarla in modo più dettagliato.

Per una serie di motivi ho molte copie dello stesso file sul mio file system Linux. Molti di loro sono abbastanza grandi.

Di 'che ho /path/to/some.filee copie di questo file /other/path/file.namee /yet/another/path/third.copy. Mi chiedo se esiste un file system che farebbe letteralmente fare in modo che due di questi file fungano da riferimento all'originale. Naturalmente, se l'utente ne modifica uno, allora e solo allora diventano file indipendenti.

PS. So che questo può essere (parzialmente) realizzato utilizzando i collegamenti. Ma voglio che questa funzione che ho provato a spiegare sopra sia gestita in modo trasparente dal file system.


Dal momento che non sembra esserci ancora una risposta perfetta, perché non scrivere uno script (forse eseguito da cron) che sostituisce i file con collegamenti reali (o, se è sicuro per alcuni di essi, collegamenti simbolici)? In ogni caso, se non sai già dove sono tutti i duplicati, dai un'occhiata a fdupes code.google.com/p/fdupes .
Joe,

1
Non posso farlo perché quando alcuni utenti modificano i dati in uno dei duplicati, dovrebbero diventare file indipendenti perché il contenuto è diverso dopo la modifica ... Se creo collegamenti simbolici, la modifica cambierà effettivamente l'originale. Pensa al file originale come un valore in un linguaggio di programmazione funzionale: quando lo modifichi, ottieni letteralmente un nuovo oggetto e fai riferimento ad esso.
DejanLekic,

OK. Solo alcune idee: c'è un modo per ottenere tra i tuoi utenti e questi file? Se è possibile, è possibile iniziare con un collegamento (sym o hard) e quindi interrompere il collegamento se scrivono qualcosa nel file. Puoi anche usare qualcosa come diff per memorizzare le differenze per risparmiare molto spazio come in un sistema di controllo della versione. Se metti i file in uno di questi, potrebbe gestire le differenze per te. Non ho usato molto i sistemi vcs, quindi non conosco i dettagli.
Joe,

Risposte:


17

Questa funzione si chiama deduplicazione . Nessuno dei popolari filesystem Linux (ext *) lo supporta, ma a quanto pare, ZFS lo supporta parzialmente . Esiste anche una tabella con l' elenco dei filesystem , tra gli altri, la deduplicazione, ma non sembra esserci alcuna scelta popolare, ma è una funzionalità pianificata per Btrfs.

Immagino che controllare periodicamente il tuo filesystem e creare collegamenti corretti appropriati sia il meglio che puoi fare al momento, anche se ciò non implica la copia su scrittura.


Speravo che BTRFS lo avesse già allettato. Non sapevo che intendessero avere questa funzione - buone notizie! Grazie!
DejanLekic,

10

La parola chiave principale che si desidera cercare è "copia in scrittura". BTRFS ha un'operazione di clonazione che fa esattamente quello che vuoi e cp --reflinkfarà quello che stai cercando, a condizione che il tuo sistema abbia un kernel abbastanza moderno e coreutils 7.5. Wiki Source Inoltre, bedup è uno strumento che unirà i duplicati su un intero volume. Il CoW è anche la caratteristica di guida alla base della tecnologia snapshot di btrfs, IIRC.


Sono a conoscenza, cp --reflinkma noto che in realtà voglio che FS rilevi i cloni e usi invece i riferimenti, in modo trasparente. Sono anche lontano dallo bedupstrumento.
DejanLekic,

Quando un processo a livello di utente legge da un file e scrive su un altro, come fa il layer FS a sapere che è una copia esatta e non una copia modificata? Ecco perché esiste un ioctl separato per la clonazione rispetto alla sola lettura e scrittura. Le applicazioni che vogliono clonare file e vogliono usare CoW dovrebbero usare queste cose quando disponibili e ricorrere altrimenti. Non esiste un metodo magico affidabile mediante il quale il layer FS è in grado di rilevare una copia in corso e di eseguire invece CoW. Un'app deve utilizzare la chiamata corretta per il lavoro ( cp --reflink/ clone) o uno strumento separato per terminare il lavoro in un secondo momento (bedup).
Afrazier

Confrontando gli hash (più sicuri) o i valori crc + timestamp. Scrivere indurrebbe sicuramente FS a creare una copia indipendente di un file. Inoltre, questo sistema può essere implementato a livello di pagina ...
DejanLekic,

E dove esattamente è fatto nel kernel? Quello di cui stai parlando non è un problema semplice. Farlo a livello di pagina è anche possibile, ma richiede enormi quantità di RAM per essere in linea - ZFS può essere più di 20 GB di RAM per TB di dati [Fonte ] e OpenDedup vuole 8 GB di RAM per TB di dati w / 4k pagine [Fonte ]. I requisiti di ZFS possono essere ridotti con L2ARC a scapito delle prestazioni.
Afrazier

1
WHS non esegue il dedup, a meno che non si stia parlando dell'archivio di backup. Nel caso del software di backup, il client può eseguire la maggior parte del lavoro e verificare l'hash con il server prima di inviargli qualsiasi dato da scrivere. Un servizio di backup è una bestia molto diversa da un filesystem. Le strategie che funzionano per uno potrebbero non essere praticabili per un altro.
Afrazier

4

Esiste un file system online S3QL progettato per i backup con una grande capacità di deduplicazione.


Avrei dovuto dire che ne avevo bisogno per un filesystem locale ... +1 comunque per informazioni utili.
DejanLekic,

@DejanLekic, sono ammessi URL come local: // ....
Daniel Fanjul,

0

Zfs, btrfs, ext3cow, bcachefs (afaik, ma c'è una possibilità che non sia ancora implementato). Microsoft ne aveva uno in sviluppo ma si sono fermati per motivi sconosciuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.