dd
Sembra un comando poco amichevole, ma se si inizia ad usarlo, vederete che si tratta di un comando potente in grado di fare molte cose diverse, un backup di una partizione, CD o chiavetta USB per esempio oppure alcuni semplici test sulla velocità dei dischi o la CPU.
La pagina man dice:
dd
è un’applicazione che “converte e copia un file”
Ma vediamo qualche trucco con esso.
Il clone GNU di dd
fa parte del pacchetto fileutils, e direi che qualsiasi Linux dovrebbe averlo installato.
Diversamente dalla maggior parte dei comandi Unix, dd
utilizza un formato chiave=valore per i suoi parametri.
Uso Base
L’utility dd copia il file di input specificato nell’uscita specificata con possibili conversioni. Lo standard input e output vengono utilizzati di default. Le dimensioni dei blocchi di input e output possono essere specificati per sfruttare raw physical I/O. Le dimensioni sono specificate in byte, un numero può terminare con k, b, o w per indicare la moltiplicazione per 1024, 512, o 2, rispettivamente. I numeri possono anche essere separati da x per indicare la moltiplicazione.
Quindi le opzioni base sono:
if= file Specifica il percorso di ingresso. Lo Standard input è il default.
of= file Specifica il percorso di uscita. Lo Standard output è il default.
Esempio 1
# dd if=/dev/sda of=/dev/sdb |
Questo comando farà la esatta copia di /dev/sda in /dev/sdb
Esempio 2
#dd if=/dev/dvd of=dvd.iso |
Questo comando farà una copia del DVD nel file dvd.iso
Esempio 3
#dd if=/dev/zero of=/dev/sda |
Riempie la partizione /dev/sda con zero, utile per far scomparire una partizione fisica (o logica).
Esempio 4
# dd if=/dev/hda | gzip > hda.img.gz |
Questo comando farà una copia di /dev/hda e attraverso una pipe la passa al programma di compressione gzip.
Aggiungere la dimensione del blocco e il numero di blocchi
Con dd si possono utilizzare anche 2 parametri importanti:
bs= n Imposta sia le dimensioni dei blocchi in n byte per l’input che per l’output.
count= n Copia solo n blocchi di input.
Esempio 5
# dd if=/dev/zero of=/dev/null bs=1M count=32768 32768+0 records in 32768+0 records out 34359738368 bytes (34 GB) copied, 2.64483 s, 13.0 GB/s |
Questo comando vi darà la larghezza di banda processore/ memoria in GB/s (nell’esempio, una VPS su linode.com)
Esempio 6
#dd if=/dev/sda of=/home/sam/MBR.image bs=512 count=1 |
Questo comando crea un’immagine del intero master boot record (compresa la tabella delle partizioni).
Esempio 7
#dd if=/dev/zero bs=1024 count=1000000 of=/home/sam/1Gb.file #dd if=/home/sam/1Gb.file bs=64k | dd of=/dev/null |
Questi comandi possono essere usati per fare un test di benchmark sui dischi ed analizzare le prestazioni di lettura e scrittura sequenziali per blocchi di byte a 1024.
Cerca e Salta
Queste 2 (seek e skip) opzioni sono un po’ meno comuni ma possono essere utilizzate per eseguire compiti particolari.
skip= n Salta n blocchi di input (utilizzando la specifica dimensione del blocco di ingresso) prima di iniziare a copiare. Se il file è ricercabile, il programma legge n blocchi o cerca di superarli. Sui file non-ricercbili, i blocchi sono letti e dati vengono scartati.
seek= n Salta n blocchi (utilizzando la specifica dimensione del blocco di uscita) dall’inzio dell’output prima di iniziare a copiare.
Esempio 8
## dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8 |
Questo comando mostra informazioni sul BIOS leggendo la memoria da C: 0000 a F: FFFF senza la necessità di dmidecode.
Esempio 9
#dd bs=1k if=image.nrg of=image.iso skip=300 |
Questo comando converte un file immagine Nero in ISO rimuovendo l’intestazione di 300k da un file di immagine di Nero si converte in formato ISO
Conclusioni
Questa è solo una piccola panoramica delle opzioni più comuni per dd
, c’è anche l’opzione di conversione che permette di convertire molti formati di file diversi, forse sara il tema di un altro articolo.
Popular Posts:
- None Found
There is a typo in example 4. Should be:
dd if=/dev/hda | gzip > hda.img.gz
Thank you.
same typo in example 8
There is also a basic graphical dd client written in C# and GTK available here, should you be interested.
It doesn’t yet support setting block sizes or count, but they will be added eventually.
http://rockcomputing.co.uk/projects.html
Nice overview! Here’s another useful tip: to make dd output it’s progress, open up another terminal window and enter “killall -USR1 dd”. As with anything using kill or killall, make sure you type it correctly before hitting enter.
You can verify that a disc burned properly by doing a bit by bit comparison using dd and cmp. You’ll want to unmount the disc first then run this command.
dd if=[device file for your optical drive] | cmp [ISO file name ]
example:
dd if=/dev/sr0 | cmp my.iso
I guess the same could be used for verifying files too.
Couldn’t you just do “cmp /dev/sr0 my.iso” and leave dd out entirely?
Sure, but this is the
dd
gudie 😉I have tried example #6 many times and it has never worked! I don’t get any errors, I just get another prompt. I never get a MBR.img file or anything else.
Check your output file destination. If you just want to create the file in your current directory, simply use of=MBR.image. You may also need to run the command as root. Some distro won’t report any privilege error.
One kind hint
I have two disk images.
One is partial and covers the first 50% of a drive called “hdd A” (320GB), let’s call that partial image “disk-A-img1.bin”
Next I have “disk-A-img2.bin”, which is 100% image of the same “hdd A” but contains many damaged sectors, especially in the first 50%.
The goal I’d like to achieve is to use dd to overwrite the initial part of “disk-A-img2.bin” with the bytes contained in “disk-A-img1.bin”.
Is it as simple as providing
dd if=/tmp/disk-A-img2.bin of=/disk-A-img1.bin
or are they required some more parameters?I ask this since I’m worrying about the file disk-A-img1.bin to be truncated at the size of disk-A-img2.bin, while as described above, disk-A-img1.bin is required to remain it original size 320GB.
Thank you for hinting
Frank