dd
De SergiTurWiki
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.
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
