ddfoi projetado para copiar blocos de dados de um arquivo de entrada para um arquivo de saída. As ddopções de tamanho do bloco são as seguintes, na página de 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 ddseekopção é semelhante à lseek()chamada 1 do sistema UNIX . Move o ponteiro de leitura / gravação dentro do arquivo. Na página do manual :
seek=n
Skip n blocks (using the specified output block size) from the beginning of the output file before copying.
Os arquivos comuns no UNIX têm a propriedade conveniente de que você não precisa lê-los ou gravá-los começando no início; você pode procurar em qualquer lugar e ler ou escrever a partir daí. Então, bs=4096 seek=7significa mover para uma posição 7 * 4096 bytes desde o início do arquivo de saída e começar a escrever a partir daí. Ele não será gravado na parte do arquivo entre 0 e 7 * 4096 bytes.
Áreas de arquivos comuns que nunca são gravadas nem são alocadas pelo sistema de arquivos subjacente. Essas áreas são chamadas de buracos e os arquivos são chamados de arquivos esparsos . No seu exemplo, file_with_holeshaverá um furo de 7 * 4096 bytes no início. (h / t @frostschutz por apontar que ddtrunca 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 ddfoi gravada, a chamada do sistema análoga foi seek().
Interessante, minha página de manual é irritantemente imprevisível quanto a isso - `bs = BYTES lê e grava em bytes de bytes de cada vez` #
Graeme
Eu não vi "procurar" no UNIX, talvez "lseek", eu acho.
kangear
1
Apenas a nota, eu estava tentando buscar um dispositivo de acionamento (exmaple: dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd), mas os 'arquivos' / descritores não são pesquisável: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
Os dispositivos de disco @Pysis geralmente são procuráveis, mas talvez haja alguns problemas com dispositivos muito grandes. Qual o tamanho (em bytes) do seu / dev / sdd?
Mark Plotnick
1
Talvez eu tenha antes e não me lembro. Estou tentando acessar o setor GPT de backup ou 2 no final de um disco de 4 TB.
Pysis
6
As outras respostas já explicaram isso, mas se você tiver alguma dúvida, pode ver o que ddfaz strace.
Em seguida, trunca file_with_holespara 4096*7= 28672bytes ( bs=4096 seek=7). O truncado significa que o conteúdo do arquivo após essa posição é perdido. (Adicione conv=notruncpara evitar esta etapa). Então ele procura 28672bytes.
Em seguida, ele lê 4096bytes ( bs=4096usados como ibs) de /dev/urandom, grava 4096bytes ( bs=4096usados como obs) em file_with_holes, seguidos por outra leitura e gravação ( count=2).
Em seguida, fecha /dev/urandom, fecha file_with_holese imprime que copiou 2*4096= 8192bytes. Finalmente, sai sem erro (0).
obsé o tamanho do bloco de saída e ibsé o tamanho do bloco de entrada. Se você especificar bssem ibsou obsisso será usado para ambos.
Portanto, sua busca será de 7 blocos de 4096 ou 28672 bytes no início de sua saída. Em seguida, você copiará 2 blocos de 4096 ou 8192 bytes do início da entrada para este ponto na saída.
A busca apenas "inflará" o arquivo de saída. Busca = 7 significa que no início do arquivo de saída, 7 blocos "vazios" com tamanho de bloco de saída = obs = 4096 bytes serão inseridos. Esta é uma maneira de criar arquivos muito grandes rapidamente.
Ou para pular os dados no início que você não deseja alterar. Blocos vazios somente resultam se o arquivo de saída inicialmente não tiver muitos dados. O manual também não está claro sobre como obsse relaciona bs, o comando usa o bsque substituirá obsse ele não estiver lá.
dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd
), mas os 'arquivos' / descritores não são pesquisável: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
As outras respostas já explicaram isso, mas se você tiver alguma dúvida, pode ver o que
dd
fazstrace
.Abre
/dev/urandom
para leitura (if=/dev/urandom
), abrefile_with_holes
para criar / escrever (of=file_with_holes
).Em seguida, trunca
file_with_holes
para4096*7
=28672
bytes (bs=4096 seek=7
). O truncado significa que o conteúdo do arquivo após essa posição é perdido. (Adicioneconv=notrunc
para evitar esta etapa). Então ele procura28672
bytes.Em seguida, ele lê
4096
bytes (bs=4096
usados comoibs
) de/dev/urandom
, grava4096
bytes (bs=4096
usados comoobs
) emfile_with_holes
, seguidos por outra leitura e gravação (count=2
).Em seguida, fecha
/dev/urandom
, fechafile_with_holes
e imprime que copiou2*4096
=8192
bytes. Finalmente, sai sem erro (0).fonte
obs
é o tamanho do bloco de saída eibs
é o tamanho do bloco de entrada. Se você especificarbs
semibs
ouobs
isso será usado para ambos.Portanto, sua busca será de 7 blocos de 4096 ou 28672 bytes no início de sua saída. Em seguida, você copiará 2 blocos de 4096 ou 8192 bytes do início da entrada para este ponto na saída.
fonte
A busca apenas "inflará" o arquivo de saída. Busca = 7 significa que no início do arquivo de saída, 7 blocos "vazios" com tamanho de bloco de saída = obs = 4096 bytes serão inseridos. Esta é uma maneira de criar arquivos muito grandes rapidamente.
fonte
obs
se relacionabs
, o comando usa obs
que substituiráobs
se ele não estiver lá.