'seek' argumento no comando dd

19

Algum pode me explicar o que está acontecendo nas seguintes linhas?

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

buscar especialmente parte não está clara

Páginas masculinas diz:

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

O que é bloco de tamanho obs?

    
por user2799508 11.01.2014 / 12:50

4 respostas

20

dd foi projetado para copiar blocos de dados de um arquivo de entrada para um arquivo de saída. As opções de tamanho do bloco dd são as seguintes, na página do 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=.

A opção dd seek é semelhante à chamada do sistema UNIX lseek() 1 . Move o ponteiro de leitura / gravação dentro do arquivo. Na página de manual :

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

Arquivos comuns no UNIX possuem a propriedade conveniente que você não precisa ler ou escrever no início; você pode procurar em qualquer lugar e ler ou escrever a partir daí. Então, bs=4096 seek=7 significa mover para uma posição 7 * 4096 bytes a partir do início do arquivo de saída e começar a escrever a partir daí. Ele não grava na parte do arquivo que está entre 0 e 7 * 4096 bytes.

Áreas de arquivos comuns que nunca são gravados de forma alguma são alocadas pelo sistema de arquivos subjacente. Essas áreas são chamadas de holes e os arquivos são chamados de arquivos esparsos . No seu exemplo, file_with_holes terá um buraco de 7 * 4096 bytes no início. (h / t @frostschutz por apontar que dd trunca o arquivo de saída por padrão).

Não há problema em ler essas áreas não alocadas; você recebe um monte de zeros.

[1] quando dd foi escrito, a chamada de sistema análoga era seek() .

    
por 11.01.2014 / 13:35
6

As outras respostas já foram explicadas, mas se você tiver alguma dúvida, poderá ver o que o dd faz com 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, "[email protected]$Umt2;E31"..., 4096) = 4096
write(1, "[email protected]$Umt2;E31"..., 4096) = 4096
read(0, "~2q46174V44h2pw90WM74~63|{\vi"..., 4096) = 4096
write(1, "~2q46174V44h2pw90WM74~63|{\vi"..., 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 +++

Ele abre /dev/urandom para leitura ( if=/dev/urandom ), abre file_with_holes para criação / gravação ( of=file_with_holes ).

Em seguida, trunca file_with_holes para 4096*7 = 28672 bytes ( bs=4096 seek=7 ). O truncamento significa que o conteúdo do arquivo após essa posição é perdido. (Adicione conv=notrunc para evitar este passo). Em seguida, ele procura 28672 bytes.

Em seguida, ele lê 4096 bytes ( bs=4096 usado como ibs ) de /dev/urandom , escreve 4096 bytes ( bs=4096 usado como obs ) em file_with_holes , seguido por outro lido e escreva ( count=2 ).

Em seguida, ele fecha /dev/urandom , fecha file_with_holes e imprime que copiou 2*4096 = 8192 bytes. Finalmente sai sem erro (0).

    
por 11.01.2014 / 13:39
5

obs é o tamanho do bloco de saída e ibs é o tamanho do bloco de entrada. Se você especificar bs sem ibs ou obs , isso será usado para ambos.

Portanto, a sua busca será de 7 blocos de 4096 ou 28672 bytes no início da sua saída. Então você irá copiar 2 blocos de 4096 ou 8192 bytes desde o início da entrada até este ponto na saída.

    
por 11.01.2014 / 12:56
1

A busca apenas "inflará" o arquivo de saída. Buscar = 7 significa que no início do arquivo de saída, 7 blocos "vazios" com tamanho do bloco de saída = obs = 4096bytes serão inseridos. Esta é uma maneira de criar arquivos muito grandes rapidamente.

    
por 11.01.2014 / 12:59

Tags