IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

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.

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.


Duplicar el primer Cilindre

Si volem copiar el primer cilindre d'un disc, és a dir, els primers 64 sectors.

# dd if=/dev/sda of=copia.mbr bs=512 count=64  

Podem copiar-la directament de disc dur a disc dur amb

# dd if=/dev/sda of=/dev/sdb bs=512 count=64

Convertir un fitxer a majúscules

# dd if=filename of=filename conv=ucase

Feu un benchmark del disc

Per comprovar el temps que tarda en crear un fitxer de 1GB (1 GigaByte= 1024M*8bits)

$ dd if=/dev/zero bs=1024 count=1000000 of=/home/sam/1Gb.file

Un altre opció és utilitzar blocs de dades més llargs

$ 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

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

Taula comparativa de temps

ESTADÍSTIQUES Ubuntu Server Ubuntu Desktop ext3 Ubuntu Desktop etx4 Windows XP + Ubuntu Desktop ext3
Mida Sistema Origen 3.6 GB Falta pujar imatge 2.1 GB o 6.2 GB 1GB + 2.61 GB
Temps Previst 60.3 s Falta pujar imatge 27 s o 80.67 s 36 s / 94 s = 130 s
Temps Real 405,413 s Falta pujar imatge -- o 156.11 s 910 s
CPU Dos Processadors Intel Core 2 Duo E4400 @ 2.00 GHz Falta pujar imatge Dual-Core E5700 3.00 GHZ Dos Processadors Intel Core 2 Duo E4400 @ 2.00 GHz
RAM 1.8 GiB Falta pujar imatge 2 GB 2.8 GB
Disc Dur 500 GB Falta pujar imatge 250 GB 500 GB

Troubleshooting. Resol·lució de problemes

TODO

Vegeu també

Proposta pràctiques alumnes:

Pràctiques d'alumnes:

Enllaços externs