Utilizzo di DD per la clonazione del disco


182

Sono state poste diverse domande relative agli strumenti di clonazione del disco ed ddè stata suggerita almeno una volta. Ho già preso in considerazione l'uso di ddme stesso, principalmente per la facilità d'uso, e che è prontamente disponibile su quasi tutte le distribuzioni Linux avviabili.

Qual è il modo migliore da usare ddper clonare un disco? Ho fatto una rapida ricerca su Google e il primo risultato è stato un tentativo apparentemente fallito . C'è qualcosa che devo fare dopo l'uso dd, cioè c'è qualcosa che NON PUO 'essere letto usando dd?


Sono consapevole di come funziona dd, la mia domanda era più nella direzione di eventuali problemi noti relativi a dd durante la clonazione dei dischi (come descritto dal link), forse questo non era molto chiaro. Ciò che contiene la sua risposta e la tua no è "Non ho mai avuto problemi con essa". Ho votato anche la tua risposta, dato che hai sicuramente presentato alcuni punti interessanti (mi piace quello su nessuna indicazione di progresso).
falstro,

1
Sembra che tu abbia ottenuto lo Spolsky Bump: joelonsoftware.com/items/2009/05/29.html
Kyle Cronin

non l'ho visto qui quando ho posto (e risposto) una domanda simile su superutente - superuser.com/questions/11453/…
warren

3
È ironico che Joel si sia collegato alla domanda come un buon esempio di errore del server, sebbene nessuna delle risposte fosse buona. Non c'era una risposta tra 25 (esclusi i commenti) con le giuste ddopzioni per saltare i blocchi danneggiati - che è essenziale quando si clonano dischi per il ripristino. Ho aggiunto una risposta migliore, che può clonare dischi con blocchi danneggiati:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins,

Penso che il ripristino dd potrebbe "fallire" se si parla di file system dipendenti dalla geometria dell'unità e il ripristino viene eseguito su dischi rigidi non identici? Ho riscontrato alcuni errori nel ripristino dd e penso che questo sia stato il problema nel mio caso.
Marco,

Risposte:


160

dd è sicuramente il miglior strumento di clonazione, creerà una replica al 100% semplicemente usando il seguente comando. Non ho mai avuto problemi con esso una volta.

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

Tenere presente che durante la clonazione di ogni byte, non è necessario utilizzarlo su un'unità o una partizione in uso. Soprattutto le applicazioni come i database non possono farcela molto bene e potresti finire con dati corrotti.


12
Ovviamente, fintanto che / dev / sdb è grande almeno quanto / dev / sda ...
Eddie,

22
aggiungi un "bs = 100M conv = notrunc" ed è molto più veloce nella mia esperienza.
Tim Williscroft,

127
stai

17
Nessuno sembra conoscere questo trucco ... dd è un programma di copia asimmetrico, il che significa che leggerà prima, poi scriverà e poi di nuovo. È possibile reindirizzare dd a se stessa e la forza per eseguire la copia in modo simmetrico, in questo modo: dd if=/dev/sda | dd of=/dev/sdb. Nei miei test, l'esecuzione del comando senza pipe mi ha dato un throughput di ~ 112kb / s. Con la pipe, ho ~ 235kb / s. Non ho mai avuto problemi con questo metodo. In bocca al lupo!
Mistiry,

13
@Mistiry, non è questo il significato della parola simmetrica.
psusi,

113

Per risparmiare spazio, è possibile comprimere i dati prodotti da dd con gzip, ad esempio:

dd if=/dev/hdb | gzip -c  > /image.img

Puoi ripristinare il tuo disco con:

gunzip -c /image.img.gz | dd of=/dev/hdb

Per risparmiare ancora più spazio, deframmenta in anticipo l'unità / partizione che desideri clonare (se appropriato), quindi azzera tutto lo spazio inutilizzato rimanente, facilitando la compressione di gzip:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Aspetta un po ', dd alla fine fallirà con un messaggio "disco pieno", quindi:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Inoltre, puoi ottenere un processo dd in esecuzione in background per segnalare lo stato inviandogli un segnale con il comando kill, ad esempio:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Controlla il tuo sistema - il comando sopra è per i comandi dd Linux, OSX e BSD differiscono nei segnali che accettano (usa OSX SIGINFO- puoi premere Ctrl+ Tper segnalare lo stato).


2
Funziona anche con "moderni" come BTRFS, NILFS, [qualunque cosa tu possa sognare]?
Steve Schnepp,

DD funziona su dispositivi a blocchi, un livello di astrazione inferiore al file system, quindi dovrebbe, sì. Non l'ho ancora provato, comunque. Hmm, NILFS sembra interessante, dovrò dare un'occhiata a quello.
David Hicks,

4
+1 per il kill -SIGUSR1 %1comando dd OSX e accetta felicemente SIGUSR1 ... super utile, grazie!
stuartc,

1
+1 per quello Kill -SIGUSR1 1234che stavo cercando.
hot2use

2
Dovrebbe essere dd if=/dev/hdb | gzip -c > /image.img.gz:?
Mike Causer,

37

ATTENZIONE : la creazione di un filesystem live può danneggiare i file. Il motivo è semplice, non ha alcuna comprensione dell'attività del filesystem che potrebbe essere in corso e non tenta di mitigarla. Se una scrittura è parzialmente in corso, otterrai una scrittura parziale. Questo di solito non è buono per le cose e generalmente fatale per i database. Inoltre, se si fallisce l'errore di battitura a rischio se e dei parametri, guai a voi. Nella maggior parte dei casi, rsync è uno strumento altrettanto efficace scritto dopo l'avvento del multitasking e fornirà visualizzazioni coerenti dei singoli file.

Tuttavia, DD dovrebbe acquisire accuratamente lo stato di bit di un'unità non montata. Bootloader, volumi llvm, UUID di partizione ed etichette, ecc. Basta assicurarsi di disporre di un'unità in grado di eseguire il mirroring del bit dell'unità di destinazione per bit.


7
Sospetto che syncnon sia la risposta a problemi di corruzione dei file. Cosa succede se un demone o qualcosa scrive più file dopo sync, durante l' ddoperazione?
Eliminato il

5
È consigliabile smontare prima l'unità (o rimontarla in sola lettura) ma non è sempre possibile
Alex Bolotov,

1
In tal caso, si utilizza rsync e si lascia che il file gestisca la magia per ottenere un file coerente e lasciare che la semantica Copia su scrittura gestisca le scritture in arrivo.
jldugger,

4
Vorrei aggiungere che eseguire dd su un filesystem montato NON CORRUTERÀ i file sul filesystem montato, ma ciò che si intende qui è che la copia del filesystem sarà necessariamente in un buono stato noto.
3molo,

1
L'utilizzo rsyncgarantirà la coerenza dei dati interni nel filesystem di destinazione. Essa non garantisce che i dati nei file è coerente - per farlo, si avrebbe bisogno di bloccare i file e tutti i programmi che scrivono i file avrebbe bisogno di rispettare questi blocchi.
Martin Geisler,

26

Quando si utilizza dd per clonare un disco che può contenere settori danneggiati, utilizzare "conv = noerror, sync" per assicurarsi che non si fermi quando rileva un errore e riempia i settori mancanti con byte nulli. Questo di solito è il primo passo che faccio se provo a ripristinare da un disco guasto o guasto: procuratene una copia prima di eseguire qualsiasi tentativo di recupero, quindi esegui il ripristino sul disco valido (clonato). Lascio allo strumento di recupero per far fronte a tutti i settori vuoti che non possono essere copiati.

Inoltre, potresti scoprire che la velocità di dd può essere influenzata dall'impostazione bs (dimensione del blocco). Di solito provo bs = 32768, ma ti potrebbe piacere testarlo sui tuoi sistemi per vedere cosa funziona meglio per te. (Ciò presuppone che non sia necessario utilizzare una dimensione di blocco specifica per un altro motivo, ad esempio se si sta scrivendo su un nastro.)


13
Se hai un disco con settori danneggiati, dovresti davvero usare 'ddrescue' invece di dd. È molto più efficiente e ha molte più possibilità di recuperare più dati. (Non confonderlo con dd_rescue, che non è altrettanto buono)
davr

3
non dovrebbe utilizzare blocchi di grandi dimensioni se si tenta di saltare blocchi danneggiati o salterà troppo. 4096 è abbastanza grande.
Sam Watkins,

17

Per clonare un disco, tutto ciò che devi fare è specificare l'input e l'output su dd:

dd if=/dev/hdb of=/image.img

Naturalmente, assicurati di disporre delle autorizzazioni appropriate per leggere direttamente da / dev / hdb (ti consiglierei di eseguirlo come root) e che / dev / hdb non sia montato (non vuoi copiarlo mentre il disco è in fase di modifica - è accettabile anche il montaggio in sola lettura). Una volta completato, image.img sarà un clone byte per byte dell'intero disco.

Ci sono alcuni svantaggi nell'uso di dd per clonare i dischi. Innanzitutto, dd copierà l'intero disco, anche lo spazio vuoto, e se fatto su un disco di grandi dimensioni può risultare in un file di immagine estremamente grande. In secondo luogo, dd non fornisce assolutamente indicazioni sullo stato di avanzamento, il che può essere frustrante perché la copia richiede molto tempo. In terzo luogo, se copi questa immagine su altre unità (di nuovo, usando dd), devono essere grandi o più grandi del disco originale, eppure non sarai in grado di utilizzare lo spazio aggiuntivo che potresti avere sul disco di destinazione fino a quando ridimensiona le tue partizioni.

Puoi anche fare una copia diretta da disco a disco:

dd if=/dev/hdb of=/dev/hdc

ma sei ancora soggetto alle limitazioni di cui sopra per quanto riguarda lo spazio libero.

Per quanto riguarda i problemi o i problemi, dd, per la maggior parte, fa un lavoro eccellente. Tuttavia, qualche tempo fa avevo un disco rigido che stava per morire, quindi ho usato dd per provare a copiare le informazioni che potevo estrarre prima che morisse completamente. È stato poi appreso che dd non gestisce molto bene gli errori di lettura - c'erano diversi settori sul disco che dd non riusciva a leggere, facendo sì che dd si arrendesse e interrompesse la copia. Al momento non riuscivo a trovare un modo per dire a dd di continuare nonostante si verificasse un errore di lettura (anche se sembra che abbia quell'impostazione), quindi ho trascorso un bel po 'di tempo a specificare manualmente skip e cercare di saltare il sezioni illeggibili.

Ho trascorso un po 'di tempo a cercare soluzioni a questo problema (dopo aver completato l'attività) e ho trovato un programma chiamato ddrescue , che, secondo il sito, funziona come dd ma continua a leggere anche se si verifica un errore. In realtà non ho mai usato il programma, ma vale la pena considerare, soprattutto se il disco da cui stai copiando è vecchio, il che può avere settori danneggiati anche se il sistema sembra a posto.


7
... dd non fornisce assolutamente indicazioni sui progressi ... - beh, questo non è vero - esiste un modo un po 'complicato per mostrare i progressi - devi scoprire il pid del processo dd (' ps -a | grep dd ') e poi invia il segnale USR1 a questo processo - 'kill -USR1 <dd_pid_here>' (senza <>) che forza dd a mostrare le informazioni sull'avanzamento.
Michal Bernhard,

4
"diversi settori sul disco che non sono stati in grado di leggere": penso che conv=sync,noerrorsarebbe di aiuto.
Gauthier,

2
Le conv=sync,noerroropzioni sono essenziali, consentono a dd di saltare i blocchi danneggiati e azzerarli nell'immagine in modo che le cose siano allineate correttamente. Sostenere le pochissime persone che hanno commentato qualcosa al riguardo.
Sam Watkins,

1
GNU ddrescuefornisce un indicatore di avanzamento senza alcuna opzione speciale e puoi interrompere la copia e riprendere da dove eri rimasto.
Endolith,

2
Un modo meno complicato per ottenere progressi con dd è aggiungere l'opzionestatus=progress
James,

11

Se l'unità sorgente è danneggiata, avrai più fortuna usando dd_rhelpcon dd_rescue(le mie preferenze personali) o GNU ddrescue.

Il motivo alla base di ciò è che, in caso di errori di lettura, ddcontinua a provare e provare e provare - potenzialmente in attesa per molto tempo che si verifichino timeout. dd_rescuefa cose intelligenti come leggere fino a un errore, quindi scegliere un punto più avanti sul disco e leggere all'ultimo errore fino all'ultimo errore, ed dd_rhelpè fondamentalmente un dd_rescuegestore di sessioni - avviare e riprendere abilmente le dd_rescuecorse per renderlo più veloce.

Il risultato finale di dd_rhelpè il massimo dei dati recuperati nel tempo minimo. Se lasci la dd_rhelpcorsa, alla fine fa esattamente lo stesso lavoro dddella stessa volta. Tuttavia, se si ddverificano errori di lettura al byte 100 del disco da 100 GB, è necessario attendere molto tempo per ripristinare gli altri 9.999.900 byte *, mentre dd_rhelp+ dd_rescueripristinerebbe la maggior parte dei dati molto più rapidamente.


1
Alcuni aiutano a scegliere tra dd_rescue e ddrescue: askubuntu.com/a/211579/50450
Johann,

7

Il disco di origine non deve avere alcun filesystem montato. Come utente in grado di leggere il dispositivo a blocchi (root funziona), esegui 'dd if = / dev / sda ....'

Ora, una delle cose pulite qui è che stai creando un flusso di byte ... e puoi fare molto con quello: comprimerlo, inviarlo in rete, dividerlo in BLOB più piccoli, ecc.

Per esempio:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Ma più potente:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Quanto sopra copia un'immagine compressa del disco rigido di origine su un sistema remoto, dove lo memorizza in blocchi numerati 2G utilizzando il nome dell'host di origine, mentre ti tiene aggiornato sullo stato di avanzamento.

Si noti che a seconda delle dimensioni del disco, della velocità della CPU sulla sorgente, della velocità della CPU sulla destinazione, della velocità della rete, ecc. È possibile che si desideri saltare la compressione o eseguire la compressione sul lato remoto o abilitare la compressione di ssh.


+1 Il piping tramite gzip può far risparmiare molto tempo e larghezza di banda!
M. Dudley,

Dovrei anche notare che l'aggiunta di 'bs = 1M' al comando dd di solito migliorerà notevolmente la velocità.
Retracile

6

Per clonare un disco, tutto ciò che devi fare è specificare l'input e l'output per dd:

dd if=/dev/hdb of=hdb.img

Certo, assicurati di avere le autorizzazioni appropriate da cui leggere direttamente /dev/hdb(consiglierei di eseguirlo come root) e che /dev/hdbnon sia montato (non vuoi copiarlo mentre il disco viene modificato). Una volta completato, hdb.imgsarà un clone byte per byte dell'intero disco.

Ci sono alcuni svantaggi da usare ddper clonare i dischi. Innanzitutto, ddcopi l'intero disco, anche lo spazio vuoto, e se fatto su un disco di grandi dimensioni può risultare in un file di immagine estremamente grande. In secondo luogo, non ddfornisce assolutamente indicazioni sullo stato di avanzamento, il che può essere frustrante perché la copia richiede molto tempo. In terzo luogo, se copi questa immagine su altre unità (di nuovo, usando dd), devono essere più grandi o più grandi del disco originale, ma non sarai in grado di utilizzare lo spazio aggiuntivo che potresti avere sul disco di destinazione fino a quando ridimensiona le tue partizioni.

Puoi anche fare una copia diretta da disco a disco:

dd if=/dev/hdb of=/dev/hdc

ma sei ancora soggetto alle limitazioni di cui sopra per quanto riguarda lo spazio libero.

Il primo svantaggio può essere risolto comprimendo i dati durante la copia. Per esempio:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

Il secondo inconveniente può essere risolto utilizzando lo pvstrumento pipeview ( ). Per esempio:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Non conosco alcun modo per superare il terzo inconveniente.

Inoltre, puoi velocizzare i tempi di copia dicendo dddi lavorare con grandi quantità di dati. Per esempio:

dd if=/dev/hdb of=hdb.img bs=1024

1
Hai già detto come superare il terzo inconveniente ... ridimensionare le partizioni. L'ampliamento di una partizione è generalmente un'operazione sicura e veloce (rispetto alla riduzione o allo spostamento, che è lenta e più pericolosa poiché sposta i dati).
davr

gzipping non funzionerà con un disco che è stato usato per un po 'di tempo, poiché sarà riempito con dati correnti o cancellati. gzip funzionerà solo se lo spazio vuoto è azzerato, come nel caso di un disco nuovo di zecca.
Tozz,

3
@Tozz: è possibile migliorare la compressibilità di un'immagine del filesystem riempiendo il filesystem con un file riempito con 0, sincronizzandolo su disco, quindi eliminandolo. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Modulo extra intelligence nel livello del filesystem).
Retracile

5

Un'altra cosa interessante che puoi fare con i dischi dd e rescue è copiare i dati sulla rete:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

È possibile inserire gzip in entrambe queste pipeline se la rete non è locale. Per progressi, utilizzare pv. Per interrompere la netcat di local_machine al termine della copia, è possibile aggiungere -w 5o altro.


9
Questo non è del tutto corretto. Nel comando 'remote_machine' manca qualcosa, come > disk_backup.imgo |dd of=/dev/sdbo qualcos'altro, a seconda di ciò che si desidera fare. Immagino che tu non voglia scaricare un'immagine del disco su stdout.
davr

1
E gzip in gzip su entrambe le estremità per minimizzare ulteriormente i dati inviati.
3molo,

4

Tieni presente che dd esegue una copia esatta , incluso tutto lo spazio vuoto.

Questo significa:

  1. La seconda unità deve essere grande almeno quanto la prima
  2. Se la seconda unità è più grande, lo spazio extra sarà sprecato (il filesystem può essere espanso badate a voi)
  3. Se l'unità di origine non è piena, dd perderà molto tempo a copiare spazio vuoto.
  4. In questo modo è possibile copiare l'intera unità o una singola partizione.
  5. Se si tratta di un'unità avviabile, sono abbastanza sicuro che è necessario installare il bootloader dopo aver usato dd

Spero che sia utile


8
Se stai clonando l'intero disco rigido, stai anche clonando il boot loader.
Cristian Ciupitu,

beh, solo un pensiero, ma non potresti semplicemente usare gparted per ridimensionare la partizione / il disco da copiare su qualunque cosa venga usata, quindi rilasciare dd? Supponendo che sia una sola immagine dovrebbe mitigare questo problema.
bbqchickenrobot,

3

Per riferimento futuro potrebbe essere interessante controllare ddrescue . Mi ha salvato la giornata un paio di volte.


3

Un'altra grande funzionalità è la copia di MBR, tabelle delle partizioni e record di avvio.

Appena

dd if=/dev/sda of=parttable bs=512 count=1

e l'altra direzione quando la scrivi. Polacco con fdiskdopo.

Ti senti molto più sicuro quando hai il backup della tabella delle partizioni.

Inoltre, rende la migrazione su un altro disco rigido (mentre si modifica la struttura delle partizioni) una gioia.


3

Questo è un po 'un trucco economico, ma è un modo rapido e sporco per monitorare il processo DD.

Esegui il comando dd. Apri una nuova shell ed esegui un ps awx per trovare il PID del tuo processo dd. Ora nella nuova shell digitare watch -n 10 kill -USR1 {pid del tuo processo DD}

Questo non farà nulla nella finestra di output dell'orologio, ma tornando nella shell DD originale, DD inizierà a produrre rapporti sullo stato ogni 10 secondi. Ovviamente puoi cambiare -n 10 nel comando watch in qualsiasi altro intervallo di tempo.

Tachyon


OS X non ha watchdisponibile e -USR1uccide dd. Il seguente comando funziona però: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco,

Non penso che questo sia molto pratico per un principiante, potrebbero essere meglio serviti con il pvcomando.
Robbie Mckennie,

Ho scoperto che puoi anche inviare un SIGINFO usando CTRL-T in dd. È più semplice del ciclo while e il cd OSX 10.6 che ho non ha killall. L'ho imparato da en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler

3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Questo copierà il disco e salterà i blocchi con errori, il che è molto importante.

Queste sono le opzioni di base ed essenziali per usare dd per clonare o salvare un disco.

Non volevo pubblicare un'altra risposta, ma non c'erano buone risposte con le opzioni essenziali "conv = sync, noerror" tra le 25 già pubblicate.


1
In realtà è stato menzionato prima, in una risposta e almeno due commenti.
Michael Hampton

1
@Michael la risposta che hai collegato non contiene un comando di esempio completo e presenta altri errori: non è una buona idea usare blocchi di grandi dimensioni conv=sync,noerrorpoiché salterà troppi dati per ogni blocco errato. Queste opzioni sono essenziali per la "clonazione di ripristino" e non è necessario cercare i commenti per esse. La risposta più popolare è adeguata se i dischi non hanno blocchi danneggiati, ad esempio per la clonazione di un disco incontaminato, ma non per il ripristino.
Sam Watkins,

@Michael l'esempio che ho dato è un comando che ho usato più volte per il ripristino professionale del disco. Mentre ci sono altri strumenti che potrebbero fare un lavoro leggermente migliore, l'esempio che ho dato è migliore nella clonazione di recupero del disco rispetto a qualsiasi altro ddesempio qui, pur essendo adatto per la clonazione di un disco privo di errori. Pertanto, ritengo che la mia risposta sia la migliore qui su come "utilizzare DD per la clonazione del disco". Non ho aggiunto informazioni sul monitoraggio dell'avanzamento, della compressione, ecc., Perché volevo renderlo semplice e concentrarmi sulla fornitura di una breve risposta che renda le basi giuste.
Sam Watkins,

3

Potresti davvero provare qualcosa del genere

dd if = / dev / sda2 di = / dev / sdb2 bs = 4096 conv = sync, noerror

per saltare tutti gli errori e avere il clone esatto di una partizione o disco rigido


Dovrebbe essere conv = sync, noerror L'opzione di sincronizzazione è necessaria oppure i blocchi con errori verranno rimossi anziché copiati come zeri.
Sam Watkins,

2

dd fornisce informazioni sullo stato di avanzamento - bene la maggior parte delle versioni in Linux. Ne ho visti alcuni che non ricordano il sapore unix.

La pagina man dice: L'invio di un segnale USR1 a un processo 'dd' in esecuzione lo fa stampare le statistiche I / O sull'errore standard e quindi riprendere a copiare.

Uso questa funzione regolarmente.


Sebbene utile, dubito della sua praticità per un principiante.
Robbie Mckennie,

2

Qualcuno ha dovuto dire questo: prova Clonezilla (http: // clonezilla.org/)

Che cosa ottieni? Per copiare solo parti utilizzate del filesystem. Clonezilla usa dd, grub, sfdisk, parted, partimage, ntfsclone e / o partclone. A seconda delle opzioni che scegli.

La documentazione decente è disponibile all'indirizzo: http: // clonezilla.org/clonezilla-live/doc/


Ho trovato la documentazione un po 'approssimativa e la clonazione di un'unità PATA Linux su un'unità SATA non mi ha lasciato con qualcosa che potrei avviare (ancora). Ma molto più veloce allo stesso risultato di dd, e ha funzionato benissimo per gli aggiornamenti del mio laptop.
jbdavid,

2

Come copiare usando dd (in questo caso su una macchina remota, ma lo stesso principio si applica a una copia locale) che mostra l'avanzamento.

Funziona memorizzando il pid tramite il descrittore di file 3 in / tmp / pid, che viene quindi utilizzato per le successive uccisioni con il segnale USR1. Una ruga consisteva nel filtrare l'output dell'avanzamento su stderr su una sola riga tramite il filtraggio di stderr attraverso una subshell.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done

Non molto rilevante per la domanda, ma è un trucco della shell pulito usando un descrittore di file sub-shell e alto (superiore a stderr) per trasmettere i dati da esso, +1
falstro

Mi riferivo a questa pagina per le diverse opzioni dd durante la clonazione dei dischi, quindi mi è sembrato un posto adatto in quel momento per mettere il risultato finale di quello che ho usato per la clonazione, soprattutto perché pensavo fosse piuttosto pulito :)
Edward Groenendaal

2

La maggior parte delle informazioni è stata descritta nelle precedenti ricette inserite, ma non tutte sono state descritte.

Sotto linux puoi clonare hard disk o partizioni con il comando dd. Attenzione, quando commetterai un errore, perderai tutti i tuoi dati.

Inizialmente, la destinazione non dovrebbe essere in uso, in secondo luogo la fonte non dovrebbe essere utilizzata o rimontata in modalità di sola lettura. Altrimenti la copia sarà danneggiata. Se il rimontaggio è impossibile, eseguire un'unità avviabile (hdd / ssd / pendrive) qualsiasi distribuzione live di Linux. Prego knoppix, ma questa è la tua scelta. Se è possibile, è possibile avviare o modificare il livello di sistema in 1, per la modalità utente singolo, oppure è possibile riavviare direttamente il sistema in modalità utente singolo, dipende dalla distribuzione. Se clonerai solo una partizione, questa partizione dovrebbe essere smontata o rimontata in RO:

umount /mountpoint_or_device

o

remount -o,ro /mountpoint_or_device

Se si desidera clonare l'intero disco rigido, è necessario smontare o rimontare tutte le partizioni.

È necessario identificare il dispositivo di origine e destinazione. guarda il dmesg, qui sono memorizzate tutte le informazioni necessarie sul dispositivo, con il fornitore ecc. In alternativa, l'identificazione può essere basata sulla dimensione del dispositivo, se diversa. Successivamente, la destinazione dovrebbe essere la stessa o più grande della fonte. devi calcolare la sorgente, ad esempio: fdisk -l / dev / sda tranne la geometria della partizione (può esserci GPT), otterrai: 1. dimensione totale del disco con GB e byte 2. geometria storica e numero totale del settore, informazioni molto importanti 3. dimensione del blocco in byte, in genere è 512.

per esempio:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

ora proviamo più di 512 divisori, abbiamo 41943040 settori fisici:

41943040/256 = 163840, ottimo, possiamo fare una copia in blocco di 256 settori. possiamo di più? proviamo: 41943040/1024 = 40960, penso che sia abbastanza, selezioneremo questo. Contiamo le dimensioni del gruppo di settori: 512 (dimensioni del settore) * 1024 = 524288 byte eq 512K. Quindi possiamo usare il parametro bs = 512K o meno, ma dividerlo per 2 ^ x. Per i moderni dischi rigidi con grande cache interna, questo è abbastanza pratico. per le unità meno recenti con cache molto più piccola, è sufficiente un valore di 32 KB o inferiore.

Quindi dopo la preparazione possiamo fare una copia: dd se = / dev / source_devide di = / dev / destination_device bs = 32K e la copia verrà eseguita. Presta attenzione, qualsiasi errore sovrascriverà i tuoi dati di importazione e. A destinazione tutto verrà sovrascritto.

Se si tenta di ripristinare i dati sul disco di origine danneggiato, utilizzare meglio le dimensioni del settore nativo, in genere si tratta di 512 byte e aggiungere l'opzione conv = notrunc. altrimenti i buchi nella fonte lasciati cadere dai settori danneggiati saranno affiancati da uno spostamento del settore sulla destinazione. Ciò danneggerà la copia con poche possibilità di riparazione. quindi il comando sarà:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

e attendere a lungo quando l'unità e il sistema si arrenderanno e cammineranno settore per settore fino alla fine.

dd è uno strumento utile per spostare la partizione in un nuovo posto. Basta creare una partizione, rendere dd su una nuova partizione (questa può essere più grande, molto più grande) e, se possibile, espandere il file system copiato per riempire tutta la nuova partizione, ext3 / ext4 / xfs / zfs / btrfs hanno questa funzione. Alla fine devi cambiare / etc / fstab, quindi umount / mount se possibile, o riavviare il sistema.

Ovviamente puoi clonare qualsiasi tipo di partizione. Il comando dd non esamina il tipo di file system, non fa nulla con la sua struttura. quindi questo comando può essere utilizzabile per clonare NTFS o altri tipi di partizioni.

C'è qualche trucco. Quando non hai impostato il parametro, dd inserirà l'output nel suo stdout. quindi è possibile creare una copia raw compressa del disco o della partizione, ad esempio:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Naturalmente questo dovrebbe essere fatto offline. puoi ripristinarlo come segue:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, quindi tutto il disco rigido sda verrà sovrascritto da questo backup e tutti i dati correnti andranno persi. È possibile farlo anche con la partizione Windows NTFS e il disco rigido utilizzati da questo. Ovviamente puoi usare altri comandi di compressione, a seconda della tua scelta.


1

È possibile creare un file immagine compresso della partizione (o del disco) al volo usando bzip2o gzipinvece di dd. È utile per archiviare le immagini su supporti rimovibili:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Se il disco è stato ampiamente utilizzato in precedenza, è possibile migliorare la compressione riempiendo tutto lo spazio inutilizzato con zeri prima dell'imaging:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Per ripristinare l'immagine su un altro disco, tutto ciò che devi fare è:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY

Ha votato per il trucco per riempire lo spazio rimanente con zero. Inteligente!
Confusione,

Questo, ne avevo bisogno! La scheda SD era precedentemente utilizzata per l'acquisizione di video ed era piena di schifezze, la compressione non aiutava affatto.
Cody Smith,

0

Per qualche ragione, dd fallisce quando si riproducono CD con tracce audio. È necessario utilizzare cdrdao o qualcosa di simile per ottenere un'immagine + file TOC.


0

Una nota sulla velocità: nella mia esperienza dd è due volte più veloce se si specifica bs = 1024 invece del valore predefinito bs = 512. L'uso di una dimensione del blocco ancora maggiore non dà una velocità notevole su bs = 1024.


4
i cluster di dischi sono generalmente circa 4k ora, quindi usare 4096 è probabilmente una buona opzione e persino 8192 se vuoi leggere 2 cluster alla volta. Non andare troppo grande, però, quando si verificano problemi di memoria frammentata
user4767

0

Una cosa da tenere presente quando si esegue il dding di un disco completo è che ciò sovrascriverà il record di avvio principale del disco di ricezione. Questo contiene la tabella delle partizioni e altre informazioni vitali. Se il nuovo disco non è lo stesso del vecchio disco, questo può creare tutti i tipi di tabelle. La copia su partizioni è generalmente più sicura (e non è necessario copiare le partizioni di swap)


0

Sono stato fuori dal ruolo di amministratore per molti anni ormai, ma so che 'dd' è all'altezza del lavoro. Ho usato questa tecnica regolarmente alla fine degli anni '80 su computer Sun Sparc e 386i. Ho avuto un ordine cliente su oltre 30 sistemi 386i con software CAD distribuito su più nastri QIC.

Abbiamo installato sul primo computer, configurato l'app, eseguito il sistema sys-unconfig di SunOS, inserito l'unità in una scatola da scarpe con un indirizzo SCSI diverso e quindi proceduto a "dd" sulle altre 30 unità.


0

Come altri hanno già detto sopra, uno dei problemi con la clonazione di un file system montato è la potenziale corruzione dei dati. Questo ovviamente non si applica ai cloni di unità complete, ma se si utilizza LVM è possibile eseguire l'istantanea di LogicalVolume e dd dall'istantanea per ottenere un'immagine coerente.



0

Solo un avvertimento per i principianti che deve essere detto: almeno con alcune versioni, bs = X significa che la memoria della dimensione di X verrà letteralmente allocata. bs = 2 GB su un sistema con 1 GB di RAM e scambio insufficiente causeranno cose brutte.

Licensed under cc by-sa 3.0 with attribution required.