argumento 'buscar' en el comando dd

20

¿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 buscar parte no está claro

Las páginas del manual dicen:

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

¿Qué es el bloque de tamaño obs?

usuario2799508
fuente

Respuestas:

22

ddestá diseñado para copiar bloques de datos de un archivo de entrada a un archivo de salida. Las ddopciones de tamaño de bloque son las siguientes, desde la página del manual :

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 dd seekopción es similar a la lseek()llamada al sistema UNIX 1 . Mueve el puntero de lectura / escritura dentro del archivo. Desde la página del manual :

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

Los archivos ordinarios en UNIX tienen la propiedad conveniente de que no tiene que leerlos ni escribirlos desde el principio; puedes buscar en cualquier lugar y leer o escribir a partir de ahí. Entonces, bs=4096 seek=7significa moverse a una posición de 7 * 4096 bytes desde el comienzo del archivo de salida y comenzar a escribir desde allí. No escribirá en la parte del archivo que está entre 0 y 7 * 4096 bytes.

Las áreas de archivos ordinarios que nunca se escriben en absoluto ni siquiera son asignadas por el sistema de archivos subyacente. Estas áreas se llaman agujeros y los archivos se llaman archivos dispersos . En su ejemplo, file_with_holestendrá un agujero de 7 * 4096 bytes al principio. (h / t @frostschutz para señalar que ddtrunca el archivo de salida de forma predeterminada).

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

[1] cuando ddse escribió, la llamada al sistema análogo era seek().

Mark Plotnick
fuente
Interesante, mi página de manual es irritantemente inminente en esto: `bs = BYTES lee y escribe hasta BYTES bytes a la vez`
Graeme
No he visto "buscar" en UNIX, tal vez "lseek", supongo.
kangear
1
Solo para tener en cuenta, estaba tratando de buscar un dispositivo de disco (exmaple:) dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd, pero esos 'archivos' / descriptores no son buscables:dd: /dev/sdd: cannot seek: Invalid argument 0+0 records in 0+0 records out 0 bytes copied, 0.00765396 s, 0.0 kB/s
Pysis
1
Los dispositivos de @Pysis Disk generalmente son buscables, pero quizás haya algunos problemas con dispositivos muy grandes. ¿Qué tan grande (en bytes) es su / dev / sdd?
Mark Plotnick
1
Tal vez lo he hecho antes y no puedo recordar. Estoy tratando de acceder al sector GPT de respaldo o 2 al final de un disco de 4TB.
Pysis
6

Las otras respuestas ya lo explicaron, pero si tiene alguna duda, puede ver qué ddhace 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 +++

Se abre /dev/urandompara lectura ( if=/dev/urandom), se abre file_with_holespara crear / escribir ( of=file_with_holes).

Luego se trunca file_with_holesa 4096*7= 28672bytes ( bs=4096 seek=7). El truncamiento significa que el contenido del archivo después de esa posición se pierde. (Agregar conv=notruncpara evitar este paso). Luego busca 28672bytes.

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

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

Frostschutz
fuente
5

obses el tamaño del bloque de salida y ibses el tamaño del bloque de entrada. Si especifica bssin ibso obsesto se usa para ambos.

Por lo tanto, su búsqueda será de 7 bloques de 4096 o 28672 bytes al comienzo de su salida. Luego copiará 2 bloques de 4096 u 8192 bytes desde el inicio de la entrada hasta este punto en la salida.

Graeme
fuente
1

Seek simplemente "inflará" el archivo de salida. Buscar = 7 significa que al comienzo del archivo de salida, se insertarán 7 bloques "vacíos" con un tamaño de bloque de salida = obs = 4096bytes. Esta es una manera de crear archivos muy grandes rápidamente.

Thorsten Staerk
fuente
1
O para omitir los datos al comienzo que no desea modificar. Los bloques vacíos solo resultan si el archivo de salida inicialmente no tenía tantos datos. El manual tampoco es claro sobre cómo se obsrelaciona bs, el comando usa el bsque sustituirá obssi no está allí.
Graeme