En los próximos meses, necesitaré poner a cero muchos discos. Después de borrar cada unidad, necesito una forma rápida de asegurarme de que la unidad esté completamente llena de ceros.
Podría abrir cada uno en un editor hexadecimal, pero todo lo que esto hace es permitirme ver que ciertas partes se han puesto a cero, lo cual es cada vez más inútil cuanto más grande se vuelve una unidad, ya que no verifica con seguridad que no haya ningún error. No existen caracteres en él.
Decidí ejecutar algunos puntos de referencia para probar algunas herramientas que encontré. Cronometré cada herramienta en una serie de 3 ejecuciones separadas para verificar el borrado del mismo disco de 1 TB, y cada ejecución se ejecutó durante la noche con la misma carga del sistema. Para lidiar con el almacenamiento en caché, cada ejecución ejecutó las herramientas en posiciones aleatorias, con un descanso de al menos 500 segundos entre cada una.
A continuación se muestra la ejecución promedio de cada herramienta en las 3 pruebas, ordenadas de la más lenta a la más rápida.
De mi parte:
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
Deneal:
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
DeBeto1 :
time iszero < /dev/sda
1000204886016 bytes processed
0 nonzero characters encountered.
real 137m49.400s
user 15m9.189s
sys 3m28.042s
Incluso la más rápida de las herramientas probadas parece alcanzar un límite de 137 minutos, que son 2 horas y 16 minutos, mientras que un borrado completo del disco promedia solo 2 horas y 30 minutos.
Esto es lo que me impulsó a hacer esta pregunta: parece que debería ser posible que una herramienta de este tipo seaal menos la mitadla velocidad que se necesita para borrar una unidad, dado que solo es necesario leer y no escribir en el disco.
¿Existe una solución alternativa y más rápida a lo anterior?
En un mundo ideal, la solución que estoy buscando leería todo el disco e imprimiría cualquier carácter distinto de cero que encontrara, tal como el programa C++ de Bob. Esto me permitiría regresar y borrar selectivamente cualquier byte distinto de cero en lugar de todo el disco. Sin embargo, esto no sería un requisito estricto si la herramienta fuera muy rápida leyendo el disco.
1. Este es un programa C++ escrito por Bob, con el tamaño del búfer aumentado a 4194304 (4 MiB) y compilado con:
g++ -Wl,--stack,16777216 -O3 -march=native -o iszero iszero.cpp
Respuesta1
Las velocidades de lectura y escritura de los discos duros magnéticos son aproximadamente las mismas. Lo mismo se aplica a las unidades de cinta, RAM, CD-/DVD-/BD-R e incluso a los disquetes. Con los medios giratorios, depende principalmente de la velocidad con la que se mueven los datos debajo de los cabezales (o conjuntos láser para unidades ópticas). Si la lectura y la escritura no fueran a la misma velocidad, tendría que girar hacia arriba (o hacia abajo) el medio para cambiar de lectura a escritura y viceversa.
La lectura significativamente más rápida que la escritura es una cuestión de memoria flash.