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?
dd if=/dev/zero of=/dev/sda bs=4096 count=4096
P: Por que especificamente o 4096
count
?dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)
P: O que exatamente isso faz?
Respostas:
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.
blockdev --getsz
obté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
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.
fonte
expr blockdev --getsz /dev/sda - 4096
seria um erro de sintaxe deexpr
. Eu acho que o comando pretendido foi...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)"
. Ou melhor:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Isso apagará o primeiro
4096*4096=16MB
e o último512*4096=2MB
do 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
count
outro que não1
fosse ú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 ...fonte
sda
. Mais provávelsdb
ousdc
. Mas posso estar errado, é claro ...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:
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.
fonte
Don't execute arbitrary code you find on the net
linhaOutros explicaram o que fazem, então eu vou pular isso.
O ponto em
dd
ter argumentosbs
ecount
argumentos separados é quebs
controla quanto é escrito de cada vez . A especificação de valores realmente grandesbs
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 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 parabs
, 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=512
do ú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, fazendobs=4096
uma escolha melhor para os discos modernos.fonte
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 debs=64k
atébs=1024k
é razoável (o tamanho do cache L3 geralmente é de 4-8MiB). Eu costumo usarbs=128k
, que é metade do tamanho do cache L2 nas modernas CPUs Intel. (dd
inclui duas operações memcpy: naread(2)
fonte (mesmo que seja / dev / zero) e nowrite(2)
.IIRC,sdd
tinha 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).iostat -x 4
algo assim e observe as colunas rrqm / s (solicitações de leitura mescladas por segundo) e wrqm / s.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 zerodd if=/dev/sda | hexdump -C | head
.Fonte: Um Guia Prático de Investigações Forenses em Computação pelo Dr. Darren Hayes
fonte
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 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.
fonte