Existe uma maneira mais rápida de verificar se uma unidade foi totalmente zerada?

Existe uma maneira mais rápida de verificar se uma unidade foi totalmente zerada?

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.

informação relacionada