Tengo un disco duro lleno de ceros.
¿Cómo verificar si todos los bits en el disco duro son ceros usando bash?
hard-drive
bash
ubuntu-12.10
gkfvbnhjh2
fuente
fuente
Respuestas:
od
reemplazará las ejecuciones de lo mismo*
, por lo que puede usarlo fácilmente para buscar bytes distintos de cero:fuente
| head
al final de eso, de modo que si resulta que la unidad no está puesta a cero, se detiene después de producir la salida suficiente para mostrar el hecho, en lugar de volcar toda la unidad en la pantalla.He escrito un breve programa en C ++ para hacerlo, fuente disponible aquí .
Para construirlo:
Para ejecutarlo:
Producirá la posición y el valor de cualquier byte distinto de cero. Puede redirigir esta salida a un archivo con
>
, por ejemplo:Es posible que desee intentar cambiar
BUFFER_SIZE
para una mejor eficiencia. No estoy seguro de cuál podría ser un valor óptimo. Tenga en cuenta que esto también afecta la frecuencia con la que imprime el progreso, lo que afectará un poco la velocidad (la salida de impresión a la consola es lenta ). Agregue2>/dev/null
para deshacerse de la salida de progreso.Soy consciente de que esto no está utilizando bash estándar, ni siquiera incorporados, pero no debería requerir ningún privilegio adicional. La solución de @Hennes es aún más rápida (realmente no he optimizado nada, esta es la solución ingenua); sin embargo, este pequeño programa puede darle una mejor idea de cuántos bytes ha perdido su limpiador y en qué ubicación. Si deshabilita la salida de progreso, seguirá siendo más rápido de lo que la mayoría de los discos duros de consumo pueden leer (> 150 MB / s), por lo que no es un gran problema.
Una versión más rápida con una salida menos detallada está disponible aquí . Sin embargo, todavía es un poco más lento que la solución de @Hennes. Sin embargo, este se cerrará en el primer personaje distinto de cero que encuentre, por lo que es potencialmente mucho más rápido si hay un distinto de cero cerca del comienzo de la transmisión.
Agregar fuente a la publicación para mantener la respuesta mejor autocontenida:
fuente
iszero /dev/sda
lugar de requerir que se canalice con algo comoiszero < /dev/sda
?int main(int argc, char *argv[])
y luegoFILE* file = fopen(argv[1], "r");
. Hecho correctamente, incluiría verificar si el argumento realmente existe, la verificación de error se abrió con éxito (hacer unaferror
verificación adicional después defopen
), etc., pero demasiados problemas para un programa desechable.gcc
que no está necesariamente disponible en todas las distribuciones de Linux sin extraer paquetes adicionales. Por otra parte, numpy tampoco forma parte de los paquetes estándar de Python ...-O3
y-march=native
puede ver algunas aceleraciones; eso debería asegurarse de que GCC habilite la vectorización automática y utilice el mejor disponible para su CPU actual (AVX, SSE2 / SSE3, etc.). Junto con eso puedes jugar con el tamaño del búfer; diferentes tamaños de búfer pueden ser más óptimos con bucles vectorizados (jugaría con 1MB +, el actual es 1kB).@Bob
) en el chat: chat.stackexchange.com/rooms/118/root-accessAmpliando la respuesta de Gordon,
pv
proporciona una indicación de qué tan avanzado está el proceso:fuente
Esto parece una solución fea e ineficiente, pero si tiene que verificar solo una vez:
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
Usando dd para leer desde el disco
sdX
. (reemplace la X con la unidad desde la que desea leer),luego traduzca todos los bytes cero no imprimibles a algo que podamos manejar.
Luego, contamos los bytes que podemos manejar y verificamos si es el número correcto (
wc -c
para eso), o saltamos el conteo y usamos-s
o--squeeze-repeats
para exprimir todas las ocurrencias múltiples en un solo carácter.Por
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
lo tanto, debe imprimir solo una T.Si quieres hacer esto regularmente, entonces quieres algo más eficiente.
Si desea hacer esto solo una vez, este kludge puede verificar que su limpiador normal esté funcionando y que puede confiar en él.
fuente
Para verificar solo, verá los bloques que no coinciden en la lista
O use badblocks para escribirlos y también verifique:
La prueba de destrucción predeterminada es mi borrado seguro de elección
Si alguien puede recuperar algo después de llenar el disco con 0s y 1s alternativos, entonces su complemento, luego todos los 1s, luego todos los 0s, con cada pase verificado que funcionó, ¡buena suerte para ellos!
También realiza una buena comprobación previa a la implementación en unidades nuevas
para otras opciones
No digo que sea rápido, pero funciona ...
fuente
Lo mejor de ambos mundos. Este comando omitirá sectores defectuosos:
Use
kill -USR1 <pid of dd>
para ver el progreso.fuente
Hace algún tiempo tenía curiosidad
AIO
. El resultado fue un programa de prueba de muestra que comprueba los sectores (bloques de 512 bytes) que estánNUL
. Puede ver esto como una variante de un detector de regiones de archivos dispersos . Creo que la fuente dice todo.NUL
salida0000000000-eof
. Tenga en cuenta que hay un truco en el programa, la funciónfin()
no se llama en la línea 107 a propósito para dar la salida mostrada.AIO
que no es tan sencillo como otras formas,AIO
es probablemente la forma más rápida de mantener un disco ocupado leyendo , porque elNUL
comparar se realiza con el siguiente bloque de datos se lee en. (Podríamos exprima un poco más milisegundos haciendo superposiciónAIO
, pero realmente no creo que esto vale la pena el esfuerzo.)true
si el archivo es legible y todo funcionó. No regresafalse
si el archivo no esNUL
.NUL
todavía funciona, ya que los búferes de memoria ya contienenNUL
. Si alguien piensa que esto necesita una solución, en la línea 95memcmp(nullblock, buf+off, SECTOR)
podría leermemcmp(nullblock, buf+off, len-off<SECTOR : len-off : SECTOR)
. Pero la única diferencia es que el "informe final" quizás sea un poco aleatorio (no para un archivo que es completamenteNUL
).memcmp()
también soluciona otro problema en las plataformas, que noNUL
alloc()
editan la memoria, porque el código no lo hace. Pero esto solo puede verse en archivos de menos de 4 MiB, perochecknul
probablemente sea una exageración para una tarea tan pequeña;)HTH
fuente
Quería publicar esta solución inteligente a partir de una pregunta similar pero anterior, publicada por un usuario que no ha iniciado sesión por un tiempo:
fuente