dd, gzip, netcat. Backup e Cloning di un hard disk

Spesso mi capita di dover mettere le mani su sistemi che necessitano di pesanti modifiche.
Quando capita mi piace stare con le spalle coperte, per questo motivo, onde evitare di rovinare qualche dato sensibile, la prima cosa che faccio è clonare il disco fisso.
Ci sono in circolazione una miriade di applicativi in grado di svolgere la mansione ma nessuno mi soddisfa in pieno, vuoi per via delle licenze, vuoi perchè alcuni necessitano di installazione oppure sono dipendenti dal sistema operativo.
Poichè il tempo a mia disposizione è sempre risicato, bisogna trovare una soluzione semplice ma efficace.
Chi lavora su sistemi Unix like sa bene che esistono strumenti validi disponibili direttamente dalla console.

Usare dd
dd è un comodo comando che prende un file in input (parametro if) e lo copia, in un file di output (parametro of).
Questa copia avviene bit per bit senza alcuna modifica, di conseguenza utilizzabile per diversi scopi. Poichè nei sistemi *nix, l’hard disk come tutto del resto, viene visto come un file, dd può essere utilizzato per fare una clonazione.
Abbiamo detto che dd fa una copia bit per bit, di conseguenza è facile intuire che non si tratta di una soluzione salvaspazio.
Possiamo fare molto per ridurre lo spazio necessario all’operazione ma di questo ne parleremo più avanti in questo articolo.
Per copiare il contenuto di un disco (ad esempio hda) su un’altro disco (ad esempio hdb), basta eseguire il seguente comando:

dd if=/dev/hda of=/dev/hdb

Non c’è bisogno di ricordare che hdb deve essere di dimensioni uguali o maggiori di hda.

Per ripristinare la copia del disco basta sostituire il parametro if con il parametro of:

dd if=/dev/hdb of=/dev/hda

Se volessimo copiare il contenuto del disco in un file, il comando sarebbe:

dd if=/dev/hda of=/home/user/myfile.bin

Ovviamente il file di destinazione deve essere creato su un disco diverso da quello che intendiamo clonare.
Tornando al discorso dello spazio, è possibile dirigere l'output verso gzip prima di salvare l'immagine su file ma bisogna tenere in considerazione che sul disco sono presenti sia i files validi che quelli eliminati. Per questo motivo, se il disco è stato utilizzato per diverso tempo, gzip potrebbe essere poco efficiente anche in caso di dischi con tanto spazio a disposizione.
A dare una mano in questo senso arriva ancora una volta dd.
Quello che dobbiamo fare è creare un file dummy in ogni partizione del disco in modo da ripulire tutto lo spazio disponibile:

dd if=/dev/zero of=/mnt/part1/dummyfile; rm -f /mnt/part1/dummyfile
dd if=/dev/zero of=/mnt/part2/dummyfile; rm -f /mnt/part2/dummyfile
...
dd if=/dev/zero of=/mnt/partN/dummyfile; rm -f /mnt/partN/dummyfile

E' assolutamente corretto che ogni comando si concluda con un errore per spazio su disco insufficiente ma ricordate sempre di eliminare i dummyfile altrimenti non ci sarà più spazio sulla partizione.

A questo punto possiamo utilizzare gzip per comprimere il file immagine:

dd if=/dev/hda | gzip -9 > /home/user/myfile.bin.gz

Il comando per ripristinare l'immagine sul disco è il seguente:

gzcat -dc /home/user/myfile.bin.gz | dd of=/dev/hda

Usare netcat
Chi non possiede un disco esterno per compiere le operazioni di clonazione si può affidare a netcat un comando del tutto simile a cat ma destinato alla rete.
Chi vuole adoperare questo metodo deve necessariamente avere la possibilità di comunicare con un altro computer.

Per prima cosa predisponiamo il computer ricevente alla ricezione dell'immagine:

nc -l 4000 | dd of=/home/user/myfile.bin.gz

Il parametro -l mette netcat in ascolto sulla porta indicata dal parametro -p. Tutto ciò che netcat riceve sarà diretto al file /home/user/myfile.bin.gz grazie a dd.

Dall'altro lato invece non dobbiamo far altro che inviare tutti bit verso netcat:

dd if=/dev/hda | gzip -9 | nc 192.168.0.1 4000

Nel nostro esempio l'indirizzo ip del ricevente era 192.168.0.1.

Infine per ripristinare il tutto basta invertire i comandi sui due computer ed utilizzando l'hard disk come destinatario del comando dd:

dd if=/home/user/myfile.bin.gz | nc 192.168.0.1 4000

per inviare il file e

nc -l -p 4000 | gzcat -dc | dd of=/dev/hda

per clonare il disco.

Gli utenti di Windows che desiderano fare il cloning del disco seguendo questa guida possono utilizzare una qualsiasi distribuzione live di Linux come ad esempio Knoppix o Slax.

Uso avanzato di dd
Spesso capita di voler spezzare l'immagine creata con dd in file più piccoli, magari perchè si desidera utilizzare un masterizzatore oppure per ovviare al limite dei 2 giga imposto dalle partizioni FAT di windows.
Comunque sia è possibile spezzare l'immagine creata con dd specificando alcuni parametri aggiuntivi.

dd if=/dev/hda of=/home/user/myfile_01.bin bs=1024 count=1000000

Con il comando precendente si chiede a dd di creare un file da 1GB scrivendo un'immagine contenente 1000000 blocchi da 1024 byte.

dd if=/dev/hda of=/home/user/myfile_02.bin bs=1024 count=1000000 skip=1000000

Tramite il parametro skip chiederemo a dd di saltare i primi 1000000 blocchi prima di iniziare a copiare i dati sul secondo file.
Continueremo in questo modo fino a quando l'intero disco verrà copiato.
Questi parametri sono utili anche con netcat ad esempio quando la connessione tra client e server viene interrota per qualche motivo.
Qual'ora ci fossero problemi di questo tipo, non è necessario riprendere la copia dall'inizio ma e sufficiente controllare quanto dd ha già copiato e riprendere la copia dall'ultimo blocco copiato.
La prima cosa da fare è calcolare quanti blocchi sono già stati copiati nell'immagine. Mediante il comando ls -l è possibile vedere la lunghezza del file immagine; sarà sufficiente dividere questo valore per il parametro bs impartito a dd. Nel caso in cui il parametro bs non sia stato specificato, bisognerà divirere il valore per 512 (valore di default).
Per riprendere la copia sarà sufficiente specificare il parametro skip impostando il risultato ottenuto dalla divisione.

Questo è tutto, spero come al solito di non avervi annoiato troppo.

Alla prossima.

Leave a comment

29 Comments.

  1. ciao Daniele, dd nasce per fare la copia bit a bit di un file/dipositivo. Quasto vuol dire che non ottimizza lo spazio ma si limita a duplicare la fonte sorgente. Inoltre i settori di un file system, benchè vuoti, non sono rappresentati da zeri, la formattazione incide sulle informazioni presenti su disco. In questo articolo si fa uso di /dev/zero per ripulire lo spazio disponibile e consentire una migliore compressione in caso di gzip/bzip. Se devi clonare un disco NTFS, il consiglio è quello di deframmentare il disco oppure usare altri programmi specifici che creano una immagine come Norton Ghost o TrueImage. Questi ultimi però, non fanno una copia bit a bit ma copiano solo le informazioni necessarie a ripristinare il contenuto. In effetti, usando questi programmi, non avresti una immagine uguale all’originale.

  2. Vorrei eseguire da live CD OpenSuse 11.0, il comando: dd if=/dev/sda | gzip -9 > /mnt/dell.image.gz

    per fare il backup immagine del disco SATA (sda) del mio portatile su disco esterno USB 2.0 formattato NTFS, montando la partizione del disco esterno /dev/sdb1 su /mnt. Vorrei inserire il parametro block size bs=4096 per velocizzare l’operazione di copia.Gentilmente dove andrebbe inserito il parametro bs=4096 nella stringa del comando? Entrambi i dischi sono nuovi, quindi si presume esenti da bad block;può essere sufficiente il comando che ho descritto o è consigliabile inserire qualche altro parametro?
    Ringrazio molto per l’eventuale gentile riscontro.

  3. Ciao Andrea, per prima è necessario precisare una cosa. Se usiamo il disco di destinazione per copiare un file immagine, non dobbiamo preoccuparci dei bad block perchè questi vengo marcati correttamente dal file system.
    La soconda cosa da fare è assicurarsi di avere un driver adeguato per montare il lettura/scrittura una partizione NTFS dal momento che il disco esterno scelto per la copia ha questo filesystem.
    Lo dico perchè di norma, il kernel di linux monta NTFS in sola lettura e non c’è verso di specificare un parametro aggiuntivo per la scrittura.
    Da quanto ne so io (e posso sbagliarmi) in OpenSuse dovrebbe esserci il supporto a ntfs-3g, un driver che fa tranquillamente al caso nostro. Prima di procedere dovresti controllare.
    detto questo i comandi che seguono devono essere impartiti come root, quindi se sei su una distro live puoi aprire una finestra terminale e provare il comando:

    sudo su

    se tutto va bene, dovresti diventare “root” (prova eseguendo il comando “whoami”).

    A questo punto devi montare la partizione sulla quale vuoi creare il file di immagine:

    mount -t ntfs-3g /dev/sdb1 /mnt

    Io personalmente non monterei la partizione direttamente sotto /mnt ma in linux puoi fare tutto, anche questo.

    A questo punto il comando per la copia potrebbe essere:

    dd if=/dev/sda bs=4096 | gzip -9 > /mnt/dell.image.gz

    spero di aver scritto tutto correttamente.

    se qualcosa non va fai pure un fischio.

    ciao

  4. Ciao,
    Io ho linux linpus sul aspire one. E dato che attualmente il mio sistema va molto bene vorrei farne un clone in modo da poterlo ripristinare nel caso in cui succeda qualcosa di strano. Ho un hdd esterno da 160gb e una pen drive da 2gb. Come posso fare?Qual’è l parte dell’hdd che devo beckupaer per farlo tornare così come in tutti e per tutto?!Grazie!!!

  5. Dato che questo portatile non ha un lettore cd a disposizione, dovresti caricare una distribuzione live di linux sulla chiavetta usb e fare il boot da usb. questo ti consente di avere a disposizione entrambi i dischi (quello interno e l’altro esterno) per fare il lavoro con dd. Poichè l’Aspire One monta una CPU x86 compatibile, puoi tranquillamente usare una distribuzione live “light”. Io ti consiglio “Rescue Linux” perchè è una distro fatta appositamente per questo. Ovviamente non funzionerà tutto, ma tu hai solo bisogno di una console che funzioni. Fatto questo dovresti essere in grado di procedere con quanto indicato nell’articolo. Se hai problemi, fai un fischio. Ciao.

  6. Perfetto, esattamente quello che cercavo…
    Copio, incollo e salvo ;)

    ps: gzip -9 nn sarà un po’ esagerato???

  7. Dimenticavo… se vuoi clonare solo una partizione e non l’intero disco puoi usare /dev/hdaX dove X è il numero della partizione che interessa. In questo modo puoi escludere dall’immagine le partizioni che non interessano.

  8. testato sulla mia pelle (sotto forma di un hd da 200Gb): gzip -9 ammazza sensibilmnente la performance a fronte di benefici relativi… se avete spazio, consiglierei di non alterare i default di gzip.

  9. ciao
    scusate una domanda da gnubbo sto usando dd in ubuntu e per effettuare un dd una volta crato un file dd come creare una immagine su un’altro disco ?
    ho provato a sostitouire home con sdb2
    ma non ho ottenuto risultati . posso chiedere anche se ci sono metodi per generare una iso direttamente? e da cosa capisco che è teminato il processo di acquisizione dei dati?
    sono in bel guaio magari per voi è semplicissimo lo spero

  10. ciao gnubbo74, stai facendo un po di confusione tra ciò che è una cartella (home) e ciò che è una partizione (sdb2). Se quello che vuoi ottenere è la clonazione semplice del disco allora forse non hai bisogno di creare una immaggine. Se non sei tanto pratico di linux, descrivi dettagliatamente il problema e vediamo insieme qual’è la soluzione migliore. Se vai a tentoni con dd rischi di cancellare il contenuto del disco che vuoi copiare.

  11. ciao scusa la domanda che potrebbe risultarti stupida ho creato un file con estensione dd e ora come lo posso usare per vedere il contenuto?

  12. non è una domanda stupida. un file dd contiene la copia bit a bit di un flusso binario. poichè consente di fare ad esempio copie grezze (raw) di un dispositivo, di uno stream viedo/audio, di un file,… dd non può essere considerata una estensione. è fondamentale sapere a priori cosa contiene il flusso o quanto meno bisogna essere in grado di capirne la provenienza. un aiuto puoi trovarlo in comandi come “file”. sapresti dirmi come hai creato questo file? forse posso aiutarti a “leggere” il file in modo corretto.

  13. Ho creato attraverso uno strumento l’immagine dd di un Hard Disk in 10 files da 4 Gb. Ora non so come fare per creare un unico file dd oppure riscompattare l’immagine su un Hard Disk.

  14. Sapresti dirmi come si chiama il programma che hai usato?

    Per concatenare i files puoi usare dd.

    Supponiamo che tu abbia due file da 1 GB da voler unire in uno da 2, potresti usare due comandi come questi:

    dd if=InputA of=Output bs=1024
    dd if=InputB of=Output bs=1024 seek=1048576

    Il parametro bs indica la dimensione del blocco in byte mentre il comando seek indica il numero di blocchi da saltare prima di continuare a copiare il secondo file. I numeri non sono casuali, infatti usando blocchi di dimensioni paria 1.024 hai bisogno di 1.048.576 blocchi per poter scrivere 1.073.741.824 (pari ad 1 gigabyte).

    La stessa cosa la puoi fare per ripristinare i dati su disco, basta sostituire il paramentro of con il device (es: /dev/sda2).
    Devi però essere sicuro di conoscere il contenuto dei file e l’esatta sequenza. Alcuni programmi utilizzano appositi header per indentificare il contenuto dell’immagine che contengono. In questo caso i comandi usati in precedenza non saranno utili a meno di non rimuovere l’header con il parametro skip.

  15. salve. ho letto l’articolo, molto utile devo dire, ma avrei bisogno di chiarimenti sul comando “bs=*”
    in rete, si legge spesso di come questo comando può essere utile per creare da un file immagine .iso, come quello di una distribuzione linux live, per creare una pennetta usb live:
    dd if=/path/del/percorso.iso of=/dev/sdb1 bs=1024
    da altre parti però ho notato che consigliano di usare “bs=4096″ a questo punto, non ho ben chiara la funzione, in questo caso, di questa opzione bs=*
    dipende forse dallo spazio che si ha a disposizione sulla pennetta?
    grazie per l’attenzione

  16. questa è una bella domanda.
    Ad esempio: se volessi sotituire un solo byte potrei impostare il parametro ad 1.
    Quando si parla di dispositivi hardware come hd, penne usb e cdrom, le partizioni di un sistema operativo potrebbero essere ottimizzati per file di piccole dimensioni oppure per grandi dimensioni.
    Nel primo caso si usano blocchi più piccoli (es 512) nel secondo blocchi più grossi (es 4096). Questo vuol dire che nel secondo caso di 4096 di blocchi ce ne sono meno e ciò comporta un numero inferiore di letture. Se usi blocchi grossi per poi usare file piccoli rischi di sprecare spazio perchè generalmente un blocco non può contenere file differenti. Quindi se su un disco devi conserave un film allora conviene altrimenti no.
    In genere per dd il parametro bs ha un significato leggermente diverso perchè tutto dipende dall’hardware. Ad esempio, se impostiamo bs a 1024 su un dispositivo suddiviso in blocchi da 512, dd farà due letture prima di procedere con la scrittura. se invece impostiamo il blocco su 4096 ne farà addirittura 8. Tutto a questo punto dipende dalla chache della chiavetta, del driver e dell’hard disk. In genere usare blocchi più grandi server per fare letture e scritture più veloci perchè di numero inferiore. Attenzione però: se volessi estrarre una immagine dal disco byte per byte con bs=1 sappi che la lettura sarebbe sempre dell’intero blocco. Esempio: se il blocco del file system è impostato a 512 e c’è un errore sul byte n 127, sappi che la lettura del byte n 3 non sarà possibile, la lettura avviene sempre per 512 byte per volta. Il mio consiglio è quello di usare un multiplo del blocco. 4096 è un buon compromesso per dispositivi che hanno blocchi da 512, 1024 e 2048 byte.

  17. ciao! avrei anche io un problema ,se mi puo rispondere!tentando di ricoverare dei dati da un hdd daneggiato ho provato a farlo con testdisk-6.11.3\win,che dopo alcuni tentativi ed erori mi ha chiesto se volevo fare una copia interra del hdd ,l’ho fatta e mi ha fatto un file .dd da 18gb(l’hdd essendo da 20),ora non saprei come usare questo file .dd per poterlo scompattare !avrei a disposizione un hdd da 80gb per poter scrivere questo .dd,però ho paura di non romperlo! queto testdisk l’ho messo sia su win che su ubuntu…. se mi puo dare qualche delucidazione la ringrazio tanto!

  18. i file con estensione .dd di testdisk sono la copia bit a bit del disco originale. si tratta di una copia grezza (raw). Questo mi fa pensare che sull’hard disk manchi o sia danneggiata la tavola delle allocazioni. per ripristinare l’immagine su un altro disco puoi usare il comando: dd if=nonefile.dd of=/dev/device
    questo non comporta particolari problemi sul disco di destinazione ma comunque ti resta il problema di recuparare la/le partizioni danneggiate.
    Se posti l’output completo forse ti posso aiutare.

  19. se con output intendi il file log sarà 30000km lungo quindi te lo posso inviare tramite mail!quindi se scrivo un hdd con questa imagine mi resta comunque ilegibile! giusto?allora mi sa che lascio perdere…ho gia provato anche con altri sof che mi vededvano anche la partizione però quando andavo a toccarla iniziava elencarmi gli erori di lettura di vari settori e poi si bloccavano (di windows non ne parlo poi)… sarà tutto partito questo hdd o sarà qualche guasto fisico?

  20. si, mandalo pure in posta. io mi sono trovato benissimo con R-Studio. ottimo anche per le indagini forensi. tu cosa altro hai usato?

  21. scusa l’ignoranza, ma facciamo il caso che io debba clonare un disco /dev/hda che ha x partizioni e lo spazio veramente occupato è solo 1/4, come posso fare con il dd a clonare /dev/hda in un file senza che dd mi prenda ogni blocco e quindi anche quelli a zero creandomi quindi un file risultante di 40 GB ???

  22. Ciao
    uso ubuntu 9.10
    ho chiesto info e mi hanno linkato il tuo sito. ho letto la tua guida ma penso di aver commesso un’errore.
    io ho fatto così:
    dd if=/dev/sda6 of=/media/LaCie/LACIE/HD_sda6/backup_partizione_1 bs=1024k
    il file che ho creato (backup_partizione_1) non ha alcuna estensione.quando avrò bisogno di ripristinare tutto se scrivo il comando nella maniera seguente è corretto?:
    dd if=/media/LaCie/LACIE/HD_sda6/backup_partizione_1 of=/dev/sda6 bs=1024k

    e nel caso che in /sda6 ci sia un’altra distro montata che a me non interessa più utilizzare il comando cosa fa me la sovrascrive??
    Non so se sono domande banali ma questo comando faccio un po’ fatica a farlo mio. Grazie per l’attenzione
    Kiefer

  23. Per quanto riguarda l’estensione non devi assolutamente preoccuparti. In linux valgono poco e niente. L’importante invece è il contenuto. Nel caso di dd il contenuto è binario (serie di zeri ed uno) che hanno senso solo per l’utente e non per il sistema operativo. Il comando per ripristinare la partizione è corretta ed il risultato sarà quello atteso: se hai una distribuzione in /dev/sda6 questa verrà sovrascritta. Attenzione però, perchè l’mbr potrebbe ancora essere quello orginale e di conseguenza per far ripartire il sistema probabilmente dovrai rimettere mano alla configurazione di boot. Comunque sia ti do un consiglio: quando fai un backup di qualunque tipo, una clonazione in questo caso, ti trovi a metà del lavoro. Senza aver provato (almeno una volta) il relativo ripristino è difficile sapere se tutto è ok. Per essere tranquilli, dopo aver fatto il disk dump, dovresti tentare il rispristino su un altro disco (di capacità adeguata) per assicurarti che effettivamente non ci siano problemi. Se non possiedi un disco da dedicare alla prova, almeno dovresti montare l’immagine e verificarne il contenuto. Spero di averti aiutato.

  24. ciao complimenti ancora,
    vorrei sapere se è possibile avere un report degli errori e/o se da esito positivo

  25. ciao mass1. se vuoi solo conoscere l’esito del comando puoi usare un semplice echo. es:

    dd if=/dev/sda of=/dev/sdb && echo “ok.”

    se invece vuoi monitorare in tempo reale lo stato di avanzamento della copia puoi usare il segnale USR1 mandando il comando in background. es:

    dd if=/dev/sda of=/dev/sdb& pid=$!
    kill -USR1 $pid;

    in pratica $pid contiene il numero del processo e con kill interroghi le stetistiche. spero di aver risposto alla tua richiesta.
    se non vuoi mandare dd in background puoi prendere nota del processo attivo tramite una nuova console (o terminale) con il comando “ps” ed usare il comando kill (sempre da altra console).

  26. Ho un Acer aspire 5610 con sopra ubuntu e una virtualbox con winwodw XP, Essendo ipossibile continuare ca lavorare con un hd veramente misero (lotto ogni giorno con ifile da cancellare) vorrei sostituire il vecchio con un nuovo hd mopiù capiente. Domanda: Quale procedura posso usare per raggiungere questo obiettivo? in modo da poter, poi, sostituire i due hd e continuare come se niente fosse—-

  27. la cosa migliore in questi casi secondo me è utilizzare clonezilla oppure norton ghost. in questo modo puoi copiare le stesse partizioni che avevi dal vecchio hd al nuovo senza sforzo. In alternativa puoi utilizzare il comando dd sull’intero disco e poi usare un programma come partition magic per estendere le partizioni fino a raggiungere la massima capacità consentita. Se invece vuoi fare tutto in linux con gli appositi comandi, potresti partizionare il nuovo disco secondo le tue esigenze con fdisk avendo cura di avere partizioni grandi a sufficienza, formattarle a dovere ed infine clonare le partizioni con dd. Te lo sconsiglio però perchè è un procedimento lungo e lascia il disco nuovo frammentato come il vecchio.

  28. il vantaggio della soluzione proposta, con comandi che operano a basso livello, per l clonaggio è che saranno valide anche tra qualche anno, molti anni probabilmente, e non sono soggette ai capricci di software che cambiano per motivi che poco hanno a che fare con la loro efficienza.
    è esattamente il tipo di soluzione che cercavo per salvare le partizioni di sistema dei miei pc

    un grazie di cuore a vittorio per la semplicità della soluzione e la chiarezza della spiegazione

Leave a Reply


[ Ctrl + Enter ]