Guía de Linux Para el Usuario - Comandos divertidos (II)
Tutorial creado por Larry Greenfield. Extraido de: http://es.tldp.org/Manuales-LuCAS/GLUP/glup_0.6-1.1-html-1.1/
16 de Febrero de 2006
Linux
21 - Comandos divertidos (II)
dd, el duplicador de datos
La leyenda dice que allá lejos en las nieblas del tiempo, cuando el primer UNIX fue creado, sus desarrolladores necesitaron un comando de bajo nivel para copiar datos entre dispositivos. Como tenían prisa, decidieron tomar prestada la sintaxis usada en las máquinas IBM-360, y desarrollar más tarde un interfaz consistente con la de los otros comandos. El tiempo pasó, y todos se acostumbraron tanto con la manera extraña de usar dd que ya ha quedado así. No se si es verdad, pero es una bonita historia para contar.
Opciones
A decir verdad, dd no es totalmente distinto de los otros comandos de UNIX: es en realidad un filtro, esto es, lee por defecto de la entrada estándar y escribe en la salida estándar. Por tanto, si Vd. escribe sólo dd, la terminal se queda quieta, esperando una entrada, y un |_Ctrl-C_| es la única cosa con sentido a teclear (para cortarlo).
La sintaxis del comando es como sigue:
- dd [if=archivo_entrada] [of=archivo_salida] [ibs=cant_bytes] [obs=cant_bytes]
[bs=cant_bytes] [cbs=cant_bytes] [skip=cant_bloques]
[seek=cant_bloques] [count=cant_bloques] [conv={ascii, ebcdic, ibm, block,
unblock, lcase, ucase, swab, noerror, notrunc, sync}]
Todas las opciones son de la forma opción=valor. No se permite ningún espacio ni antes ni después del signo de igual; esto solía ser molesto, porque el intérprete de comandos no expandía un nombre de fichero en esta situación, pero la versión de bash presente en Linux es bastante inteligente, así que Vd. no tiene que preocuparse por eso. Es también importante recordar que todos los valores numerables (cant_bytes y cant_bloques citados arriba) pueden ser seguidos por un multiplicador.
Las opciones posibles son b para bloque, el cual multiplica por 512, k para kilobytes (1024), w para palabra (2), y xm que multiplica por m.
El significado de las opciones se explica a continuación.
if=archivo_entrada
y of=archivo_salida instruye a dd a respectivamente leer de archivo_entrada y escribir a archivo_salida. En el último caso, el fichero de salida es truncado al valor dado por "seek" , o si la palabra clave no está presente, a 0 (esto es, borrado), antes de realizar la operación. Mire también la opción "notrunc".
ibs=nn
y obs=nn especifican cuantos bytes deben ser leídos o escritos a la vez. Creo que por defecto es 1 bloque, esto es, 512 bytes, pero no estoy muy seguro de ello: desde luego funciona de esa manera con ficheros planos11. Estos parámetros son muy importantes cuando se usa dispositivos especiales como entrada o salida; por ejemplo, leer de la red debería establecer "ibs" a 10 kbyte, mientras que una disquetera 12 de 3.5"de alta densidad tiene como tamaño natural de bloque 18 kbyte. Fallar al establecer estos valores podría repercutir no sólo a largo plazo al llevar a cabo el comando, sino inclusive en errores de expiración de plazo, así que tenga cuidado.
bs=nn
tanto lee y escribe nn bytes a la vez. Este no hace caso a las palabras clave "ibs" y "obs".
cbs=nn
establece el buffer de conversión a nn bytes. Este buffer se usa cuando se traduce de ASCII a EBCDIC, o desde un dispositivo no ablocado a uno ablocado13. Por ejemplo, los ficheros creados bajo VMS tienen a menudo un tamaño de bloque de 512, así que se tiene que poner "cbs" a 1b cuando se lee una cinta externa de VMS. ¡Espero que Vd. no tenga que entretenerse en estas cosas!
skip=nbl
y seek=nbl le dicen al programa que omita nbl bloques respectivamente al final de la entrada y al principio de la salida. Por supuesto, el último caso tiene sentido si se da la conversión "notrunc" (ver abajo). Cada tamaño de bloque es el valor de "ibs" ("obs"). Cuidado: si no establece el "ibs" y escribe "skip=1b" Vd. está realmente omitiendo 512x512 bytes, esto es 256KB. No es precisamente lo que Vd. quería, ¿no?
count=nbl
pretende copiar sólo nbl bloques de la entrada, cada uno de los tamaños dados por "ibs". Esta opción, junto con la previa, se vuelve útil si, por ejemplo, Vd. tiene un fichero corrupto y quiere recuperar cuanto sea posible de él. Vd. debe omitir la parte ilegible y copiar lo que resta.
conv=conversión,[conversión. . . ]
transforma el fichero de la manera que se especifica en sus argumentos. Transformaciones posibles son "ascii", que convierte de EBCDIC a ASCII; "ebcdic" y "ibm", las cuales realizan una conversión inversa (¡sí, no existe una única conversión de EBCDIC a ASCII! La primera es la estándar, pero la segunda funciona mejor cuando se imprimen ficheros en una impresora IBM); "block", la cual rellena registros terminados en nueva línea del tamaño de "cbs" , reemplazando los cambios de línea con espacios finales; "unblock" , que realiza lo contrario (elimina espacios finales, y los reemplaza con cambios de línea); "lcase" y "ucase" , para convertir a minúsculas y mayúsculas, respectivamente; "swab", que intercambia cada par de bytes de entrada (por ejemplo, para usar un fichero que contiene enteros de tipo short escritos en una máquina 680x0 en una máquina basada en Intel se necesita dicha conversión); "noerror", para continuar procesando aún después de encontrar errores; "sync", que rellena los bloques de entrada del tamaño de "ibs" con caracteres NUL finales.
Ejemplos
El ejemplo canónico es con el único que Vd. probablemente ha chocado hasta ahora, cuando intentó crear el primer disco de Linux: como escribir a un disco sin un sistema de ficheros MS-DOS. La solución es simple:
$ dd if=disk.img of=/dev/fd0 obs=18k count=80
Decidí no usar "ibs" porque no se cual es el mejor tamaño de bloque para un disco duro, pero en este caso no habría hecho ningún perjuicio si en vez de "obs" usara sencillamente el "bs", inclusive podría haber sido un poquito más rápido. Observe la explicación del número de sectores a escribir (18 kbyte es lo que ocupa un sector, así que "count" se pone a 80) y el uso del nombre de bajo nivel del dispositivo de la disquetera.
Otra aplicación útil de dd está relacionada con la copia de seguridad de la red. Supongamos que estamos en una máquina alfa y que en la máquina beta está la unidad de cinta /dev/rst0 con un fichero tar que estamos interesados en obtener. Tenemos los mismos privilegios en ambas máquinas, pero no hay espacio en beta para volcar 14 el fichero tar. En este caso, podríamos escribir
$ rsh beta 'dd if=/dev/rst0 ibs=8k obs=20k' _ tar xvBf -
para hacer en un solo paso la operación completa. En este caso, hemos usado las facilidades de rsh para realizar la lectura de la cinta. Los tamaños de entrada y salida están establecidos a los valores por defecto por estas operaciones, esto es 8 kbyte para la lectura de la cinta y 20 kbyte para la escritura en ethernet; desde el punto de vista de la otra cara del tar, hay el mismo flujo de bytes el cual podría ser obtenido de la cinta, excepto el hecho de que llega de una manera bastante errática, y la opción B es necesaria.
¡Ah! Casi lo olvidaba: No creo para nada que dd sea un acrónimo de "data duplicator", pero al menos es una manera divertida de recordar su significado. . .
11 N.T.: plain files
12 N.T.: floppy
13 N. del T.: ablocado se refiere a la característica de agrupamiento en bloques de los datos en el dispositivo.
Valora este capítulo:
Autor y licencia de 'Guía de Linux Para el Usuario - Comandos divertidos (II)'
|
Opiniona sobre 'Guía de Linux Para el Usuario - Comandos divertidos (II)' (1)
Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.
Opina sobre este tutorial |
Wikis relacionados con 'Guía de Linux Para el Usuario - Comandos divertidos (II)'
Tutorial Completo para Aprender el sistema operativo Linux Desde lo básico hasta un nivel...
Más »
Esta guía tiene por objetivo dar respuestas muy claras y concretas a los problemas que...
Más »
En la edición anterior, se explicó las bases de Netfilter/IPTables. En esta segunda entrega, se...
Más »
Este trabajo ha tenido en cuenta los supuestos teóricos analizados en el artículo “Competencias: Un...
Más »
Las fotografias de flores (flora en general) quizas sean las que mejor se dejan enmarcar....
Más »

