Qualunque file system implementa il meccanismo Copia su scrittura per CP


16

Abbiamo visto l'OS fare l'ottimizzazione di Copia su scrittura durante il fork di un processo. Il motivo è che la maggior parte delle volte il fork è gestito da exec, quindi non vogliamo sostenere il costo delle allocazioni di pagina e della copia dei dati dallo spazio degli indirizzi del chiamante inutilmente.

Questo succede anche quando si esegue CP su un Linux con file system ext4 o xfs (journaling). Se ciò non accade, perché no?


Spero che qualcuno risponderà a questa interessante domanda
Karim Manaouil,

Tuttavia, non penso perché, ad esempio, la copia di un file di grandi dimensioni richiederebbe molto più tempo (copia dei dati in nuovi blocchi). Se ci fosse un COW in tali filesystem (almeno ext3 / ext4) non noteresti la latenza temporale (forse in tal caso replicando solo l'inode senza puntatori a blocchi di dati e contrassegnando qualche flag COW).
Karim Manaouil,

Copy-on-Write è implementato su ZFS e ha davvero cloni di file system / volume molto economici. ext4 / xfs ha un formato su disco troppo primitivo, credo, per supportarlo
myaut

Risposte:


7

La parola chiave da cercare è reflink. È stato recentemente implementato in XFS.

EDIT: l'implementazione XFS è stata inizialmente contrassegnata come SPERIMENTALE. Questo avviso è stato rimosso nella versione 4.16 del kernel, un numero di mesi dopo aver scritto quanto sopra :-).


11

Dalla cp pagina man :

Quando viene specificato --reflink [= always], eseguire una copia leggera, in cui i blocchi di dati vengono copiati solo quando modificati. Se ciò non è possibile, la copia ha esito negativo o se viene specificato --reflink = auto, tornare a una copia standard.

Funziona su file system che supportano Copy-on-Write ( reflink ), principalmente BTRFS al momento. L'implementazione del reflink XFS è in fase di sviluppo [1] [2] .


1
Alcuni file system di rete come NFS, CIFS, OCFS2 possono passare anche quelli al server.
Stéphane Chazelas,

2

Linux ha una chiamata di sistema che consente ai processi userspace di dire al kernel di fare una copia scrivendo copie dei file. FICLONERANGE e FICLONE usati come opzioni per consentire a ioctl di eseguire copie in scrittura di file e intervalli all'interno dei file.

Questo è usato da cp --reflink per fare le copie in cui il file system lo supporta.


1

A meno che non introduciate un syscall per cp(o almeno per copiare un blocco), il sistema operativo fa fatica a capire che i dati che il cpprogramma sta per scrivere sono gli stessi di quelli che ha appena letto da un altro blocco. Inoltre, avrai un overhead aggiuntivo per gestire lo scenario "più file condividono gli stessi blocchi". File simili di grandi dimensioni che differiscono solo in pochi blocchi si verificano raramente. Quindi, nel complesso, è più economico copiare quei blocchi, quindi aggiungere questo sovraccarico amministrativo a tutti i file.

Ora, se "copi" i file (molti di essi) aggiungendo un altro clone / istantanea del file system in, diciamo, BTRFS, la situazione è diversa: ora hai "copiato" tutti i file nel filesystem e qualsiasi modifica a saranno copia su scrittura. Questo esiste, ma non in ext4.

"Journalling" è un concetto completamente indipendente da quello, sono le strutture amministrative per i file che contano.


I file di grandi dimensioni, uno dei quali è una copia binaria dell'altro, estremamente rari, differiscono in un singolo bit e il capovolgimento è dovuto a un errore.
Bitifet,

È stata introdotta una chiamata di sistema per la copia (vedere la mia risposta).
Q l'ornitorinco
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.