O que faz `dd if = / dev / zero of = / dev / sda`

19

Editado: não execute isso para testá-lo, a menos que você queira destruir dados.

Alguém poderia me ajudar a entender o que eu recebi?

  1. dd if=/dev/zero of=/dev/sda bs=4096 count=4096

    P: Por que especificamente o 4096 count?

  2. dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)

    P: O que exatamente isso faz?

JH
fonte
4
Onde você encontrou este código malicioso
Suici Doga
10
Este não é um código malicioso.
Michael Hampton
12
@MichaelHampton: s / malicioso / destrutivo / Embora a publicação de códigos destrutivos não seja maliciosa em si, publique-os sem um aviso claro de que pode destruir os dados IS.
Ben Voigt
11
É melhor pensar no DD como 'Destruidor de Disco' quando alguém na Internet diz para você executar um comando como este.
Bobby Sacamano
3
na verdade, DD significa descrição de dados
Suici Doga

Respostas:

43

dd se = / dev / zero de = / dev / sda bs = 4096 count = 4096 Q: por que o 4096 é particularmente usado para contador?

Isso zerará os 16 primeiros MiB da unidade. 16 O MiB é provavelmente mais do que suficiente para destruir qualquer estrutura de "início do disco", sendo pequeno o suficiente para não demorar muito.

dd se = / dev / zero de = / dev / sda bs = 512 count = 4096 seek = $ (expr blockdev --getsz / dev / sda - 4096)

Q: O que isso faz exatamente?

blockdev --getszobtém o tamanho do dispositivo de bloco em "setores de 512 bytes". Portanto, este comando parece ter como objetivo zerar os 2 últimos MiB da unidade.

Infelizmente, este comando está quebrado quanto à sintaxe. Espero que o comando tenha sido originalmente planejado para ser

dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)

e os backticks se perderam em algum lugar ao longo da linha de pessoas que copiam / colam entre diferentes ambientes.

Tabelas de partição antigas, metadados LVM, metadados RAID etc. podem causar problemas ao reutilizar uma unidade. Zerar as seções no início e no final da unidade geralmente evita esses problemas, sendo muito mais rápido do que zerar toda a unidade.

plugwash
fonte
4
Obrigado. Essa resposta parece ser a mais adequada para o que eu estava procurando. Os dois comandos são usados ​​após o delpart. Eles são usados ​​para limpar um disco para reutilização como limpo.
JH
expr blockdev --getsz /dev/sda - 4096seria um erro de sintaxe de expr. Eu acho que o comando pretendido foi ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". Ou melhor:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas 8/17/17
11
Meu palpite seria que havia originalmente backticks no comando e eles foram comidos em algum momento.
plugwash
16

Isso apagará o primeiro 4096*4096=16MBe o último 512*4096=2MBdo disco rígido, que contêm estruturas importantes úteis para a recuperação. Presumo que este código foi postado com intuito malicioso.

Nunca encontrei uma situação em que especificar explicitamente countoutro que não 1fosse útil. I ter apagado o primeiro bloco se eu queria para garantir que eu não estava deixando quaisquer vestígios do trás MBR ...

o11c
fonte
8
Isso não é necessariamente malicioso, tive alguns programas de formatação incorretos que se recusam a escrever um novo rótulo se o atual estiver danificado e, portanto, tive que zerar manualmente os primeiros bytes como este.
Shelvacu
11
@shelvacu Eu ficaria surpreso se a unidade manipulada dessa maneira fosse sda. Mais provável sdbou sdc. Mas posso estar errado, é claro ...
yo
7
Isso não é malicioso. Apaga a GPT no início do disco e a GPT de backup no final do disco.
Michael Hampton
2
@shelvacu: É destrutivo. Se comandos destrutivos foram publicados sem uma explicação do que faz, é malicioso. Se eles foram acompanhados por uma explicação, por que a OP está perguntando sobre isso aqui?
Ben Voigt
2
Então, quem, em sua mente perfeita, copiará / colará códigos encontrados em qualquer lugar sem conhecer seu propósito? Não é malicioso, porque não sacudirei nenhum dispositivo estranho que possa encontrar no metrô.
Magno C
4

Esses comandos sobrescreverão o seu dispositivo sda com zeros - o primeiro fará os primeiros 16MB (tamanho do bloco de 4096 e contagem de 4096 blocos) e o segundo substituirá os últimos 2MB (tamanho do bloco 512 com 4096 blocos) de zeros. (não está apagando tecnicamente, e isso está relacionado ao meu primeiro ponto abaixo.)

(essa foi a parte já mencionada em outras respostas, incluindo aqui por questões de integridade)

Outra coisa que vale a pena mencionar é que o tamanho do bloco tem efeitos, mas esses geralmente são vistos apenas em operações de alto volume. A maneira mais eficiente (mais rápida) de executar o comando é se o tamanho do bloco corresponder ao tamanho de acesso do dispositivo, caso contrário, será desperdiçado tempo.

Se você estiver interessado, tente criar um arquivo com um milhão de blocos de 1 bloco e um arquivo com 1 milhão de blocos de bloco e veja a diferença:

[user@host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s

real    0m2.447s
user    0m0.177s
sys     0m2.269s
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s

real    0m0.003s
user    0m0.001s
sys     0m0.002s
[user@host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test2

Como você pode ver, o tamanho do bloco tem um enorme impacto na eficiência. Talvez seja uma barra lateral para o OP, mas sinto que ainda é relevante.

TL; DR: Não execute código arbitrário encontrado na rede ou que alguém em quem você não confia lhe dê. Vai estragar o seu dia.

Tim S.
fonte
7
+1 para a Don't execute arbitrary code you find on the netlinha
Sergiy Kolodyazhnyy
7
"Observe que esse processo é extremamente tedioso e / ou caro e requer equipamentos extremamente específicos". Pare de espalhar essa desinformação. A última vez que isso foi teoricamente possível, foi décadas atrás, com tecnologia obsoleta de muitas gerações. Ninguém jamais demonstrou esse tipo de recuperação em unidades modernas, mesmo em resposta a desafios públicos com prémios em dinheiro, por exemplo hostjury.com/blog/view/195/...
Andrew Medico
Eu removi essa seção - acho que já faz um tempo desde que soube disso. No entanto, direi que "teoricamente" era a palavra operativa, mas discordo.
Tim S.
2

Outros explicaram o que fazem, então eu vou pular isso.

O ponto em ddter argumentos bse countargumentos separados é que bscontrola quanto é escrito de cada vez . A especificação de valores realmente grandes bsexigirá um buffer realmente grande no programa, e a especificação de valores menores que o tamanho do bloco do dispositivo será lenta porque o kernel precisa criar um bloco inteiro para gravar no dispositivo (em casos como esse, pode provavelmente armazena em buffer as gravações até que haja um bloco completo; em outros casos, pode ser necessário ler o que já está no disco). Como os dois comandos usam valores diferentes para bs, isso me leva a pensar que você pode ter encontrado em dois sites diferentes. Os discos rígidos costumavam ter um tamanho de bloco de 512 bytes, correspondente aobs=512do último comando, mas alguns (6-8 eu acho) anos atrás, eles começaram a criar discos com um tamanho de bloco de 4096 bytes, fazendo bs=4096uma escolha melhor para os discos modernos.

Henrik - pare de machucar Monica
fonte
11
O ponto ideal para bsé muito maior do que isso . Um único comando SATA pode ler ou gravar vários setores, portanto o kernel mescla E / Ss antes de enviá-las. Qualquer lugar de bs=64katé bs=1024ké razoável (o tamanho do cache L3 geralmente é de 4-8MiB). Eu costumo usar bs=128k, que é metade do tamanho do cache L2 nas modernas CPUs Intel. ( ddinclui duas operações memcpy: na read(2)fonte (mesmo que seja / dev / zero) e no write(2).IIRC, sddtinha a opção de escrever zeros, o que economizaria um pouco de tempo da CPU. Realmente relevante apenas se o destino for algo diferente de um disco).
Peter Cordes
Para ver a fusão da solicitação de E / S acontecendo, observe a saída de iostat -x 4algo assim e observe as colunas rrqm / s (solicitações de leitura mescladas por segundo) e wrqm / s.
Peter Cordes
1

AVISO: dd if=/dev/zero of=/dev/ é usado para limpar uma unidade ou dispositivo antes de copiar dados forenses. A unidade ou o dispositivo sempre deve ser higienizado antes de copiar as informações de um sistema sob investigação forense para mitigar a contaminação cruzada. Portanto, não é um comando ruim, o usuário final deve entender para que é usado ou destruirá seus dados. Se é isso que você deseja, verifique a operação de gravação zero dd if=/dev/sda | hexdump -C | head.

Fonte: Um Guia Prático de Investigações Forenses em Computação pelo Dr. Darren Hayes

SierraJuliet
fonte
1

Uso dd if=/dev/zero of=/dev/sdX oflag=syncpara testar a qualidade de uma unidade USB inserida ou cartão MicroSD ANTES de usá-lo com gparted, fdisk ou dd com uma imagem de disco. Eu acho que essa é uma idéia prudente, especialmente com a mídia MicroSD que tem um histórico ruim de qualidade.

Obviamente, tenha cuidado com of = sdX, porque não há perdão com uma limpeza acidental de disco. Verifique se X = letra da unidade do destino pretendido.

Richard
fonte