alternativa più veloce a cp -a


9

Per un semplice trasferimento di / home su un altro disco cp -ache uso mi sembra un modo estremamente lento. Dovrebbe sapere un modo più efficiente per completare l'attività. Ho / home montato come volume logico, ma il disco di destinazione non è un sistema LVM


4
Se cpè lento, anche altri metodi sarebbero lenti. A meno che non si tratti di una copia orientata ai file
daisy il

Prova a diagnosticare il collo di bottiglia, a seconda della tua configurazione specifica. È possibile provare l' noatimeopzione mount per ridurre le scritture non necessarie, in particolare sul file system di origine.
Elias Torres Arroyo

Risposte:


16

Provate tar, pax, cpio, con qualcosa di buffering.

(cd /home && bsdtar cf - .) |
  pv -trab -B 500M |
  (cd /dest && bsdtar xpSf -)

Suggerisco bsdtarinvece tarperché almeno su alcune distribuzioni Linux tarè tar GNU che contrariamente a bsdtar(da libarchive) non gestisce la conservazione di attributi estesi o ACL o attributi di Linux.

pvbufferizzerà fino a 500 milioni di dati in modo da poter meglio gestire le fluttuazioni della velocità di lettura e scrittura sui due file system (anche se in realtà, probabilmente avrai un disco più lento rispetto all'altro e il meccanismo di riscrittura del sistema operativo farà quel buffering come bene quindi probabilmente non farà molta differenza). Le versioni precedenti di pvnon supportano -a(per i rapporti sulla velocità media), è possibile utilizzare pv -B 200Mda soli lì.

In ogni caso, quelli non avranno la limitazione di cp, cioè le letture e le scritture in sequenza. Qui ne abbiamo due che tarlavorano contemporaneamente, quindi uno può leggere un FS mentre l'altro è impegnato ad aspettare che l'altro FS finisca di scrivere.

Per ext4 e se stai copiando su una partizione grande almeno quanto l'origine, vedi anche clone2fscome funziona ntfsclone, ovvero copia solo i blocchi allocati e in sequenza, quindi l'archiviazione rotazionale sarà probabilmente la più efficiente.

partclone lo generalizza a pochi file system diversi.

Ora alcune cose da prendere in considerazione quando si clona un file system.

La clonazione avrebbe copiato tutte le directory, i file e i loro contenuti ... e tutto il resto. Ora tutto il resto varia da file system a file system. Anche se consideriamo solo le funzionalità comuni dei file system Unix tradizionali, dobbiamo considerare:

  • collegamenti: collegamenti simbolici e collegamenti reali. A volte, dovremo considerare cosa fare con i symlink assoluti o i symlink che indicano la clonazione del file system / directory
  • ultima modifica, accesso e tempi di modifica: solo i primi due possono essere copiati utilizzando l'API del filesystem (cp, tar, rsync ...)
  • scarsità: hai quel file sparso da 2 TB che è un'immagine del disco della VM che occupa solo 3 GB di spazio su disco, il resto è scarso, fare una copia ingenua riempirebbe l'unità di destinazione.

Quindi, se consideri ext4e la maggior parte dei file system Linux, dovrai considerare:

  • ACL e altri attributi estesi (come quelli utilizzati per SELinux)
  • Attributi Linux come flag immutabili o solo append

Non tutti gli strumenti supportano tutti questi, o quando lo fanno, devi abilitarlo esplicitamente come --sparse, --acls... opzioni di rsync, tar... E quando copi su un diverso filesystem, devi considerare il caso in cui non lo fanno supporta lo stesso set di funzionalità.

Potrebbe anche essere necessario considerare gli attributi del file system stessi come l'UUID, lo spazio riservato per root, la frequenza fsck, il comportamento di journaling, il formato delle directory ...

Quindi ci sono file system più complessi, in cui non è possibile davvero copiare i dati copiando i file. Considera ad esempio zfso btrfsquando puoi scattare istantanee di sottovolumi e diramarli ... Questi avrebbero i loro strumenti dedicati per copiare i dati.

La copia da byte a byte del dispositivo a blocchi (o almeno dei blocchi allocati quando possibile) è spesso la più sicura se si desidera assicurarsi di copiare tutto. Ma fai attenzione al problema dello scontro UUID, e questo implica che stai copiando qualcosa di più grande (anche se potresti ridimensionare una copia istantanea della fonte prima di copiare).


1
Tar GNU ha l' --aclsopzione, per memorizzare gli ACL nell'archivio. E sarei sorpreso se uno strumento alieno (di qualche tipo) bsdtarlo gestisce meglio di quello (essenzialmente) nativo ...
vonbrand

@vonbrand. Il tuo tar deve essere stato patchato per questo (penso che RedHat abbia una patch per tar GNU per ACL), perché l'ultima versione di tar GNU non supporta tale opzione. Ci sono una serie di implementazioni di tarLinux ( star, bsdtar, tar), non sono consapevoli del fatto che GNU tar sia migliore rispetto agli altri. La scelta degli strumenti GNU è generalmente più politica che tecnica (vedi ad esempio bash).
Stéphane Chazelas

1
L'uso degli strumenti GNU potrebbe essere una scelta politica, ma è comunque la scelta predefinita. E poiché sono molto più popolari delle alternative, c'è anche più forza lavoro sviluppatore (e altro) dietro di loro.
vonbrand

grazie, la prossima volta userò pv e tar piuttosto che cp
Yurij73

@ StéphaneChazelas Attualmente GNU tar supporta--acls
Ploni l'

4

Raccomando rsync, ad esempio:

rsync -av --progress --stats dest orig

Oppure, per trasferire con la compressione:

rsync -avz --progress --stats dest orig

1
rsyncè generalmente molto più lento di cpotar|tar
Stéphane Chazelas

Grazie per queste informazioni :) ma non ho mai confrontato questi due ...
Victor Aurélio


Non mi fiderei troppo di quell'articolo. Uso rsync abbastanza frequentemente e una copia normale a 130-170 MB / sec.
laebshade

9
rsyncè per lo più efficiente se hai già parzialmente i dati di origine disponibili sul volume di destinazione perché trasferirà solo i dati mancanti / modificati. Non lo userei per una "prima copia" veloce.
Totor
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.