argumento 'search' en command dd

¿Pueden algunos explicarme qué está sucediendo en las siguientes líneas?

dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes 

especialmente search parte no está claro

Man páginas dice:

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

¿Qué es un bloque obsesionado?

dd está diseñado para copyr bloques de datos de un file de input a un file de salida. Las opciones de tamaño de bloque dd son las siguientes, desde la página man :

 ibs=expr Specify the input block size, in bytes, by expr (default is 512). obs=expr Specify the output block size, in bytes, by expr (default is 512). bs=expr Set both input and output block sizes to expr bytes, superseding ibs= and obs=. 

La opción de seek dd es similar a la llamada de sistema de UNIX lseek() 1 . Mueve el puntero de lectura / escritura dentro del file. Desde la página man :

 seek=n Skip n blocks (using the specified output block size) from the beginning of the output file before copying. 

Los files comunes en UNIX tienen la propiedad conveniente de no tener que leerlos o escribirlos comenzando desde el principio; puede search en cualquier lugar y leer o escribir comenzando desde allí. Así que bs=4096 seek=7 significa moverse a una position de 7 * 4096 bytes desde el comienzo del file de salida y comenzar a escribir desde allí. No escribirá en la parte del file que está entre 0 y 7 * 4096 bytes.

Las áreas de files ordinarios que nunca se escriben en absoluto ni siquiera son asignadas por el sistema de files subyacente. Estas áreas se llaman agujeros y los files se llaman files dispersos . En su ejemplo, file_with_holes tendrá un orificio de 7 * 4096 bytes al comienzo. (h / t @frostschutz para señalar que dd trunca el file de salida de manera pnetworkingeterminada).

Está bien leer estas áreas no asignadas; obtienes un montón de ceros

[1] cuando se escribió dd , la llamada análoga al sistema fue seek() .

Las otras respuestas ya lo explicaron, pero si tiene alguna duda, puede ver qué hace dd con strace .

 $ strace dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes # output is shortened considerably open("/dev/urandom", O_RDONLY) = 0 open("file_with_holes", O_RDWR|O_CREAT, 0666) = 1 ftruncate(1, 28672) = 0 lseek(1, 28672, SEEK_CUR) = 28672 read(0, "\244\212\222v\25\342\346\226\237\211\23\252\303\360\201\346@\351\6c.HF$Umt\362;E\233\261"..., 4096) = 4096 write(1, "\244\212\222v\25\342\346\226\237\211\23\252\303\360\201\346@\351\6c.HF$Umt\362;E\233\261"..., 4096) = 4096 read(0, "~\212q\224\256\241\277\344V\204\204h\312\25pw9\34\270WM\267\274~\236\313|{\v\6i\22"..., 4096) = 4096 write(1, "~\212q\224\256\241\277\344V\204\204h\312\25pw9\34\270WM\267\274~\236\313|{\v\6i\22"..., 4096) = 4096 close(0) = 0 close(1) = 0 write(2, "2+0 records in\n2+0 records out\n", 312+0 records in 2+0 records out ) = 31 write(2, "8192 bytes (8.2 kB) copied", 268192 bytes (8.2 kB) copied) = 26 write(2, ", 0.00104527 s, 7.8 MB/s\n", 25, 0.00104527 s, 7.8 MB/s ) = 25 +++ exited with 0 +++ 

Abre /dev/urandom para lectura ( if=/dev/urandom ), abre file_with_holes para crear / escribir ( of=file_with_holes ).

Luego trunca file_with_holes a 4096*7 = 28672 bytes ( bs=4096 seek=7 ). El truncado significa que el contenido del file después de esa position se pierde. (Agregue conv=notrunc para evitar este paso). Luego busca 28672 bytes.

Luego lee 4096 bytes ( bs=4096 usado como ibs ) de /dev/urandom , escribe 4096 bytes ( bs=4096 usado como obs ) para file_with_holes , seguido de otra lectura y escritura ( count=2 ).

Luego cierra /dev/urandom , cierra file_with_holes e imprime que copió 2*4096 = 8192 bytes. Finalmente sale sin error (0).

obs es el tamaño del bloque de salida e ibs es el tamaño del bloque de input. Si especifica bs sin ibs u obs esto se usa para ambos.

Entonces su búsqueda será de 7 bloques de 4096 o 28672 bytes al comienzo de su salida. Luego, copyrá 2 bloques de 4096 u 8192 bytes desde el inicio de la input hasta este punto en la salida.

Seek simplemente "inflará" el file de salida. Seek = 7 significa que al comienzo del file de salida, se insertán 7 bloques "vacíos" con tamaño de bloque de salida = obs = 4096bytes. Esta es una forma de crear files muy grandes rápidamente.