4.3.3.- La utilidad dd

dd_titulo

Este comando permite copiar y convertir datos de archivos a bajo nivel. Es generalmente usado para realizar operaciones avanzadas sobre dispositivos o archivos, como pueden ser:

  • Transferencias de datos específicos.
  • Copias de seguridad de la información «en crudo» (raw data).
  • Conversión de algunas codificaciones soportadas y/o caracteres predefinidos.

Su sintaxis es:

dd_sintaxis

Un ejemplo claro, puede que necesitemos crear una presentación de un CD-ROM que pueda ser almacenado en un disco duro o poderlo copiar en un sistema de ficheros no inteligible por Linux. Para ello, podemos utilizar la utilidad dd. Esta utilidad hace copias de bajo nivel; si especificamos como entrada el fichero de un dispositivo de una partición, este copiara el contenido de dicha partición en el fichero de salida especificado. Los ficheros de entrada y salida se pasan con el identificador if=fichero y of=fichero.

Los principales parámetros son:

  • if=origen.- Lee desde el archivo indicado como origen. Por defecto lee de la entrada estándar.
  • of=destino.- Escribe al archivo indicado como destino. Por defecto escribe en la salida estándar.
  • ibs=N.- Lee N bytes del archivo origen.
  • obs=N.-Escribe N bytes en el archivo destino.
  • bs=N.- Lee y escribe N bytes. Alternativa a usar ibs y obs con un mismo valor.
  • cbs=N.- Establece en N bytes al tamaño del bloque de conversión para block y unblock.
  • skip=N.- Se salta N bloques del archivo origen antes realizar la operación de copiado. El tamaño del bloque es indicado por ibs.
  • seek=N.- Se salta N bloques del archivo destino antes realizar la operación de copiado. El tamaño del bloque es indicado por obs.
  • count=N.- Copia N bloques del archivo origen, en vez de procesar hasta el final. El tamaño del bloque es indicado por ibs.
  • conv=modo[, modo,...].- Realiza las operaciones de conversión, según se indique.

Se puede indicar más de una conversión, separándolas por comas. Conversiones soportadas:

  • ascii.- Convierte los caracteres EBCDIC a ASCII.
  • ebcdic.- Convierte los caracteres ASCII a EBCDIC.
  • ibm.- Convierte los caracteres ASCII al EBCDIC de IBM.
  • lcase.- Intercambia las mayúsculas por minúsculas.
  • ucase.- Intercambia las minúsculas por mayúsculas.
  • swab.- Intercambia cada par de bytes de la entrada. Para el caso especial del último byte, este se copia directamente.
  • noerror.- No se detiene el proceso ante errores de lectura en el origen.
  • notrunc.- No se trunca el archivo utilizado como destino.
  • sync.- Rellena cada bloque leído con ceros, hasta el tamaño determinado por ibs.
  • block.- Rellenar con espacios en blanco la línea leída, hasta el tamaño indicado por cbs. Reemplaza el carácter de nueva línea por espacios, convirtiendo la línea en un bloque (o registro).
  • unblock.- Reemplazar los últimos espacios en blanco por un carácter de salto de línea del registro leído, que posea el tamaño indicado por cbs. Realiza la operación inversa a block.

La utilidad dd puede ser un buen modo de crear copias exactas de particiones completas, pero, como herramienta genérica para copias, presenta serios problemas ya que hace las copias completas, incluyendo todos los espacios vacíos. Por ejemplo si tenemos una partición de 1Gb que solo contiene 10Mb de ficheros, requerirá 1Gb de espacio de almacenamiento.

Tampoco podemos restaurar ficheros individuales, a menos que el dispositivo de destino sea un dispositivo de acceso aleatorio que no se pueda montar; si hacemos una copia en cinta, deberemos restaurarlo todo (al menos, para un fichero temporal o partición) para recuperar un único fichero.

No resultará fácil restaurar la información en una partición que es más pequeña que la partición original. En el caso que lo hagamos en una partición mayor, acabará por desperdiciar parte del espacio disponible en ésta.

A pesar de estos problemas, dd puede resultar útil en algunas situaciones como por ejemplo hacer una copia exacta de un CD-ROM. Puede utilizar dd para copiar un disco para el que Linux carece de drivers de sistema de fichero. Si queremos crear varias instalaciones idénticas de Linux, podemos hacerlo empleando dd para copiar una instalación de trabajo en varios ordenadores, siempre que tengan los discos duros del mismo tamaño.

Podemos usar dd para crear un fichero vacío de un tamaño en particular, puede copiar desde el dispositivo /dev/zero (un dispositivo de Linux que solo devuelve ceros) hacia un fichero de destino. Sin embargo, tendremos que utilizar las opciones bs=tamaño y count=longitud para definir el tamaño y la longitud de los bloques del fichero.

dd_ejemplo5

Ejemplo de uso en nuestro penUSB de prácticas.

Vemos que se ha creado en el dispositivo penUSB de prácticas el archivo fichero_vacio.img cuyo contenido son ceros que llenan el espacio que le asignamos  con bs y count.

Con un editor hexadecimal vemos la composición del archivo fichero_vacio.img.

Con un editor hexadecimal observamos la composición del archivo fichero_vacio.img.

Podemos crear CD-ROM, DVD-ROM y penUSB de arranque:

dd_arranque_isosSegún el tamaño de la imagen ISO habrá que esperar unos minutos…

Mientras vamos desglosando:

dd_arranque_2

En este ejemplo se está haciendo un penUSB de arranque con la Distribución de Linux Tails. Sigamos:

dd_iso_3

Hacer copias de seguridad de dispositivos ópticos

Estos dispositivos requieren procedimientos de copia especiales. Generalmente, cdrecord acepta entrada de un programa como mkisofs, que crea un sistema de ficheros ISO-9660 o UDF (el tipo de sistema de ficheros más habitual en CD-ROM y DVD).

Para copiar en un dispositivo óptico tenemos varias opciones; una sería utilizar mkisofs y, luego, hacer cdrecord para copiar los ficheros en el disco. Sin embargo, si copiamos estos ficheros “en bruto”, perderemos algo de información, como, los bits de los permisos de escritura.

Tendremos mejor suerte si creamos un archivo tar o cpio en disco. Después podremos utilizar mkisofs para colocar dicho archivo en un sistema de ficheros ISO-9660 o UDF y grabar seguidamente el fichero de imagen en el disco óptico. El resultado será un disco que podremos montar y que su contenido será un archivo que se podrá leer con tar o cpio.

La opción más directa sería crear un fichero de archivo y grabarlo directamente en el disco con cdrecord, evitando el paso por mkisofs. Un disco de este tipo no se podría montar de la manera habitual, pero podría acceder directamente al archivo utilizando el fichero del dispositivo óptico (como /dev/cdrom) en lugar del nombre de fichero del dispositivo de cinta (como /dev/sf0).