Copia di un albero di directory di grandi dimensioni localmente? cp o rsync?


230

Devo copiare un grande albero di directory, circa 1,8 TB. È tutto locale. Per abitudine userei rsync, tuttavia mi chiedo se c'è molto senso e se dovrei piuttosto usare cp.

Sono preoccupato per i permessi e uid / gid, dal momento che devono essere conservati nella copia (so che rsync lo fa). Così come cose come symlink.

La destinazione è vuota, quindi non devo preoccuparmi di aggiornare in modo condizionale alcuni file. È tutto il disco locale, quindi non devo preoccuparmi di ssh o di rete.

Il motivo per cui sarei tentato di allontanarmi da rsync, è perché rsync potrebbe fare più del necessario. file checksum rsync. Non ne ho bisogno e sono preoccupato che potrebbe richiedere più tempo di cp.

Quindi cosa ne pensi, rsynco cp?


2
Se rsync fa esattamente quello che vuoi che faccia, se hai già abbastanza familiarità con il suo utilizzo per questa particolare applicazione e se funziona abbastanza velocemente per soddisfare i tuoi gusti, allora perché mai vorresti cambiare?
undici81

2
Perché sono preoccupato che rsync impiegherà più tempo di cp, dal momento che rsync fa un sacco di checksum che cp non farà
Rory

1
Il sovraccarico della CPU del checksum è piccolo rispetto agli I / O del disco / rete. A meno che il disco non si trovi sullo stesso sistema e il sistema operativo sia in grado di eseguire una copia intelligente dell'unità disco nel controller del bus.
Martin Beckett,

3
Il checksum viene eseguito su file che differiscono per dimensione e controllo data / ora. Se sei paranoico (come dopo un'interruzione di corrente durante la copia) puoi forzare il checksum su tutti i file, ma su un trasferimento locale, che di solito è più lento rispetto a partire da zero.
Korkman,

3
Forse è curioso di migliorare il suo flusso di lavoro e non seppellisce la testa nella sabbia pensando di sapere tutto. Questo commento mi dà davvero fastidio.
Martin Konecny,

Risposte:


204

Vorrei usare rsync in quanto significa che se viene interrotto per qualsiasi motivo, è possibile riavviarlo facilmente con un costo molto basso. Ed essendo rsync, può anche riavviare in parte attraverso un file di grandi dimensioni. Come altri citano, può escludere facilmente i file. Il modo più semplice per preservare la maggior parte delle cose è usare la -abandiera - 'archivio'. Così:

rsync -a source dest

Sebbene UID / GID e collegamenti simbolici siano conservati da -a(vedi -lpgo), la tua domanda implica che potresti voler una copia completa delle informazioni del filesystem; e -anon include hard-link, attributi estesi o ACL (su Linux) o precedenti o fork di risorse (su OS X.) Pertanto, per una copia affidabile di un filesystem, è necessario includere tali flag:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

Il cp predefinito ricomincerà, sebbene il -uflag "copierà solo quando il file SOURCE è più recente del file di destinazione o quando manca il file di destinazione" . E il -aflag (archivio) sarà ricorsivo, non ricopia i file se è necessario riavviare e conservare le autorizzazioni. Così:

cp -au source dest

5
Il flag -u di cp probabilmente non è la soluzione migliore, in quanto non rileverebbe un file parzialmente copiato / corrotto. La cosa bella di rsync è che puoi far sì che md5 somma i file per rilevare le differenze.
Chad Huneycutt,

3
L'aggiunta dell'opzione -w (--whole-file) velocizzerebbe un rsync interrotto, in quanto copierà semplicemente il file anziché il checksum.
hayalci,

13
in realtà, rsync rileva i trasferimenti locali e abilita la copia di file interi senza checksum automagicamente.
Korkman,

22
e - progresso che è davvero utile!
Matt,

12
-P o --progress mostra i progressi per ciascun file individualmente. È utile per copiare file di grandi dimensioni, non per molti (migliaia) file di piccole dimensioni in quanto significa un output molto maggiore che non è possibile leggere. Non mostra l'avanzamento generale di tutti i file combinati.
SPRBRN,

106

Quando si copia sul file system locale, utilizzo sempre le seguenti opzioni rsync:

# rsync -avhW --no-compress --progress /src/ /dst/

Ecco il mio ragionamento:

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

Ho visto trasferimenti più rapidi del 17% usando le impostazioni rsync sopra sopra il seguente comando tar come suggerito da un'altra risposta:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
Sto rsync: --no-compress: unknown optionriscontrando il seguente errore: @Ellis Percival.
alper,

Questo è velocissimo. Più veloce di farlo di rm -rf /src/.
DGO

2
Come @alper, --no-compress non era un'opzione per la mia versione di rsync (in CentOS 7); Ho usato --compress-level = 0 invece.
Paul,

79

Quando devo copiare una grande quantità di dati, di solito uso una combinazione di tar e rsync. Il primo passo è tarare, qualcosa del genere:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

Di solito con una grande quantità di file, ce ne saranno alcuni che tar non può gestire per nessun motivo. O forse il processo verrà interrotto, o se si tratta di una migrazione del filesystem, potresti voler fare la copia iniziale prima dell'effettiva fase di migrazione. Ad ogni modo, dopo la copia iniziale, faccio un passo rsync per sincronizzare tutto:

# cd /dst; rsync -avPHSx --delete /src/ .

Si noti che la barra finale /src/è importante.


6
+1 Ho trovato che tar è generalmente più veloce per copie di grandi dimensioni rispetto a rsync. Mi piace anche l'idea di finire con un rsync finale.
Geoff Fritz,

2
tar è una buona scelta se la directory dest è vuota. Anche se la mia strada sarebbe: cd $ DSTDIR; tar c -C $ SRCDIR. | tar
asdmin,

19
Questa è la bellezza di questo metodo. Non è necessario raddoppiare lo spazio perché non si crea effettivamente un file tar intermedio. Il tar prima del pipe impacchetta i dati e li trasmette allo stdout, e il tar dopo il pipe lo prende dallo stdin e lo decomprime.
Chad Huneycutt,

4
Ho fatto un cp -a per un trasferimento di 12 GB e questo metodo per un trasferimento di 42 GB. Il metodo tar ha richiesto circa 1/4 del tempo.
NGaida,

3
Ho anche messo pvnel mezzo per poter vedere i progressi, stimando la dimensione di tutti i dati usando df. Ho anche usato --numeric-owner, poiché il disco di origine proveniva da un altro sistema e non volevo tarrovinare i proprietari:tar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
Petr Pudlák,

14

rsync

Ecco la rsync che uso, preferisco cp per comandi semplici, non questo.

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

Ecco un modo ancora più sicuro, cpio. È veloce quanto il catrame, forse un po 'più veloce.

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

catrame

Anche questo è positivo e continua in caso di errori di lettura.

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

Nota che sono tutti solo per copie locali.


Perché usi i flag -S e -D per rsync?
Miyalys,

7

Qualunque cosa tu preferisca. Basta non dimenticare l' -ainterruttore quando si decide di utilizzare cp.

Se hai davvero bisogno di una risposta: userei rsync perché è molto più flessibile. È necessario arrestare prima che la copia sia completa? Basta ctrl-c e riprendere non appena la schiena. Devi escludere alcuni file? Basta usare --exclude-from. Devi modificare la proprietà o le autorizzazioni? rsync lo farà per te.


Cosa fa di nuovo il flag -p?
Rory,

1
Preserverà la proprietà, i timestamp e le autorizzazioni.
innaM

5
cp -a sarebbe meglio.
David Pashley,

Infatti. La risposta è cambiata di conseguenza.
innaM,

7

Il rsynccomando calcola sempre i checksum su ogni byte che trasferisce.

L'opzione della riga di comando --checksumriguarda solo se i checksum dei file vengono utilizzati per determinare quali file trasferire o meno, ovvero:

-c, --checksum salta in base al checksum, non a mod-time e dimensioni "

La manpage dice anche questo:

Si noti che rsync verifica sempre che ogni file trasferito sia stato correttamente ricostruito sul lato ricevente controllando il checksum dell'intero file, ma che la verifica automatica dopo il trasferimento non ha nulla a che fare con questa opzione prima del trasferimento "Questo file ha bisogno di per essere aggiornato? " dai un'occhiata.

Quindi rsync, sempre, calcola sempre un checksum dell'intero file sul lato ricevente, anche quando l' -c/ --checksumopzione è "off".


14
Mentre il tuo post ha aggiunto alcune informazioni interessanti qui, i rant e gli insulti diminuiscono il valore del tuo post. Questo sito non è un forum per inviti non costruttivi. Se sei riuscito a modificare l'origine, hai inviato le modifiche come patch? Hai pubblicato la tua versione su github o qualcosa del genere? Se ti senti così fortemente su questo, potrebbe essere meglio se provassi a fare qualcosa di un po 'più costruttivo invece di essere inutilmente offensivo.
Zoredache,

Sì, l'ultimo paragrafo non era davvero necessario.
Volo Sherwin,

6

rsync -aPhW --protocol=28aiuta ad accelerare quelle copie di grandi dimensioni con RSYNC. Vado sempre in sincronia perché il pensiero di essere a metà di 90GiB e la sua rottura mi spaventa dal CP


2
Qual è il valore dell'utilizzo del protocollo precedente in quella stringa di comando?
ewwhite,

1
Su una macchina Mac la versione precedente di Rsync spedita si blocca su alcuni nuovi regimi di protocollo rsync come 29. Dire che per passare al protocollo precedente non lo fa controllare più e più volte.
oneguynick,

Immagino che il numero 28 non sia più valido?
SPRBRN,

5

rsync è eccezionale, ma ha problemi con alberi di directory molto grandi perché memorizza gli alberi in memoria. Stavo solo cercando di vedere se avrebbero risolto questo problema quando ho trovato questo thread.

Ho anche trovato:

http://matthew.mceachen.us/geek/gigasync/

È inoltre possibile spezzare manualmente l'albero ed eseguire più rsync.


12
Se usi la versione 3 non mantiene l'intero albero in memoria se è grande, usa un algoritmo di ricorsione incrementale: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

5

Questo thread è stato molto utile e poiché c'erano così tante opzioni per ottenere il risultato, ho deciso di metterne a confronto alcuni. Credo che i miei risultati possano essere utili per gli altri hanno un'idea di cosa ha funzionato più velocemente.

Per spostare 532 Gb di dati distribuiti tra 1.753.200 file abbiamo avuto quei tempi:

  • rsync ci sono voluti 232 minuti
  • tar ci sono voluti 206 minuti
  • cpio ci sono voluti 225 minuti
  • rsync + parallel ci sono voluti 209 minuti

Nel mio caso ho preferito usare rsync + parallel. Spero che queste informazioni aiutino più persone a decidere tra queste alternative.

Il benchmark completo è pubblicato qui


404 pagina non trovata
Amedee Van Gasse

1
Grazie @AmedeeVanGasse Gli URL sono stati corretti poco dopo la segnalazione :)
Arjones,

Perché non fare benchmarking cp? Questo è il titolo della domanda!
calandoa,

@calandoa Penso che cpsia insicuro, cioè: quando si rompe devi ricominciare, è così che preferisco le opzioni che possono riprendere, ergo rsyncè il mio preferito :)
arjones

3

Quando eseguo localmente una copia della directory locale, la mia esperienza è che "cp -van src dest" è il 20% più veloce di rsync. Per quanto riguarda la ristartabilità, ecco cosa fa "-n". Hai solo bisogno di rm il file parzialmente copiato. Non doloroso, a meno che non sia un ISO o alcuni di questi.


2

ARJ È COSÌ VECCHIA SCUOLA !! Dubito davvero che ARJ e / o rsync daranno prestazioni.

Sicuramente quello che faccio sempre è usare cpio:

find . -print | cpio -pdm /target/folder

Questo è quasi veloce di CP, decisamente più veloce di tar e senza tubazioni.


2
"L'originale cpio e find utilities sono stati scritti da Dick Haight mentre lavorava nel Unix Support Group di AT&T. Sono apparsi per la prima volta nel 1977 in PWB / UNIX 1.0" - la cpiopagina man di FreeBSD .
Chris S,

3
cpiopurtroppo ha un limite superiore di 8 GB per i file.

" senza convogliare nulla " [sic]. Tranne il findcomando, come lo hai elencato, contiene una pipe:find . -print | cpio -pdm /target/folder
warren

1

Sicuramente vuoi provare rclone . Questa cosa è follemente veloce:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

Questa è una copia locale da e verso un SSD LITEONIT LCS-256 (256 GB).

È possibile aggiungere --ignore-checksumalla prima esecuzione per renderlo ancora più veloce.



0

tar farebbe anche il lavoro, ma non riprenderà dall'essere interrotto come farà rsync.


Una vecchia risposta, ma non è TAR per la creazione di archivi compressi di file? Come potrebbe essere usato per trasferire file come rsync o cp?
Volo Sherwin,

@SherwinFlight sorgente cd; tar cf -. | (cd dest; tar xf -)
pg

0

E se usi ARJ?

arj a -jm -m1 -r -je filepack /source

dove -jm -m1sono i livelli di compressione e lo -jerende un eseguibile. Ora hai un bash incapsulato di file.

Quindi per l'estrazione sulla mappa di destinazione

filepack -y  

dove verrà creata la mappa di origine (dove -yè sempre accettare, sovrascrivere, saltare ecc.)

Si può quindi scp ftp il filepack nell'area di destinazione ed eseguirlo, se ciò è possibile.


1
Arj? Non è morto negli anni '80?
Michael Hampton

forse all'inizio degli anni '90 se credi a Wikipedia
Matt,

0

Ci sono alcune accelerazioni che possono essere applicate a rsync:

Evitare

  • -z/ --compress: la compressione caricherà la CPU solo perché il trasferimento non è su una rete ma su RAM.
  • --append-verify: riprende un trasferimento interrotto. Sembra una buona idea, ma presenta un pericoloso caso di errore: qualsiasi file di destinazione della stessa dimensione (o maggiore) rispetto alla fonte verrà IGNORATO. Inoltre, esegue il checksum dell'intero file alla fine, il che significa che non si accelera significativamente --no-whole-filedurante l'aggiunta di un caso di errore pericoloso.

Uso

  • -S/ --sparse: trasforma sequenze di null in blocchi sparsi
  • --partialo -Pche è --partial --progress: salva tutti i file parzialmente trasferiti per il futuro ripristino. Nota: i file non avranno un nome temporaneo, quindi assicurati che nient'altro si aspetti di utilizzare la destinazione fino al completamento dell'intera copia.
  • --no-whole-filein modo che tutto ciò che deve essere reinviato utilizzi il delta transfer. La lettura della metà di un file parzialmente trasferito è spesso molto più rapida della scrittura di nuovo.
  • --inplace per evitare la copia del file (ma solo se nulla sta leggendo la destinazione fino al completamento dell'intero trasferimento)
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.