Qual é a diferença entre 'bs', 'count' e 'seek' no comando dd?

24

Eu li muitos guias e mensagens do fórum descrevem como usar dd, mas uma coisa que notei é que as pessoas sempre usam valores diferentes para o bs=, count=e seek=switches.

Alguém pode explicar exatamente o que essas opções fazem (a página de manual não é muito detalhada) e explicar quais são as melhores configurações para tarefas diferentes, como criar arquivos a partir de / dev / random ou / dev / zero e substituir partições e unidades externas.

Eric
fonte
Experimente a documentação GNU para dd ou a versão POSIX .
Jw013

Respostas:

27

Realmente não sei como explicar isso melhor do que a página de manual.

bs=define o tamanho do bloco, por exemplo, bs=1Mseria 1MiB tamanho do bloco.

count=copia apenas esse número de blocos (o padrão é que o dd continue para sempre ou até que a entrada acabe). Idealmente, os blocos são do bs=tamanho, mas pode haver leituras incompletas; portanto, se você usar count=para copiar uma quantidade específica de dados ( count*bs), também deverá fornecer iflag=fullblock.

seek= procura esse número de blocos na saída, em vez de gravar no início do dispositivo de saída.

Assim, por exemplo, isso copia 1MiB y\npara a posição 8MiB do arquivo de saída. Portanto, o tamanho total do arquivo será 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

Desde que você mencione /dev/randome sobrescreva partições ... levará uma eternidade, pois /dev/random(assim como /dev/urandom) é muito lento. Você pode simplesmente usar shred -v -n 1, é rápido e geralmente está disponível em qualquer lugar.

frostschutz
fonte
21

Ok, você disse que as páginas de manual não são detalhadas, por isso vou explicar o que elas significam com metáforas fáceis de entender sobre um cara em movimento (que se chama dd):

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

ddpega alguma coisa (caixas, vasos, camas, arroz, etc.), move-se para onde precisa e deixa-a. Até que ele não solte a carga, ele não escolhe mais nada. Agora, quando você precisa dizer a ele exatamente quantos objetos ele deve escolher por viagem, é isso que bsfaz. Você define a quantidade de dados que ele lerá e gravará. Isso é quase obrigatório em todos os comandos úteis e comuns.

   count=N
          copy only N input blocks

Isso determina a quantidade total de caixas que ele moverá. Caixas neste contexto são os blocos no disco . Você diz a ele para mover 5 caixas, ele só move 5 caixas mesmo que haja mais de 5 caixas (se houver menos de 5 caixas, ele pegará um vaso que encontrou além das caixas para adicioná-lo). Se você disser ddpara countapenas 5 e escrevê-lo em algum lugar, ele copiaria os 5 primeiros blocos que ele vê e os escreveria onde quiser.

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

O cara normalmente encontra o primeiro local disponível para descartar a carga, normalmente no início (do disco) e continua preenchendo até o final. Bem, com isso você diz ddpara começar mais, digamos, em vez do corredor, comece em um dos quartos mais ao interior. Apenas "pula" os blocos de partida.

Agora, dependendo do que você estiver fazendo, você precisará de diferentes combinações com base na origem e destino, juntamente com o formato em que elas serão lidas e gravadas. Eu recomendo que você procure por eles separados.

Braiam
fonte
"ele pegará um vaso que encontrou além das caixas para adicioná-lo". O que essa metáfora representa?
Ini
1
@Ini Que, se houver um bloco adjacente que não pertença ao if read, o dd o lerá e o moverá também. Um vaso não é uma caixa, mas dd o move.
Braiam