dd

De SergiTurWiki

Share/Save/Bookmark
Dreceres ràpides: navegació, cerca

L'ordre dd (dataset definition) ens permet arxivar tot un sistema de fitxers a baix nivell (les dades es copien byte a byte). També serveix per a fer conversions de dades crues (raw data). Les conversions es fan on-the-fly.

Contingut

Introducció

La sintaxi de l'ordre (derivada del Job Control Language - JCL - de IBM ) és:

IMPORTANT: Cal tenir molt de compte en l'ús de l'ordre dd. Un petit error en la sintaxi pot esdevenir en una pèrdua massiva de dades. Per aquesta raó, la utilitat dd 
també es coneguda en broma com a "data destroyer" o "delete data"

Amb dd podem realitzar, entre d'altres, accions com les següents:

  • Emmagatzemar els continguts d'un CD/DVD en un sol fitxer (una imatge de disc)
  • Fer una còpia de seguretat d'un disc dur i/o partició
  • dd s'utilitza molt per recuperar dades perdudes en informàtica forense. El primer que es fa és fer una còpia amb dd del sistema de fitxer on s'han perdut les dades.
  • Fer copies de seguretat de regions especifiques del disc com per exemple el sector d'arrancada o el MBR.
  • Llegir dades de dispositius especials del sistema com /dev/zero o /dev/random
  • Fer una còpia d'un disc o partició del qual no tenim drivers per accedir als seus continguts.
  • Restaurar còpies exactes de discs durs (eina de clonatge). Hi han solucions més avançades com clonezilla

La sintaxi de dd és la següent:

# dd if=cami_del_dispositiu_a_copiar of=cami_del_dispositiu_o_fitxer_on_copiar

On:

  • if=: Indica el path del dispositiu que volem copiar. Poden ser particions (dev/hda1, /dev/sdb2, etc..), dispositius especials (/dev/random), discs durs sencers o dispositius (/dev/sda, /dev/cdrom...), etc.
  • of: és el dispositiu o fitxer on es copien les dades. Es poden per exemple duplicar particions, fer una copia d'una partició a un fitxer, utilitzar dispositius de tot tipus (cintes, cdroms, llapissos USB...).

Per exemple l'ordre:

# dd /dev/sda3 /dev/st1

Aquest exemple copiaria la partició 3 del disc dur primari a una cinta de tipus SCSI (/dev/st1)

Cal tenir en compte que l'ordre dd no es caracteritza precisament per la seva velocitat. Per exemple, si copiem una partició de 200G on només estem utilitzant 100M, es copiaran totes els 200G i no només les dades reals. Podem dir que dd és una eina que fa una imatge exacte del que copia.

Per restaurar l'exemple anterior caldria executar:

# dd if=/dev/st0 of=/dev/sda3

Copiar per blocs. bs i count

Podem copiar per blocs utilitzant el paràmetre bs. bs indica la mida del bloc a copiar i si ho combinem amb el paràmetre count, podem indicar el nombre de blocs a copiar. La mida del fitxer a transferir sempre és:

bs*count

També existeixen les següents mides de bloc:

  • ibs: bloc de lectura (input)
  • cbs: bloc de conversió
  • obs: bloc d'escriptura (output)

Es poden utilitzar també els següents sufixos:

  • c: 1 byte
  • w: 2 bytes
  • b: 512 bytes (que és la mida habitual d'un sector de disc)
  • kB: 1000 bytes
  • K: 1024 bytes
  • MB: 1000*1000
  • M: 1024*1024
  • GB: 1000*1000*1000
  • G: 1024*1024*1024
  • i successivament amb T, P, E, Z, Y.

Algunes implementacions suporten utilitzar el signe de multiplicació:

$ dd bs=2x80x18b if=/dev/fd0 of=/tmp/floppy.image

Conversions

El paràmetre conv permet fer transformacions

  • lcase: transformar majúscules a minúscules
  • ucase: transformar minúscules a majúscules
  • swab: intercanviar cada parell de bytes de l'entrada
  • excl: fallar si l'arxiu de sortida existeix
  • noerror: continuar encara que es trobin errors de lectura
  • nocreat: no crear l'arxiu de sortida

Exemples

Crear una imatge ISO d'un CD/DVD

# dd if=/dev/cdrom of=/home/sergi/imatgeCD.iso bs=2048 conv=sync,notrunc

Escriure tot un disc amb dades aleatòries (dificulta la recuperació de dades)

Si volem fer més que un esborrat d'un dispositiu, podem omplir-lo amb dades aleatòries. Això dificulta el procés de recuperació de fitxers esborrats (informàtica forense):

# dd if=/dev/urandom of=/dev/sda

alternative:

for n in {1..7}; do dd if=/dev/urandom of=/dev/sda bs=8b conv=notrunc; done

Duplicar un disc dur

Un disc sencer:

# dd if=/dev/sda of=/dev/sdb bs=4096 conv=notrunc,noerror

Una partició:

# dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=notrunc,noerror

On

  • noerror: continuar amb el procés de còpia en cas d'error.
  • notrunc: TODO

Fer una imatge d'una partició

Podeu executar:

# dd if=/dev/sdb2 of=/home/sergi/partition.img bs=4096 conv=notrunc,noerror

Amb aquesta comanda farem una còpia de la partició 2 del segon disc al fitxer /home/sergi/partition.img.

Fer una imatge d'una partició i enviar a una màquina remota

Es pot utilitzar dd amb combinació amb ssh utilitzant un conducte (pipe):

# dd if=/dev/sdb2 | ssh usuari@maquina "dd of=/home/usuari/partition.image"

Recuperar els dos primers sectors d'un disquet

Suposant que els sectors ocupen 512 bytes (és lo habitual):

$ dd if=/dev/fd0 of=/home/sam/MBRboot.image bs=512 count=2

Duplicar el MBR

Copiar només el gestor d'arrancada (no còpia la taula de particions):

# dd if=/dev/sda of=/home/sergi/MBR.image bs=446 count=1

Copiar sencer:

# dd if=/dev/sda of=/home/sergi/MBR.image bs=512 count=1

Consulteu MBR.

Convertir un fitxer a majúscules

# dd if=filename of=filename conv=ucase

Feu un benchmark del disc

$ 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

Buscar dades a la memòria del sistema

Es pot fer combinant conductes i l'ordre hexdump:

 dd if=/dev/mem | hexdump -C | grep 'some-string-of-words-in-the-file-you-forgot-to-save-before-you-hit-the-close-button'

Enviar una copia d'una partició a un altre màquina amb netcat (nc)

A la màquina origen:

# dd if=/dev/sda1 bs=16065b | netcat < targethost-IP > 1234

I a la màquina destinació:

# netcat -l -p 1234 | dd of=/dev/sda1 bs=16065b

Consulteu netcat.

Mostrar les estadístiques d'un dd en execució

Enviant una senyal USR1 a un procés dd en execució podem consultar les estadístiques:

 $ dd if=/dev/zero of=/dev/null& pid=$!
 $ kill -USR1 $pid 
 18335302+0 records in 18335302+0 records out 9387674624 bytes (9.4 GB) copied, 
 34.6279 seconds, 271 MB/s 

Everybody has mentioned the first obvious fix: raise your blocksize from the default 512 bytes. The second fix addresses the problem that with a single dd, you are either reading or writing. If you pipe the first dd into a second one, it'll let you run at the max speed of the slowest device.

 dd if=/dev/ad2 conv=noerror,sync bs=64k | dd of=/dev/ad3 bs=64k

Muntar una imatge dd

 $ mount -o loop floppy.img /mntpoint

Crear un fitxer buit d'una mida exacte (/dev/zero)

Podem utilitzar el dispositiu especial /dev/zero per omplir de zeros un fitxer

# dd if=/dev/zero of=fitxer_buit.img bs=1024 count=400
400+0 registres llegits
400+0 registres escrits
409600 octets (410 kB) copiats, 0,00359745 s, 114 MB/s

Aquest exemple crear un fitxer de mida 400KBytes (400x1024bits).

També podeu utilitzar:

$  dd if=/dev/zero of=file1G.tmp bs=1G count=1 

Per fer un fitxer buit de mida 1Giga.

Podeu comprovar que el disc esta buit amb la comanda hexdump:

$ dd if=fitxer_buit.img | hexdump -C | head
800+0 registres llegits
800+0 registres escrits
409600 octets (410 kB) copiats, 0,0438514 s, 9,3 MB/s
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00064000

L'asterisc indica repetició de les dades anteriors (to zeros).

Un cop creat el fitxer buit es pot afegir un sistema de fitxers, per exemple amb l'ordre mkfs.

Com crear discos swap i ext3 en fitxers

Primer preparem un espai:

$  dd if=/dev/zero of=/vserver/images/vm_base.img bs=1024k count=1000

Crea espai per un disc de 1GB.

$ dd if=/dev/zero of=/vserver/images/vm_base-swap.img bs=1024k count=500

Crea espai per un disc de 512Mb.

Ara els formatem:

$ sudo mkfs.ext3 /vserver/images/vm_base.img
...
/vserver/images/mail.img is not a block special device.
Proceed anyway? (y,n) <-- y

Per formatar el swap:

$ sudo mkswap /vserver/images/vm_base-swap.img

Podeu omplir el disc amb un sistema bàsic utilitzat debootstrap

Recursos:

Com crear un disc d'arrancada USB

Consulteu:

GPXE#Com_crear_un_USB_amb_gPXE.3F

convertdd i Virtual Box

Virtual Box té una eina anomenada convertdd que permet convertir una imatge dd a una imatge de virtualBox

Vegeu també

Enllaços externs

IES Nicolau Copèrnic