PDA

Visualizza versione completa : [Guida] - Clonare dischi (o partizioni) da shell con "dd"



ginalfa
06-04-10, 11: 39
Linux ha in dotazione un semplice ma potente comando che consente di creare immagini RAW 1:1 di partizioni o di interi dischi.

Questo può essere utile sia per normali operazioni di backup per le quali esistono comuque distro come SysRescueCD.

SysRescueCD, con partimage, non effettua la copia RAW della partizione, ma del solo file system, cosa che riduce notevolmente la quantità di dati copiati, ma non rappresenta una vera copia 1:1 del disco o della partizione.

Avere una copia 1:1 può essere utile, per esempio, se si vuole copiare l'intero disco di un notebook comprese le partizioni di ripristino per riaverlo lindo e pinto come lo si è comprato in caso di disastri accidentali:cry3 o... colposi :oo2.



Tutto questo va fatto da console per sfruttare al meglio la potenza dei comandi impiegati senza la sovrastruttura (ed i limiti di eventuali front-end grafici).



Ecco la guida che ai meno navigati può sembrare ostica, ma con un minimo di confidenza col pinguino risulta abbastanza commestibile.

Il comando "dd" legge byte per byte una qualsiasi periferica o file e ne indirizza il risultato al file o periferica di output.



dd accetta i parametri if= (input file) e of= (output file)



Per clonare un disco bisogna avere i privilegi di root, quindi, una volta aperto un terminale nel vostro gnome o KDE bisogna prima di tutto digitare


Only registered members can view code.
oppure


Only registered members can view code.
e digitare la password di root



L'esempio prende in considerazione la clonazione di un intero disco rigido reindirizzando il file prodotto ad un'unita disco esterna (USB), il tutto con le notazioni e convenzioni du un sistema *buntu (debian).


Bisogna prima di tutto individuare l'unità disco origine e quella di destinazione


Only registered members can view code.
Avremo un otput del tipo:

Disco /dev/sda: 82.0 GB, 81964302336 byte
255 testine, 63 settori/tracce, 9964 cilindri
Unità = cilindri di 16065 * 512 = 8225280 byte
Identificativo disco: 0x0eb34caf

Dispositivo Boot Start End Blocks Id System
/dev/sda1 * 1 1958 15727603+ 7 HPFS/NTFS
/dev/sda2 1959 9963 64300162+ f W95 Esteso (LBA)
/dev/sda5 1959 9963 64300131 7 HPFS/NTFS

Disco /dev/sdb: 40.0 GB, 40027029504 byte
255 testine, 63 settori/tracce, 4866 cilindri
Unità = cilindri di 16065 * 512 = 8225280 byte
Identificativo disco: 0xf6b3f6b3

Dispositivo Boot Start End Blocks Id System
/dev/sdb1 * 1 3953 31746081+ 7 HPFS/NTFS
/dev/sdb2 3954 4584 5068507+ 83 Linux
/dev/sdb3 4585 4715 1052257 82 Linux swap / Solaris
/dev/sdb4 4716 4866 1212907+ 83 Linux

Disco /dev/sdc: 4143 MB, 4143972352 byte
33 testine, 63 settori/tracce, 3893 cilindri
Unità = cilindri di 2079 * 512 = 1064448 byte
Identificativo disco: 0xb032b032

Dispositivo Boot Start End Blocks Id System
/dev/sdc1 * 1 3894 4046832 b W95 FAT32


Assumiamo quindi di voler clonare il disco rigido interno /dev/sda e salvare l'immagine "backup" sull'unità USB /dev/sdc1 montata in /mnt/sdc1


NOTA: E' importante che l'unità che si va a clonare sia smontata per evitare che qualcosa vada a cambiarne il contenuto "in corso d'opera" con risultati imprevedibili, quindi ricordatevi di dare un umount a tutte le partizioni montate relative a quell'unità. Nel nostro esempio : sda1 e sda5.


Naturalmente ci servirà comprimere l'immagine per non ritrovarci un file mastodontico che non sapremmo dove mettere.

Per questo abbiamo a disposizione l'ottimo algoritmo di compressione gzip

Per clonare:

Only registered members can view code.
Dove dd legge il disco /dev/sda ne invia il risultato a gzip, che a sua volta lo comprime lo scrive nel file.

Per l'operazione inversa, vale a dire per ripristinare, il comando è:

Only registered members can view code.
Dove gzip decomprime il file e ne invia al risultato a dd che lo scrive sulla periferica.

Piccolo problema: spesso le unità esterne sono formattate in FAT32 che supporta file fino a 4GB oppure si vorrà poi conservare lìimmagine su DVD il cui file system supporta massimo 2GB.

Qui soccorre un altro comanduccio presente in Linux: split, che serve appunto a dividere il file in parti di una data dimensione.

Poniamo di voler suddividere il risultatato in parti di 2GB, compatibili sia con i DVD che con FAT32.

Per clonare daremo:

Only registered members can view code.
Dove dd legge la periferica, invia a gzip, che invia a split, che divide in parti di 2048MB (2GB) e lo scrive sul disco di destinazione.

Notate che il nome del file di destinazione finisce con un "."

Questo perché split aggiunge alla fine del nome del file "aa" "ab" "ac" e così via per distinguere i vari frammenti.

Per rimettere le cose a posto invece usiamo l'ennesimo comando linux: "cat", che unisce (conCATena) tutto quello che gli viene dato in pasto.


Only registered members can view code.
Che preleva i vari pezzi li invia a gzip, che li scompatta e li passa a dd che li scrive sul device.

dd consente un'altra utile funzione che è quella di copiare il bootsector di un disco rigido:

Per copiare il MBR

Only registered members can view code.

per ripristinare il MBR

Only registered members can view code.

:bai

K.a.o.s.
06-04-10, 12: 07
Bella guida :eye,
aggiungerei solo qualche piccolo appunto però: se non si usa gzip (o in generale non la si comprime) si può creare un immagine del disco montabile da terminale, in modo da potervi accedere senza dover necessariamente ripristinarla. Basta montare il modulo loop se non è compilato come buit-in nel kernel (modprobe loop) e poi passare il parametro loop a mount (mount [immagine] /mnt/disco -o loop).

Altro particolare: passando il parametro -9 a gzip si ottiene la massima compressione (più lenta). Sarebbe da sperimentare l'utilizzo con lzma, che, seppur avendo tempi di compressione lunghi, ottiene i migliori risultati (un kernel arriva ad occupare anche fino al 33% in meno con lzma rispetto a gzip). Ovviamente i tempi di estrazione sono più lunghi rispetto a gzip, ma migliori di bzip2.

ginalfa
06-04-10, 17: 16
Giusto. Io comunque ho finalizzato allo storage dell'immagine e non alla fruizione con mount -o loop.
Per i diversi metodi compressione, perchè non posti le righe con le opportune modifiche?

K.a.o.s.
09-04-10, 23: 24
Mi sono dimenticato di questa discussione :shock

Dunque

Per i diversi metodi compressione, perchè non posti le righe con le opportune modifiche?

Beh, per prima cosa non sono su Linux :eye, quindi andrei a mente...


Only registered members can view code.Per la massima compressione di gzip.

Per lzma... non mi ricordo sinceramente il comando ed è solamente un'idea buttata lì :). Bisognerebbe prima fare qualche prova. In ogni caso dovrebbe bastare sostituire gzip con lzma o il giusto comando. :hap

Kirk78
19-06-15, 18: 28
Ciao a tutti!
Ovviamente grazie della guida al mitico ginalfa.
Mi chiedevo come si fa a fare il backup compreso l'mbr di una pendrive dove è installato Debian 8.1.0 con dd, gzip e split. Installato non una live USB.
Bisogna prima (da altro linux installato o da una live) fare il backup dell'mbr a parte e poi la pendrive bootable, e quindi poi fare prima il restore dell'mbr (in caso) e poi il restore del resto, oppure c'è un modo per farlo contemporaneamente?
Io ho una licenza di Acronis ma per linux non è che è andata sempre a buon fine.
Grazie comunque! :bai

ginalfa
19-06-15, 20: 35
dd copia brutalmente byte per byte da cima a fondo, quindi con la sintassi che trovi nel post copi anche la partition table e il MBR.

Kirk78
19-06-15, 21: 23
Chiedo innanzitutto scusa a ginalfa che è l'autore :ehmm (già corretto :fleurs) e contento di avere una tua risposta!
Ma allora

Only registered members can view code.
copia anche l'MBR?
Sopra vedevo che c'è un comando specifico per l'mbr

Only registered members can view code.
e quindi pensavo fosse diversificato e bisognasse fare entrambe le operazioni.

:bai

edit ha anche una partizione di swap, in questo caso la home non è separata

ginalfa
19-06-15, 21: 43
Quel codice serve a copiare SOLO MBR, o meglio, i primi 512 byte in testa all'unità. Se non ricordo male in quei 512 bytes c'è anche la partition table. In seguito magari posso essere più preciso... Sto scrivendo dal cell:ghgh

ginalfa
20-06-15, 08: 18
Dunque, come ricordavo, i primi 512 bytes di un disco contengono il MBR e la PT. Piu precisamente i primi 446 bytes il MBR vero e proprio ed i successivi fino al 512 la PT.
la sintassi è
Only registered members can view code.

dove quel 512 può essere impostato a 446 per il solo MBR.

Per la cronaca esiste un port di dd ed altri comandi anche per windows, anche se la sintassi è un po' differente e più complicata nell'individuazione delle unità. Personalmente preferisco usarli in linux.

Il limite di dd è che si porta dietro spietatamente tutta l'unità, quindi anche i settori vuoti e secondo me è conveniente per la sua rapidità solo per piccole unità.
Se si tratta di fare copie di sistemi installati, magari con diverse partizioni (perchè copiare pure la swap?) è meglio usare clonezilla (http://clonezilla.org/), che ha un sistema più raffinato di copia, che esclude i settori inutilizzati, con benefici sul peso dell'immagine finale.

P.S.
Che bello tornare qui dopo tanto tempo!!!!:sisi

Kirk78
20-06-15, 13: 00
Che bello tornare qui dopo tanto tempo!!!!
Carissimo ginalfa sono estremamente felice di rivederti quì su CT! Bentornato, ci mancavi! :fleurs


perchè copiare pure la swap?
Probabilmente ho detto una sciocchezza ma è solo un anno che sto lavorando di più su linux. Scusami della tonnaggine :ehmm. A me basta che se la pendrive con Debian 8.1 installato, ergo piccola unità da 16GB, va down per qualche motivo ho la possibilità velocemente a ripristinarla all'origine senza doverla reinstallare.


altri comandi anche per windows
win... e che roba è? :ghgh


si porta dietro spietatamente tutta l'unità, quindi anche i settori vuoti
Ma con gzip -9 dovrebbero essere compressi al 100%. Oppure no?

In buona sostanza

Only registered members can view code.
copia tutta ivi compresa la MBR e partition table: corretto?

Ho un brutto rapporto con clonezilla... già un paio di volte, però anni fa, mi ha fatto lo scherzetto di non funzionare oltre che, a me, mi faceva dei file belli grossi e poco compressi. Ma magari adesso è più ottimizzato. :boh

:bai

ginalfa
20-06-15, 22: 29
Non comprime del tutto i settori vuoti.
dd con un pendrive va bene, ma se devi fare una disaster recovery image di un HD con un SO,anche appena installato, con dd ti ritrovi comunque un'immagine poco "potabile".
Ora clonezilla è più affidabile perchè la procedura automatizzata con i valori di default fa meglio il suo dovere.

Con quel comando viene copiato tutto, incluso MBR.

Kirk78
22-06-15, 10: 58
Ma ddrescue non è meglio, anche per dischi con degli errori? Inoltre a quanto ho capito non mette degli zeri quando trova settori danneggiati... insomma tipo clonezilla? C'è anche la funzionalità per file di registro di ddrescue che devo ancora capire... devo ancora studiare ddrescue.

Ddrescue raccomanda lzip che non se comporta una maggiore o minore compressione, e poi non ho ben capito se copia anche i settori.

:bai

Kirk78
26-06-15, 14: 39
Ho fatto un test con

Only registered members can view code.
su una pendrive da 2GB con una sola partizione autopartente da 1GB (il rimanente 1GB non è allocato): perché mi da esattamente 2GB esattamente come la normale clonazione con il parametro of= ? Sembra che gzip -9 abbia compresso un misero 0.7% ratio. Ma lo spazio non allocato un po' di più lo avrebbe dovuto comprimere... :shock
:bai

Andy86
27-06-15, 21: 48
:bai

Probabilmente non hai specificato la partizione, se la pendrive è mettiamo sdc, devi mettere /dev/sdc1, altrimenti mettendo /dev/sdc leggi tutta la pennetta compreso mbr, mpt e spazio non allocato.

Kirk78
29-06-15, 15: 46
Io devo sicuramente fare il backup anche dell'MBR essendo una partizione autopartente. Il dd copia, ahimè, anche lo spazio non allocato. Mi sembrava di aver provato anche con solo la partizione ma non gli piaceva. La partizione da copiare comunque non deve essere montata. :bai

Andy86
29-06-15, 19: 51
Può darsi che lo spazio non allocato non sia pulito, ma è stato utilizzato in precedenza ed è formato da byte casuali.
In teoria le chiavette dovrebbero avere il trim, ma non so se ci sia modo di forzarlo su spazio non allocato, per cui ti suggerirei un operazione rischiosissima, una passata di /dev/zero nella parte di spazio non allocato.

Devi lanciare un comando tipo:


Only registered members can view code.

Però non mi assumo responsabilità se pialli la chiavetta.