Recuperando discos y usb sticks

Introduccion:

No siempre podemos estar seguros que el estado de nuestro dispositivo de almacenamiento (con “dispositivo de almacenamiento” me refiero a todo disco duro (sea SATA, IDE o SSD), pendrive o cualquier otro hardware que nos permita guardar información), el estado de los disposititvo de almacenamiento no siempre podemos garantizar su estado perfecto para siempre, ocurre que con el tiempo los dispositivos comienzan a tener problemas.

Todo dispositivo de almacenamiento, cuenta con alguna organización de archivos, es decir, lógica (comunmente se conoce a esa organización lógica como file system), aquí hay muchas cosas que se podrían profundizar para entender que es lo que puede estar con “problemas”, para no aburrilos voy a ser lo más minimalista posible:

Existen varios tipos de problemas que le pueden ocurrir a un dispositivo de almacenamiento:
1.- alguna corrupción del file system (a nivel lógico)
2.- alguna corrupción del dispositivo de almacenamiento (a nivel fisico)
3.- otros (puede ser una mezcla, malware que nos haga pensar que es un problema como el 1 y 2, corrupcion del la tabla de particiones, sector de booteo, MBR, hacer escribir forzadamente de modo tal que arruine a nivel fisico, etc.)

El objetivo de esta entrada es el segundo punto: problemas de almacenamiento, a nivel físico

Todo dispositivo de almacenamiento cuenta con una organización a nivel fisico, la cual se la conoce como discos, pistas y sectores.

El concepto de sectores es lo que nos interesa, en ellos se termina almacenando toda la información del dispositivo de almacenamiento, los cuales cuando hay problemas comienzan a ser inaccesibles.

Obviamente un problema a nivel físico se manifiesta a nivel lógico, pero al revéz no siempre es válido!

A nivel lógico hablamos de terminos como cluster (windows-FAT 16 / 32 y NTFS) y bloques (linux/unix), estos “terminos” a nivel logico pueden ser o no un conjunto de unidades a nivel físico!. Por ejemplo en gral un cluster agrupa a un conjunto del sectores del disco (pueden ser continuos o no! a su vez los clusters pueden o no ser contiguos fragmentación!.

Bien!, lo que vamos a analizar en esta entrada es como detectar y marcar como inutilizables aquellos sectores que ya no sirven:

ACLARACIÓN: los sectores una vez que no funcionan, deben dejar de utilizarse, es decir, dejar de ser disponibles para poder continuar utilizando el dispositivo de almacenamiento lo más posible, debido a que sectores defectuosos implican daño fisico no tienen arreglo. Cuando empiencen a notar que hay muchos de estos sectores defectuosos, por ejemplo 100 (vamos a ver como chequear cuantos y cuales hay) hay que ir pensando en reemplazar el dispositivo de almacenamiento lo antes posible!

Veamos el procedimiento para detectar y marcar los sectores con problemas:
1.- Identificar el dispositivo de almacenamiento y la partición a chequear / reparar
2.- Mandar a chequear y obtener lista de bloques defectuosos en una partición
3.- Actualizar la lista de sectores que conoce el FileSystem como defectuosos o Formatear la partición incluyendo la lista de sectores defectuosos


 

ACLARACION para filesystem de tipo NTFS: Después de mucho buscar, veo mucha confusión al respecto, lo que está claro que este procedimiento sirve para particiones “linux/unix” es decir ext2, ext3, ext4. Para NTFS lo que muchos dicen es intentar utilizar un programa provisto por la empresa que fabricó el dispositivo de almacenamiento, el problema con esto es cuando si disco ni siquiera bootea!, otros dicen que intentes utilizar chkdsk (el supuesto heredero del scandisk) y otros dicen que si el disco es relativamente nuevo (nueva tecnonología), entonces con un chequeo con badblocks (utilidad que vamos a utilizar en linux) obligará al dispositivo de almacenamiento disparar su mecanismo de “remap” de sectores para que esos sectores se dejen como inutilizables.
En definitiva, el tema de fondo con NTFS es que es un formato “propietario” con lo cual, no existe una clara solución a los problemas de sectores defectuosos en una partición, la idea sería poder realizar el mismo procedimiento e “informarle” al filesystem NTFS que “tome” en cuenta esa lista para que cuando administre los archivos no vaya a tomar esos sectores, hoy por hoy no hay esa opción!

Lo que encontré es que lo que te pueden ayudar es seguir el sig.

procedimiento para NTFS

1.- Identificar el dispositivo de almacenamiento y la partición a chequear / reparar
2.- Mandar a chequear y obtener lista de bloques defectuosos en una partición
3.- Mandar a “escribir” esos sectores con:
Por ejemplo el numero de sector defectuoso es 303975848 y la partición con NTFS es /dev/sda, entonces
sudo dd if=/dev/zero of=/dev/sda6 bs=1024 count=1 seek=303975848
4.- repetir desde el paso 2 hasta que la lista obtenida de sectores detectada sea nula!

Obviamente esto intenta escribir en donde no se puede, lo cual teoricamente, a lo que alude es “disparar” que el SMART del dispositivo de almacenamiento haga remap de los sectores que digas.

Que sucede si son más de cien sectores defectuosos?
1.- hay que hacer un bucle con bash para recorrer el archivo y pasarlo al comando dd
2.- es posible que el filesystem NTFS se corrompa y en el peor de los casos no sea utilizable!, por lo que hay que hacer backup de todo lo que sea “leible” antes de hacer esto


Veamos el procedimiento para filesystems de linux/unix:

1.- Identificar el dispositivo de almacenamiento y la partición a chequear / reparar:

sudo fdisk -l

Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x70a25d0c

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 181196799 181194752 86.4G 83 Linux
/dev/sda2 181196800 480204799 299008000 142.6G 83 Linux
/dev/sda3 480204800 488396799 8192000 3.9G 82 Linux swap / Solaris

Disk /dev/sdb: 3.7 GiB, 4004511744 bytes, 7821312 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000b7f8b

Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 7821311 7819264 3.7G c W95 FAT32 (LBA)

Disk /dev/loop0: 1.3 GiB, 1423540224 bytes, 2780352 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

En mi caso la partición que tiene problemas es la /dev/sda2

2.- Mandar a chequear y obtener lista de bloques defectuosos en una partición
Aqui hay 2 caminos posibles:
a.- No me importa la información de la partición porque ya hice backup o simplemente no me importa nada, es ese caso:

sudo badblocks -vsw /dev/sda2 > ~/bad-blocks-sda2 &

Esto dejará en el archivo ~/bad-blocks-sda2 la lista de sectores que encontró defectuosos, hará 8 pasadas, en cada par de pasadas por la partición probará 1 patrón de información que ESCRIBIRÄ en CADA SECTOR de la partición, y que luego intentará LEER de CADA SECTOR de la partición. Obviamente no tiene que adivinar ni preguntarle al filesystem que hay en cada sector, pero al mismo tiempo se pierde cualquier información que estuviese escrita allí. Esta opción es la mejor de las posibles, ya que ahorra tener que guardar temporalmente la información que leyó de ahí y luego volver a escribirla para dejar todo como estaba (dicen que tarda la mitad de tiempo que en el metodo “no destructivo” que vamos a ver en el punto b.)

NOTA adicional: Si tenemos posibilidad de realizar este punto, podriamos intentar realizar este paso hasta que la lista de sectores detectados como malos sea nula ( a lo que apuntamos es que el SMART del dispositivo de almacenamiento haga un remap “automático” de los sectores detectados )

b.- Me super importa la información en la partición y no hice o no puedo hacer backup, en ese caso:

sudo badblocks -vsn /dev/sda2 > ~/bad-blocks-sda2 &

Esto dejará en el archivo ~/bad-blocks-sda2 la lista de sectores que encontró defectuosos, simplemente intentando leer lo que se supone que hay allí.

3.- actualizar la lista de sectores que conoce el FileSystem como defectuosos o Formatear la partición incluyendo la lista de sectores defectuosos:
Si hiciste el chequeo del punto 2.a entonces debes formatear la partición incluyendo la lista:

En mi caso la partición es ext4, por lo que voy a utilizar mkfs.ext4, si es otro debes utilizar el mkfs.ALGO que corresponda:

mkfs.ext4 -l ~/bad-blocks-sda2 /dev/sda2

Si hiciste el chequeo del punto 2.b entonces puedes actualizar la lista de sectores defectuoso:

fsck.ext4 -l ~/bad-blocks-sda2 /dev/sda2

Por otro lado existe otra forma en linux en que se puede hacer el paso 3 y 4 juntos!

fsck.ext4 -cDfty -C 0 /dev/sd**

Donde:
c: indica que llame a badblocks para una prueba no destructiva del chequeo
D: Optimiza directorios es posible
f: fuerza el chequeo por más que el file system esté marcado como limpio
t: imprime estadísticas de tiempos isumidos en el chequeo
y: asume que todas las preguntas se responden en “yes”
C 0: muestra el progreso en el stdout
/dev/sd**: indica la partición a realizar el chequeo

2 comentarios sobre “Recuperando discos y usb sticks”

  1. Usually I don’t read post on blogs, however I would like to say that
    this write-up very forced me to take a look at and do it!
    Your writing taste has been amazed me. Thank you,
    very great post.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

dos × uno =

Time limit is exhausted. Please reload CAPTCHA.