martes, 5 de octubre de 2021

16 Ejemplos del comando DD para GNU/Linux

Hola a tod@s! Para esta entrada os traigo uno de los comandos mas versátiles de Linux, DD (Dataset Definition). DD es uno de los comandos mas antiguos de Linux, de hecho es muy anterior pues se creo en los años 70 para los sistemas UNIX. Este comando nos permite hacer muchas tareas desde la línea de comandos, algunas de las cuales son totalmente desconocidas para la mayoría de usuarios. De momento voy a hacer un listado con algunos de los usos mas comunes para dd y alguno no tan común. 

No vamos a entrar a fondo porque haría falta varias entradas para relataros todos; el objetivo es que esta entrada sirva como cheatsheet o recordatorio de esta potente herramienta. 

 


 

La sintaxis general del comando dd es: 



# dd if=origen of=destino [opciones]



Origen y destino pueden ser discos, imágenes de disco, particiones, archivos, dispositivos etc.. aparte dd tiene otras opciones como:

bs= (block size) Los mas habituales son 512 y 1M.
 

conv= (conversion) noerror/notrunc/sync

 

  • noerror hace que dd continúe después de que se encuentre un error de lectura;
  • notrunc, esta opción le indica a dd que no trunque el archivo de salida. 
  • sync: esta opción tiene sentido especialmente cuando se usa junto con noerror. Indica a dd que rellene todos los bloques de entrada con NUL. Estas opciones son útiles cuando queramos copiar un disco con errores. 
Hay mas opciones para conv=, y si queréis las podéis consultar con man dd en vuestra terminal.



Estas opciones se combinan normalmente con bs= y count= para que dd localice bloques.

Para saber que bloques se debe saltar dd hay que conocerse bien como funcionan los bloques y sectores en las unidades de disco, de lo contrario el disco debe analizarse anteriormente con cualquiera de las herramientas que hay disponibles como fdisk o badblocks. Mucha precaución con estas opciones pues pueden producir resultados imprevistos.



Aparte de esto podemos combinarlo con otros comandos con pipes ( | ) o redirecciones ( > ), y ejecutar bastantes tareas complejas pero mejor vamos a ver algunos ejemplos:


Con este comando copiamos el disco sda en sdb. El disco destino tiene que ser del mismo tamaño o superior.


~# dd if=/dev/sda of=/dev/sdb bs=1M


Hacemos una imagen con el disco sda en la carpeta del usuario con nombre copia.bin. Para los sistemas GNU/Linux las imágenes de disco no tienen una terminación definida, así que podemos terminarlo en .bin .iso o .img si queremos.


~# dd if=/dev/sda of=/home/usuario/copia.bin



Hacemos una imagen de disco comprimida con gzip en la carpeta del usuario. Con -9 le damos la máxima compresión.


~# dd if=/dev/sda | gzip -c -9 > /home/ usuario/copia.bin.gz



Copiar el MBR.


~# dd if=/dev/sda of=mbr count=1 bs=512



Restaurar la copia del MBR.



~# dd if=mbr of=/dev/sda



Recuperamos los datas ocultos entre el MBR y la primera partición del disco que empieza en el sector 2048.



~# dd if=/dev/sda of=/home/muestra count=2047 skip=1



Restauramos los datos en su sitio original.


~# dd if=/home/muestra of=/dev/sda seek=1


Hacemos copia de un DVD pero saltandose los sectores erronéos.


~# dd if=/dev/cdrom of=/home/copiavd.bin conv=noerror,sync



Hacemos una imagen de un disco saltándose los errores durante la lectura. Muy útil para discos que están en las últimas.



~# dd conv=noerror if=/dev/sda of=/home/disco.sin.errores.img



Limpia el MBR y la tabla de particiones.


~# dd if=/dev/zero of=/dev/sda bs=512 count=1 




Limpia el MBR pero no la tabla de particiones (para borrar el GRUB).



~# dd if=/dev/zero of=/dev/sda bs=446 count=1




Borra el disco completo y los sustituye por ceros.



~# dd if=/dev/zero bs=1M of=/dev/sda



Borra el disco sustituyendo los datos por números aleatorios.




~# dd if=/dev/urandom bs=1M of=/dev/sda



Convierte todas las letras por mayúsculas.



~# dd if=/home/archivo of=/home/archivo conv=ucase


Para terminar tenemos la opción status=progress que muestra el progreso de las operaciones por ejemplo:



~# dd if=/dev/sda of=/home/archivo bs=512 status=progress




Para esto mismo con un efecto mas gráfico podemos combinar dd con PV usando pipes (aunque PV no está disponible para muchas distros, se puede instalar desde la terminal)



~# dd if=/dev/sda |pv|dd of=/home/archivo bs=512



Como podéis ver el comando dd es muy completo y con muchas utilidades, algunas de ellas en apariencia muy diferentes. Espero que esta tabla os sirva y me despido hasta el próximo post.


No hay comentarios:

Publicar un comentario