Come potrei velocizzare un disco pieno dd?


64

Sto facendo un ddsu due unità identiche con questo comando:

 dd if=/dev/sda of=/dev/sdb bs=4096

Entrambi i dischi rigidi hanno lo stesso numero di modello ed entrambi hanno 1 TB di spazio di archiviazione. /dev/sda utilizza una dimensione di blocco di 4096. /dev/sdaè un'unità locale ed /dev/sdbè un carrello remoto. Potrei essere in grado di utilizzare i seguenti protocolli:

  • USB 2.0 HighSpeed ​​(attualmente il piano)
  • Clone Gigabit Over-The-Network (Davvero non voglio nemmeno provarlo)
  • USB3.0 (se trovo l'altro caddy dell'unità)
  • eSATA (se trovo / acquisto un cavo)
  • SATA (Se trovo / acquisto un cavo, devo amare le unità CD del laptop)

C'è un modo per eseguire questa copia dell'unità che richiede meno di 96 ore? Sono aperto all'utilizzo di strumenti diversi da dd.

Devo clonare le seguenti partizioni (inclusi gli UUID)

  • Partizione EFI Fat32 (*)
  • Partizione Windows NTFS (*)
  • Partizione HFS + OSX
  • EXT4 Ubuntu Partition (*)
  • Scambia partizione (*)

* Supportato da Clonezilla


Ho provato Clonezilla (ed è stato MOLTO più veloce), ma non supporta la copia intelligente HFS +, di cui ho bisogno. Forse la versione più recente supporta questo?

Quando ho creato il mio primo clone, ho fatto tutte le partizioni tranne HFS + ed è andata molto velocemente. (Non più di 3 ore in totale)


1
Probabilmente stai meglio usando qualcosa come clonezilla. ddcopia tutto , compreso lo spazio libero. Gli svantaggi diventano estremamente evidenti quando si hanno dischi di grandi dimensioni che non sono completamente pieni.
Boris the Spider,

È possibile acquistare un cavo SATA e collegare temporaneamente l'unità esterna a una porta SATA sulla scheda madre?
Mark Plotnick,

Forse qualcuno potrebbe approfondire quanto segue: Che ne dite di clonare la tabella delle partizioni (usando clonezilla o dd), usando Clonezilla per clonare tutte le partizioni eccetto HFS +, e usare dd per quella partizione? Sarebbe fattibile?
Alexander,

@Alexander Ecco come ho creato il mio primo clone.
Kaz Wolfe,

1
@LuisAlvarado Ho appena avviato il clone, amico!
Kaz Wolfe,

Risposte:


71

Nella mia esperienza, non penso che ci sia qualcosa di più veloce nella riga di comando come dd. La regolazione del bsparametro può aumentare la velocità, ad esempio, ho 2 HDD che conosco hanno una velocità di lettura / scrittura maggiore di 100 MB / s, quindi faccio questo:

dd if=/dev/sda of=/dev/sdb bs=100M

C'è anche pv(deve essere installato prima) che verifica la velocità più elevata su entrambi i dischi e quindi procede alla clonazione. Questo deve essere fatto ovviamente da root:

pv < /dev/sda > /dev/sdb

Con PV ho ottenuto 156 MB / s

La cosa bella a pvparte la velocità è che mostra i progressi, la velocità attuale, il tempo dall'inizio e l'ETA. Per quanto riguarda HFS + non lo saprei, sto solo cercando di aiutare nella parte "speed". Con pvo un bsparametro molto ottimizzato , è possibile eseguire un'unità da 4 TB in meno di 7 ore (6 ore e 50 minuti a una velocità corrente di 150 MB / s).

inserisci qui la descrizione dell'immagine

Ho fatto un paio di test con i tipi di connessione che stavi usando e altri che avevo a disposizione. Stavo usando l'Asus Z87 Pro e l'Intel DZ68DP. Questi erano i miei risultati, ma prima dobbiamo sapere che le velocità teoriche per molte velocità di trasferimento (velocità Raw) sono proprio questo, teoria . Fare test reali ha rivelato che sono tra il 40% e l'80% di quella velocità grezza. Questo test può variare a seconda del dispositivo utilizzato, del tipo di connessione, della scheda madre, del tipo di cavo di collegamento, del tipo di file system e altro. Con questo in mente, questo è quello che ho ottenuto (ho testato solo la velocità di scrittura sul dispositivo, la lettura è in genere superiore):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 

3
invia il segnale USR1, per ottenere i progressi di dd. Lo svantaggio di dd è che copia spazio libero.
jfs,

1
Nella mia esperienza, la regolazione del bsparametro può rendere ddpiù veloce cat. Potresti anche usare catin primo luogo.
Gilles 'SO- smetti di essere malvagio' il

3
pvda solo funziona molto bene.
Kaz Wolfe,

11
Puoi usare dd per fare il lavoro ma inserisci pv nella catena per monitorare la velocità di trasferimento in questo modo:dd if=/dev/sda1 | pv | dd of=/dev/sdb1
thomasrutter,

4
L'ho sempre usato pvtra una dds e l'altra. Non ho mai saputo che potesse essere usato da solo!
Korylprince,

12

Per copiare una partizione all'ingrosso, utilizzare catinvece didd . Ho eseguito benchmark qualche tempo fa, copiando un file di grandi dimensioni anziché una partizione, tra due dischi (sullo stesso disco, i tempi relativi sono diversi):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3

La conclusione di questo benchmark è che la scelta della dimensione del blocco per ddquestioni (ma non così tanto) e cattrova automaticamente il modo migliore per fare una copia veloce: ddpuò solo rallentarti. Con un blocco di piccole dimensioni, ddfa perdere tempo a perdere piccole letture e scritture. Con blocchi di grandi dimensioni, un disco rimane inattivo mentre l'altro sta leggendo o scrivendo. La velocità ottimale si ottiene quando un disco legge mentre l'altro scrive.

Per copiare una partizione, potrebbe essere più veloce copiare i file con cp -a. Questo dipende da quanti file ci sono e dalla quantità di spazio libero nel filesystem. La copia dei file ha un sovraccarico approssimativamente proporzionale al numero di file, ma d'altra parte la copia dello spazio libero fa perdere tempo.

La velocità massima dei dati per USB2 è leggermente inferiore a 50 MB / s, il che richiede da 6 a 7 ore per trasferire 1 TB. Ciò presuppone un disco rigido abbastanza veloce da saturare il bus USB; Penso che le unità a 7200 giri / min più veloci possano farlo, ma 5900 giri / min potrebbero non essere così veloci (forse sono per le scritture lineari?).

Se uno dei due dischi viene utilizzato in parallelo, ciò può rallentare notevolmente la copia poiché le testine del disco dovranno spostarsi.


Sto provando a copiare un intero disco però.
Kaz Wolfe,

Mi aspetto che la differenza sia dello stesso ordine, ma eseguo un benchmark sul tuo sistema per ottenere dati più affidabili.
Gilles 'SO- smetti di essere malvagio' il

Può catessere usato per dd if=ubuntu.iso of=/dev/usb? ddLa velocità di farlo su USB2 o USB3 è frustrantemente lenta.
Oxwivi,

1
@Oxwivi Sì, cat ubuntu.iso >/dev/usbè esattamente equivalente. Non c'è magia in dd, è solo uno strumento per copiare il suo input nel suo output.
Gilles 'SO- smetti di essere malvagio' il

Il comando cat indicato sopra non funzionava su un mac. Ho provato a sudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1restituire "-bash: / dev / disk1: autorizzazione negata"
No

12

Il problema è il tipo di connessione e la dimensione del blocco. Per risultati più rapidi, la dimensione del blocco dovrebbe essere la metà della velocità di scrittura più bassa che si riceve in genere. Questo ti darà un margine sicuro, ma consentirà comunque un numero elevato; ovviamente devi avere abbastanza RAM per contenere anche i dati.

Usb 2.0 è 12 megabit al secondo (Mbps), Usb 2.0 High Speed ​​è 480 Mbps. Questa è ovviamente la velocità pura; con 8 bit in un byte e sovraccarico dell'inquadratura, la velocità utilizzabile in MB / s è di solito un decimale. Quindi, ad esempio 480 raw, diventa utilizzabile 48 MB. Tieni presente che questo è il migliore matematico, nel mondo reale sarà un po 'più basso. Per le connessioni USB 2.0 ad alta velocità dovresti aspettarti una velocità massima di scrittura di circa 30-35 MB, a condizione che il dispositivo di archiviazione effettivo possa eguagliare o superare le velocità di connessione.


6
Unità nitpicking: USB 2.0 ad alta velocità è 480 Mbit / s = 60 MByte / s, velocità raw. La velocità utilizzabile non è un decimale, ma piuttosto circa l'80% della velocità grezza. La regola empirica "La velocità effettiva in MByte / s è 1/10 della velocità grezza in Mbit / s" è tuttavia valida.
jpa,

5

Sono d'accordo che la velocità non elaborata di un ddcomando ben sintonizzato ('pv') o 'cat' è difficile da battere, ma se c'è qualche problema con la copia (settore danneggiato, interruzione dell'alimentazione, errore dell'utente, ecc.) Allora devi iniziare al di sopra di.

Vorrei suggerire ddrescue - uno strumento FOSS che ha tutta la velocità di dd ma funzionerà attorno agli errori del disco e riprenderà in un secondo momento se si verifica un errore.


2

Sto spostando Windows 7 da un HDD a SSD e ho trovato questa e alcune altre risposte ... Qualcosa che ho imparato che potrebbe aiutare gli altri. Nel mio caso, l'unità sorgente è più grande, altrimenti avrei lavorato a livello di dispositivo / dev / sda -> / dev / sdb.

Win7 e le sue 3 partizioni ... Ho usato Xbuntu 14.04 live cd su un usb. È uscito il DVD del computer vincente e ha messo l'SSD al suo posto. Partclone installato e provato questo:

partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3

Partclone vomitato su NTFS che necessitava di eseguire chkdisk in Windows, quindi una soluzione rapida ha reso felice partclone:

ntfsfix -b /dev/sda3
ntfsfix -d /dev/sda3

Tutti i comandi vengono eseguiti come root. L'interfaccia utente ncurses di Partclone (l'opzione -N) ha affermato che il trasferimento era di 7 GB / min e si è concluso con 5 GB / min, il che equivale a 83 MB / sec. La gran parte è che il partclone non copia lo spazio inutilizzato, quindi questo ha reso il clone notevolmente veloce.

Ulteriori potenziali gotchya:

  • se l'unità a cui si sta trasferendo è stata utilizzata in precedenza, potrebbe contenere resti di un GPT. Le installazioni di fabbrica di Windows 7 sono generalmente tabelle di partizione msdos / mbr. Dovrai rimuovere i frammenti GPT dall'unità di destinazione. Questo QA Unix e Linux mi ha aiutato in questo. È necessario utilizzare gdisksul dispositivo, utilizzare x quindi z e yes per eseguire lo zapping dei dati GPT e assicurarsi di MANTENERE l'MBR.

  • E non dimenticare che se non esegui un livello di dispositivo dd, dovrai copiare l'MBR utilizzando
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    dove sdb è sorgente o unità precedente e sda ​​è destinazione o nuova unità ( origine )


1

Di recente ho creato un'immagine di una partizione da 100 GB (HDD) e l'ho scritta sul nuovo disco SSD.

Ecco un suggerimento che può velocizzare drasticamente il processo :)

Dividi il file in parti più piccole (più grande è il file, più lentamente funziona)

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

Durante il processo, è possibile verificare la velocità utilizzando (in un terminale separato)

pgrep -l '^dd$' #to find PROCESSID
kill -USR1 PROCESSID #to check the speed

Quindi, quando si dispone di una directory piena di file dei risultati (maindisk.img000, maindisk.img001 e così via ...) utilizzare

sudo cat maindisk.img* | sudo dd of=/dev/sda1

per "masterizzare" l'immagine nel nuovo partiton di SSD (la partizione deve avere le stesse dimensioni di quella precedente)

Per me ha funzionato molto più velocemente del solito (senza dividere). La velocità media di creazione dell'immagine era ~ 13 MB / s. Quando uso il modo "normale", inizia con ~ 15 MB / se poi diminuisce a 1 MB / s.


1
Perché sarebbe più lento scrivere un file grande anziché più file più piccoli? Quali erano il tipo di file system di destinazione e i relativi flag di montaggio?
David Foerster,

Inoltre conv=syncè dannoso per le prestazioni e piuttosto inutile in questo caso d'uso.
David Foerster,

0

Per chiunque trovi questo thread, è molto più facile e veloce usare solo uno strumento progettato per il recupero dei dati come ddrescue . Cerca innanzitutto di salvare le parti buone in caso di errori di lettura. Inoltre è possibile interrompere il salvataggio in qualsiasi momento e riprenderlo successivamente nello stesso punto.

Eseguilo due volte:

Primo round, copia ogni blocco senza errori di lettura e registra gli errori su rescue.log.

sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log

Secondo round, copia solo i blocchi danneggiati e prova 3 volte a leggere dalla fonte prima di arrenderti.

sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log

Ora puoi montare la nuova unità e controllare la corruzione del file system.

Ulteriori informazioni:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html


0

Raccomando di inserire / leggere - file / disco su SATA per aumentare la velocità di lettura. La velocità USB 2.0 è buona anche perché sto ottenendo velocità medie di 33816 kb / s con ddrescue rispetto a quando l'impostazione era da USB 2.0 a SATA a 2014 kb / s


0

Utilizzare una dimensione di blocco diversa. È la quantità di dati che ddlegge alla volta. Se si legge troppo poco, si trascorre una maggiore quantità di tempo nella logica del programma e se si legge troppo, si impiega molto tempo a spostare i dati di grandi dimensioni.

Per misurare la velocità con blocchi di dimensioni diverse, utilizzare il seguente bashscript:

  • impostato $devsul dispositivo
  • risolto cbtotalper essere almeno 5 volte la velocità di lettura prevista
    (set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256;
    for power in `seq 10`; do
      bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs));
      if [ "$count" -lt 1 ]; then break; fi;
      echo $bs;
      dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count
      skip=$((skip+count))
    done)

Il risultato può essere distorto verso una dimensione maggiore a causa della lettura del disco in anticipo - ecco perché è importante impostare cbtotalabbastanza grande.

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.