Nos próximos meses, precisarei zerar muitos discos. Depois de limpar cada unidade, preciso de uma maneira rápida de garantir que a unidade foi completamente preenchida com zeros.
Eu poderia abrir cada um deles em um editor hexadecimal, mas tudo o que isso faz é me permitir ver que certas partes dele foram zeradas, o que é cada vez mais inútil quanto maior a unidade fica, pois não verifica com certeza se não há nenhum não- não existem caracteres nele.
Decidi fazer alguns benchmarks para testar algumas ferramentas que encontrei. Cronometrei cada ferramenta em uma série de três execuções separadas, verificando a limpeza do mesmo disco de 1 TB, com cada execução sendo executada durante a noite com a mesma carga do sistema. Para lidar com o cache, cada execução executou as ferramentas em posições aleatórias, com um sono de pelo menos 500 segundos entre cada uma.
Abaixo está a média de execução de cada ferramenta nos três testes, classificada do mais lento ao mais rápido.
De mim mesmo:
time hexdump /dev/sda
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
e8e0db6000
real 284m35.474s
user 223m4.261s
sys 2m49.729s
DeGordon Davisson:
time od /dev/sda
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
16434066660000
real 148m34.707s
user 77m10.749s
sys 2m54.611s
DeNeil:
time cmp /dev/zero /dev/sda
cmp: EOF on /dev/sda
real 137m55.505s
user 8m9.031s
sys 3m53.127s
DeBarbudo:
time badblocks -sv -t 0x00 /dev/sda
Checking blocks 0 to 976762583
Checking for bad blocks in read-only mode
Testing with pattern 0x00: done
Pass completed, 0 bad blocks found. (0/0/0 errors)
real 137m50.213s
user 5m19.287s
sys 4m49.803s
DeHennes:
time dd if=/dev/sda status=progress bs=4M | tr --squeeze-repeats "\000" "D"
1000156954624 bytes (1.0 TB, 931 GiB) copied, 8269.01 s, 121 MB/s
238467+1 records in
238467+1 records out
1000204886016 bytes (1.0 TB, 932 GiB) copied, 8269.65 s, 121 MB/s
D
real 137m49.868s
user 27m5.841s
sys 28m3.609s
DePrumo1 :
time iszero < /dev/sda
1000204886016 bytes processed
0 nonzero characters encountered.
real 137m49.400s
user 15m9.189s
sys 3m28.042s
Mesmo a ferramenta mais rápida testada parece atingir o limite máximo de 137 minutos, que é de 2 horas e 16 minutos, enquanto uma limpeza completa do disco dura em média apenas 2 horas e 30 minutos.
Foi isto que me levou a colocar esta questão - parece que deveria ser possível que tal ferramenta fossepelo menos metadea velocidade necessária para limpar uma unidade, visto que o disco só precisa ser lido e não gravado.
Existe uma solução alternativa e mais rápida para o acima exposto?
Em um mundo ideal, a solução que procuro leria todo o disco e imprimiria quaisquer caracteres diferentes de zero que encontrasse, assim como o programa C++ de Bob. Isso me permitiria voltar e limpar seletivamente quaisquer bytes diferentes de zero, em vez de todo o disco. No entanto, este não seria um requisito estrito se a ferramenta fosse muito rápida na leitura do disco.
1. Este é um programa C++ escrito por Bob, com o tamanho do buffer aumentado para 4194304 (4 MiB) e compilado com:
g++ -Wl,--stack,16777216 -O3 -march=native -o iszero iszero.cpp
Responder1
As velocidades de leitura e gravação dos discos rígidos magnéticos são aproximadamente as mesmas. O mesmo se aplica a unidades de fita, RAM, CD/DVD/BD-R e até disquetes. Com a mídia giratória, é principalmente uma função da rapidez com que os dados se movem sob as cabeças (ou conjuntos de laser para unidades ópticas). Se a leitura e a gravação não ocorressem na mesma velocidade, você teria que aumentar (ou diminuir) a mídia para mudar de leitura para gravação e vice-versa.
A leitura significativamente mais rápida do que a gravação é uma questão de memória flash.