O que faz 'dd if = / dev / zero de / dev / sda' fazer

17

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 tenho?

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

    P: Por que especificamente 4096 para count ?

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

    Q: O que exatamente isso faz?

por J H 08.04.2016 / 23:49

6 respostas

37

dd if=/dev/zero of=/dev/sda bs=4096 count=4096 Q: why 4096 is particularly used for counter?

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

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

Q: What does this exactly?

blockdev --getsz obtém o tamanho do dispositivo de bloco em "setores de 512 bytes". Portanto, este comando parece ter sido destinado a zerar os últimos 2 MiB da unidade.

Infelizmente este comando está quebrado com a 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 copiando / colando entre diferentes ambientes.

Tabelas de partições antigas, metadados de LVM, metadados de 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 a unidade inteira.

    
por 09.04.2016 / 01:29
16

Isso apagará o primeiro 4096*4096=16MB e o último 512*4096=2MB de seu disco rígido, que contêm estruturas importantes úteis para recuperação. Eu suponho que este código foi publicado maliciosamente.

Eu nunca encontrei uma situação em que especificar explicitamente um count diferente de 1 fosse útil. Eu tenho apagado o primeiro bloco se eu quisesse garantir que não estava deixando nenhum vestígio do MBR por trás ...

    
por 09.04.2016 / 00:10
4

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

(essa foi a parte já mencionada em outras respostas, incluindo aqui para ser completa)

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

Se estiver interessado, pode tentar criar um ficheiro com um milhão de blocos de 1 bloco e um ficheiro com 1 milhão de blocos e ver 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 impacto enorme na eficiência. Talvez seja uma barra lateral do OP, mas acho que ainda é relevante.

TL; DR: não execute código arbitrário que você encontrar na rede ou que alguém em quem você não confia. Isso arruinará seu dia.

    
por 09.04.2016 / 00:53
2

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

O ponto em dd tendo o argumento bs e count separado é que bs controla quanto é escrito de cada vez . A especificação de valores realmente grandes para bs exigirá 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 construir um bloco inteiro para gravar no dispositivo (em casos como isso provavelmente pode armazenar em buffer as gravações até que haja um bloco completo, em outros casos, pode ter que ler o que já está no disco). Como os dois comandos usam valores diferentes para bs , isso me leva a pensar que você os encontrou em dois sites diferentes. Os discos rígidos costumavam ter um tamanho de bloco de 512 bytes, correspondendo ao bs=512 do último comando, mas alguns (6-8 eu acho) anos atrás eles começaram a fazer discos com um tamanho de bloco de 4096 bytes, fazendo com que bs=4096 uma melhor escolha para discos modernos.

    
por 09.04.2016 / 11:26
1

AVISO: dd if=/dev/zero of=/dev/ é usado para limpar uma unidade ou dispositivo antes de copiar dados forenses. O inversor ou dispositivo deve sempre ser higienizado antes de copiar as informações de um sistema sob investigação forense para reduzir 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 é o que você deseja, verifique a operação de gravação zero do dd if=/dev/sda | hexdump -C | head .

Fonte: Um Guia Prático para Investigações Forenses em Computadores pelo Dr. Darren Hayes

    
por 08.06.2017 / 16:35
0

Eu uso dd if=/dev/zero of=/dev/sdX oflag=sync para 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 esta é uma idéia prudente, especialmente com a mídia MicroSD, que tem um histórico ruim de qualidade.

Claro, tenha cuidado com = sdX porque não há perdão com um apagamento acidental de disco. Verifique se X = direciona a letra do alvo pretendido.

    
por 05.09.2017 / 17:33

Tags