Perché dd impiega troppo tempo?


17

Devo copiare un disco su un altro. Ho provato con il comando qui sotto e ci vuole quasi un giorno per copiare 1 TB di disco in federo.

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

Ho provato lo stesso su un sistema Unix (HP-UX) con il comando seguente e si completa in poche ore

dd if=/dev/sda of=/dev/rdsk

Qual è l'alternativa che potrei usare per copiare da un disco all'altro più velocemente?


2
cp /dev/sda /dev/sdbo ( pv /dev/sda > /dev/sdb per ottenere una barra di avanzamento) sarebbe molto più veloce. Perché dovresti usare ddqui? ddsarebbe utile solo per cose come conv=sync,noerrorgestire i dischi con errori, ma anche allora avrebbe più senso usare cose come ddrescueinvece (vedi anche pvl' -Eopzione).
Stéphane Chazelas,

1
@ StéphaneChazelas catpotrebbe essere anche più veloce ma la differenza non è così drammatica (forse più grande per dispositivo a dispositivo rispetto a file a file come nel mio esperimento).
Gilles 'SO- smetti di essere malvagio' il

8
"Ho provato lo stesso su un sistema Unix" - Quindi su quale tipo di sistema hai provato il primo, se non un Unix? Inoltre, quale hardware, ecc., Yaddayadda.
marzo


Utilizzato il primo in HP-UX (Integrity blade) e anche macchine Solaris precedentemente utilizzate.
KKD,

Risposte:


28

ddha molte (strane) opzioni, vedi dd (1) .

È necessario indicare esplicitamente la dimensione del buffer, quindi provare

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

IIRC, la dimensione del buffer predefinita è solo 512 byte. Il comando sopra lo imposta su 16 megabyte. Potresti provare qualcosa di più piccolo (ad es. bs=1M) Ma dovresti usare più del valore predefinito (specialmente sull'hardware del disco recente con settori di 4Kbyte, ovvero Advanced Format ). Consiglio ingenuamente una potenza di due che è almeno un megabyte.

Con la dimensione del buffer predefinita di 512 byte, immagino (ma potrei sbagliarmi molto) che l' hardware richiede al kernel di trasferire 4K per ogni blocco di 512 byte.

Per quanto riguarda rdsk, le pagine man di sd (4) dicono:

Al momento vengono forniti solo i dispositivi a blocchi. I dispositivi grezzi non sono ancora stati implementati.

L'aumento della dimensione del buffer di dd offre maggiori prestazioni per le operazioni di lettura e scrittura. Ora tutti i dischi hanno buffer di lettura / scrittura hardware. Ma se aumenterai le dimensioni del buffer di dd più del buffer hardware, le sue prestazioni diminuiranno perché dd leggerà dal primo disco al buffer quando il secondo disco avrà scritto tutto dal suo buffer hardware. È necessario impostare l' bsopzione del comando dd ogni volta un valore diverso per dispositivi diversi.


Se rdsk è disponibile nei sistemi Linux? Ho usato nei sistemi Unix.
KKD,

1
La cache della pagina probabilmente occuperà blocchi 4Kb qualunque cosa tu faccia, ma puoi controllare quante syscalls dd usa per leggere quel 4Kb. Sono sicuro che ci sono alcune dimensioni di lettura oltre le quali il costo dello stallo delle scritture è più costoso delle syscalls salvate, ma non ho idea di dove sia il punto debole.
Inutile

Una dimensione del blocco di alcuni MB è migliore rispetto ai 512B predefiniti, ma quando l'ho confrontato ho scoperto che catha funzionato altrettanto bene (per il trasferimento da file system a file system, il blocco diretto a blocco può avere caratteristiche di prestazione diverse). Comunque la differenza non è stata drammatica in ogni caso.
Gilles 'SO- smetti di essere malvagio' il

1
È interessante notare che in macOS (un certificato SUS, tra l'altro) è più veloce da usare/dev/rdiskX come target durante l'esecuzione dd.
adib,

1
nel caso ti chiedi cosa stia succedendo (come ho fatto io) aggiungi anche status=progressche stamperà l'intero progresso dell'operazione.
Aleksander Lech,

17

Anni fa in Unix-land ddera il modo necessario per copiare un dispositivo a blocchi. Ciò è andato avanti come conoscenza del culto del carico anche se (almeno su sistemi basati su Linux) catè quasi sempre più veloce di dd.

Tuttavia, anche nella storia, una discreta dimensione del blocco ha contribuito a ridurre il numero di chiamate di sistema (lente), dato che ogni chiamata di sistema ha innescato un'operazione di I / O. La dimensione del blocco predefinita è 512 byte (un settore del disco). Anche raccogliere più blocchi di dischi in una sola lettura era - ed è - accettabile. In questo esempio viene utilizzata una dimensione di blocco di 32 MB:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

Negli attuali sistemi basati su Linux, tuttavia, i dischi possono essere copiati in modo più efficiente con un semplice cat

cat /dev/source >/dev/target

(Come indicato nei commenti sulla tua domanda pvpuò essere sostituito cate ti darà un'indicazione di progresso e rendimento.)


3
In particolare, il motivo per cui è stato usato dd era un bug in GNU cp e un bug nel kernel Linux nei primi anni '90. Le ragioni per usare dd su sistemi unix storici erano molto diverse, e voler copiare un intero dispositivo a blocchi era una cosa insolita da voler fare.
Casuale 832

1
@ Random832 che volesse copiare un intero disco sarebbe stato insolito, ma ricordo di aver bisogno di copiare le partizioni in giro (quelle grandi - 150 o anche 200 MB)
roaima

3
(I dettagli dei bug: il kernel ha riportato erroneamente le dimensioni di utilizzo del disco [portando cp a concludere che ogni file sorgente era un file sparse], e cp non ha azzerato i blocchi durante la copia da un file sparse a una destinazione del dispositivo. Quindi qualsiasi zero blocco nella tua fonte avrebbe qualunque spazzatura fosse già presente sul disco)
Random832

Adoro questo tipo di risposta. Grazie per le informazioni. Ecco il tuo updoot.
catbadger,

7

In generale, ddpuò essere evitato a favore di alcune alternative. Ci sono diversi buoni motivi per usare GNU ddrescueinvece. In Ubuntu, puoi installarlo con:

sudo apt-get install gddrescue

e semplicemente ddrescueda usare. Notare che diversamente dal nome del pacchetto, l'eseguibile non ha l'inizialeg .

Usarlo è semplice come:

ddrescue inputFile outputFile logFile

Il file di registro (denominato come si sceglie) consente di mettere in pausa / interrompere e riavviare, senza ripetere il lavoro precedente, utile quando si eseguono cloni di grandi dimensioni o il ripristino di dischi. Per impostazione predefinita, visualizza l'avanzamento, la velocità di copia corrente, la velocità media di copia e il numero di blocchi danneggiati rilevati.

Utilizza impostazioni predefinite ragionevoli per le dimensioni del blocco, quindi la velocità di copia è sempre la più veloce che il dispositivo è in grado di gestire, almeno nella mia esperienza (ho clonato molte centinaia di unità con esso, tutte le dimensioni e i tipi).

Spesso, le unità che iniziano a guastarsi presentano problemi di velocità come patch occasionali di lentezza, bassa velocità media, lunghe pause improvvise (settori danneggiati) o ripristini completi (gravi errori di superficie). ddrescuepuò aiutarti a identificare tutto quanto sopra e riavviare il clone (purché tu abbia specificato un file di registro) anche se l'unità si sta ripristinando.


6

Bella domanda L'interfaccia grezza è implementata su alcuni sistemi unix (tru64, hpux, solaris) ma non su Linux. L'interfaccia non elaborata rende il trasferimento più veloce perché viene saltata l'I / O unix. L'interfaccia del blocco ( /dev/dsko /dev/disk) è più lenta perché utilizza il sistema I / O unix. Per accelerare dd(gnu dd can) usa bs=30Mo bs=20Mdipende dal tuo hw. La risposta breve è: NO, non è implementato, almeno per quanto ne so. Sto usando Linux dai vecchi tempi della versione 2.2 del kernel e non l'ho mai visto rdskusato su unix.


5
Perché suggerisci una dimensione del blocco che non è una potenza di due?
Basile Starynkevitch il

2
@Basile è sufficiente un multiplo della dimensione del blocco del disco, quindi 20MiB andrebbero bene.
roaima,
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.