¿Cuál es la diferencia entre 'bs', 'count' y 'seek' en el comando dd?

24

He leído muchas guías y mensajes en el foro que describen cómo utilizar dd, pero una cosa que he notado es que la gente siempre utilizan valores diferentes para el bs=, count=y seek=los interruptores.

Alguien puede explicar qué hacen exactamente estos interruptores (la página de manual no es muy detallada) y explicar cuáles son las mejores configuraciones para diferentes tareas, como crear archivos desde / dev / random o / dev / zero, y sobrescribir particiones y unidades externas.

Eric
fuente

Respuestas:

27

Realmente no sé cómo explicar esto mejor que la página de manual.

bs=establece el tamaño de bloque, por ejemplo bs=1M, sería 1MiB de tamaño de bloque.

count=copia solo este número de bloques (el valor predeterminado es que dd continúe para siempre o hasta que se agote la entrada). Idealmente, los bloques son de bs=tamaño, pero puede haber lecturas incompletas, por lo que si utiliza count=para copiar una cantidad específica de datos ( count*bs), también debe proporcionar iflag=fullblock.

seek= busca este número de bloques en la salida, en lugar de escribir en el comienzo del dispositivo de salida.

Entonces, por ejemplo, esto copia un valor de 1MiB y\npara colocar 8MiB del archivo de salida. Entonces, el tamaño total del archivo será de 9MiB.

$ yes | dd bs=1M count=1 seek=8 iflag=fullblock of=outputfile
$ ls -alh outputfile
9.0M Jun  3 21:02 outputfile
$ hexdump -C outputfile
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00800000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
00900000

Como mencionas /dev/randomy sobrescribes particiones ... tomará una eternidad ya que /dev/random(así como /dev/urandom) es demasiado lento. En su shred -v -n 1lugar, podría usar , eso es rápido y generalmente está disponible en cualquier lugar.

Frostschutz
fuente
21

Ok, dijiste que las páginas del manual no están detalladas, así que explicaré lo que significan con metáforas fáciles de entender sobre un tipo en movimiento (se conoce con el nombre de dd):

   bs=BYTES
          read and write up to BYTES bytes at a time

ddrecoge algo (cajas, jarrones, camas, arroz, etc.), muévelo donde debe estar y déjalo. Hasta que no suelte la carga, no elige nada más. Ahora, cuando necesita decirle exactamente cuántos objetos debe elegir por viaje, esto es lo que debe bshacer. Establece la cantidad de datos que leerá y escribirá. Esto es casi obligatorio en todos los comandos útiles y comunes.

   count=N
          copy only N input blocks

Esto determina la cantidad total de cajas que moverá. Los cuadros en este contexto son los bloques en el disco . Le dices que mueva 5 cajas, solo mueve 5 cajas incluso si hay más de 5 cajas (si hay menos de 5 cajas, tomará un jarrón que encontró además de las cajas para sumarlo). Si le dice dda countsolo 5 y lo escribe en alguna parte, él copiará los primeros 5 bloques que ve y los escribirá donde desee.

   seek=N skip N obs-sized blocks at start of output

El tipo normalmente encuentra el primer lugar disponible para soltar la carga, esto es normalmente al comienzo (del disco) y continúa llenándose hasta el final. Bueno, con esto le dice ddque comience más arriba, digamos que en lugar del pasillo, comience en una de las habitaciones más adentro. Simplemente "salta" los bloques de partida.

Ahora, dependiendo de lo que esté haciendo, necesitará diferentes combinaciones basadas en el origen y el destino, junto con el formato en que se leerán y escribirán. Te recomiendo que los busques por separado.

Braiam
fuente
"tomará un jarrón que encontró además de las cajas para sumarlo". ¿Qué significa esta metáfora?
Ini
1
@Ini Que si hay un bloque adyacente que no pertenece al if read, dd lo leerá y lo moverá también. Un jarrón no es una caja, pero dd lo mueve.
Braiam