Il comando dd e tutto ciò ad esso associato

Comando dd

Utilizzo comando dd

Sui sistemi UNIX, c’è un comando molto antico chiamato dd. È progettato per copiare qualcosa da qualche parte in byte. A prima vista, nulla di eccezionale, ma se si considerano tutte le funzionalità di questo strumento universale, è possibile eseguire operazioni piuttosto complesse senza utilizzare un software aggiuntivo, E possibile, ad esempio: eseguire il backup di un MBR, creare dump di dati da unità diverse, supporti mirror, ripristinare dati da un backup sui media e molto altro ancora, inoltre le funzionalità di dd, supportando gli algoritmi crittografici del kernel Linux, è possibile persino creare file crittografati che contengano tutti i file sistema.
Di seguito, nella nota, descriverò gli esempi più frequentemente usati di utilizzo del comando, che facilitano enormemente il lavoro sui sistemi UNIX.

Inizierò con un piccolo esempio che illustra chiaramente i principali parametri:
# dd if=/dev/urandom of=/dev/null bs=100M count=5

opzioni:

  • if: indica la fonte, da dove copiamo. Viene specificato un file, che può essere un file normale o un file di dispositivo.
  • of: punta al file di destinazione. Ugualmente, possiamo scrivere come in un normale file e direttamente sul dispositivo.
  • bs: il numero di byte da scrivere alla volta. È possibile rappresentare questo argomento come i dati della dimensione del blocco da scrivere o leggere e il numero di blocchi viene regolato già dal parametro successivo.
  • count: questo è il numero che indica quanti pezzi saranno copiati.

Pertanto, il comando descritto legge 5 X 100 megabyte dal dispositivo /dev/urandom e scrive sul dispositivo /dev/null.

Eseguendo il commando si scopre che il sistema genererà 500 megabyte di valori casuali e li scriverà sul dispositivo null. Ovviamente, l’unica cosa che questo comando farà è caricare il processore per alcuni secondi. Ecco alcuni esempi dalla pratica:

Creazione di un’immagine del disco:
#dd if=/dev/cdrom of=image.iso

Il comando leggerà i dati dal dispositivo e scriverà sul file fino a raggiungere la fine del dispositivo. Se il disco è rotto, puoi provare a leggerlo, ignorando gli errori di lettura:
# dd if=/dev/cdrom of=image.iso conv=noerror

Il parametro “conv” consente di collegare diversi filtri applicabili al flusso di dati. Il filtro “noerror” semplicemente ferma il programma quando incontra un errore di lettura. Pertanto, alcuni dati dal disco possono ancora essere letti.
A proposito, puoi connettere queste immagini usando il comando mount con l’opzione “-o loop”:
# mount -o loop image.iso /mnt/image
Se qualcosa non funziona, possiamo dividere il processo in 2 livelli:
# losetup -e /dev/loop0 image.iso
# mount /dev/loop0 /mnt/image
Se questo non funziona, allora il file system dell’immagine è compromesso.

Una soluzione molto semplice, anche se non ottimale, per la clonazione di un disco rigido:
# dd if=/dev/sda of=/dev/sdb bs=4096

Copia disco sda con una dimensione del buffer di 4 KB. Lo svantaggio del metodo è che con qualsiasi percentuale di utilizzo della partizione, tutti i bit verranno copiati, il che non è utile quando si copiano partizioni con percentuale di utilizzo basso. Per ridurre il tempo in caso la manipolazione di grandi quantità di dati, si può semplicemente trasferire l’MBR sul nuovo media, e semplicemente copiare i file.

Come opzione, puoi persino creare una sezione di backup sulla rete anche nei tempi previsti. Avendo disabilitato le chiavi ssh il seguente schema funzionerà:
# dd if=/dev/DEVICE | ssh user@host "dd of=/home/user/DEVICE.img"

Una volta ho letto uno studio in base al quale una grande percentuale di dischi buttati è soggetta al recupero dei dati senza l’utilizzo di strumentazione particolarmente sofisticata e contiene informazioni riservate. Per garantire che nulla possa essere recuperato sul supporto, è possibile utilizzare gli zeri:
# dd if=/dev/zero of=/dev/DEVICE

Operazioni con MBR
L’MBR si trova nei primi 512 byte del disco rigido e contiene una tabella delle partizioni, un bootloader e una coppia di componenti aggiuntivi. A volte serve eseguire il backup, ripristinare, ecc. Il backup è fatto in questo modo:
# dd if=/dev/sda of=mbr.img bs=512 count=1
Ripristinare è ancora più semplice:
# dd if=mbr.img of=/dev/sda

Con dd, è possibile generare file e quindi utilizzarli come contenitori di altri file system, anche in forma crittografata. La tecnologia è la seguente:
# dd if=/dev/zero of=image.crypted bs=1M count=1000
È stato creato un file di dimensioni quasi pari a un gigabyte. Ora è necessario rendere questo file un dispositivo a blocchi e, allo stesso tempo, passare attraverso il meccanismo di crittografia del kernel di Linux. Sceglierò l’algoritmo blowfish. Caricamento del modulo:
# modprobe cryptoloop
# modprobe blowfish
Associazione immagine con un dispositivo a blocchi con crittografia abilitata:
# losetup -e blowfish /dev/loop0 image.crypted
Il comando chiede di inserire una password, che sarà la chiave per l’immagine. Se la chiave è inserita in modo errato, il sistema non si “monta”. È possibile ricreare immagine utilizzando la nuova chiave, ma non ci sarà accesso ai vecchi dati.
Creare un file system e montare:
# mkfs.ext2 /dev/loop0
# mount /dev/loop0 /mnt/image
L’immagine è pronta per scrittura dei dati. Dopo aver completato il lavoro con esso, è necessario ricordarsi di smontarlo e disconnetterlo:
# umount /dev/loop0
# losetup -d /dev/loop0
Ora l’immagine crittografata è pronta.

Il programma “dd” è un chiaro esempio di ciò che l’IT chiama “UNIX way”: un comando fa parte di un meccanismo, svolge il suo compito esclusivamente e lo fa bene.