miércoles, 17 de diciembre de 2014

Recuperación de discos rígidos levemente arruinados

En este artículo abordo una forma que he encontrado bastante adecuada para recuperar información de discos rígidos que se han dañado, ya sea en formato GNU/Linux como Windoze. Manos a la obra!

Situación: Un buen día queremos bootear nuestra máquina, y para nuestra sorpresa descubrimos que no podemos por errores en el disco rígido. Ese disco se encuentra ya con su vida útil cumplida, y nos pide a gritos que lo cambiemos por uno nuevo. La desesperación nos invade, ya que no encontramos forma de levantar la máquina para copiar la información que en dicho disco se encontraba hacia otro lado.

Materiales: Necesitaremos:
- La PC moribunda.
- Un pen drive de por lo menos 2 GB.
- Un disco externo de por lo menos la capacidad del original más algunos GB para guardar archivos de log y demás archivos auxiliares. Si nuestro disco era de 320 GB, uno de 500 GB sirve. Puede estar conectado de la forma que se nos ocurra, inclusive en un gabinete externo, por medio de USB, etc.
- Una imagen de una distro medianamente digna de GNU/Linux, como ser Manjaro, Debian, o alguno de sus derivados.
- Un instalador de imágenes en pendrives como ser las que se bajan de pendrivelinux.com, o una PC con GNU/Linux.
- Una conexión a Internet que nos permita bajar algunos MB de paquetes.

Procedimiento:

Si contamos con una PC con GNU/Linux que funcione, podemos escribir nuestro pendrive con ella usando dd. Lo primero será ejecutar como root el comando "fdisk -l" para entender cuáles son nuestras unidades de disco. Supongamos que /dev/sda es el disco de nuestra PC GNU/Linux, y que /dev/sdb es el pendrive. También, que la imagen es manjaro.iso.
El comando a ejecutar, desde el directorio donde está manjaro.iso, es el siguiente (siempre como root):

# dd if=manjaro.iso of=/dev/sdb bs=1M

Una vez terminado este proceso, booteamos nuestra PC dañada desde el pendrive.

Ya booteada desde el pendrive, si la distro fuera Manjaro, ejecutamos (siempre como root, luego de un "sudo bash"):

# pacman -S ddrescue

Si lo primero que nos pide el sistema operativo es actualizar su gestor de paquetes, recordemos ejecutarlo nuevamente para que REALMENTE instale ddrescue.

Si lo que estamos usando es una distro como Ubuntu, por ejemplo, lo que debemos hacer es instalar el "gddrescue" y "ddrescue", que no se encuentra en los repositorios inciales del LiveUSB, por lo que habrá que agregar las entradas "universe" y "multiverse" a las que ya posee el archivo /etc/apt/sources.list, y ejecutar:

# apt-get update
# apt-get install gddrescue ddrescue

Si la PC dañada es como todas, al ejecutar, como root, un "fdisk -l", veremos diferentes unidades de disco (consideramos que el disco auxiliar estará conectado vía USB). Para nuestro ejemplo supongamos que /dev/sda es el disco interno, dañado, /dev/sdb es el pendrive USB, y que el disco externo es /dev/sdc.

Formatearemos el disco externo con "fdisk /dev/sdc", donde definiremos una única partición con todo el contenido del disco, y lo salvaremos así.

Luego ejecutaremos "mkfs -t ext4 /dev/sdc1" para que genere el filesystem. Tener muchísimo cuidado con esto, ya que si las unidades tienen otros nombres, y no nos damos cuenta, rompemos todo...

Ya con el disco formateado, y considerando que el disco dañado es /dev/sda, donde la partición /dev/sda1 es la que tenía el sistema operativo, montamos la partición recién creada en /mnt (mount /dev/sdc1 /mnt), y procedemos a ejecutar ddrescue (adivinaron: como root):

# ddrescue -d -r3 /dev/sda1 /mnt/sda1.img /mnt/sda1.log

Cuando termine de ejecutar este comando, podremos ejecutar:

# mkdir /discosda1
# mount -o loop,ro /mnt/sda1.img /discosda1

Si todo salió bien, veremos que tenemos en /discosda1 el disco con todo su contenido, al menos lo que se puede salvar, listo para ser copiado a otra máquina, o al mismo disco ahora montado en /mnt.

Si el sistema de archivos es de GNU/Linux, y no quiere ser montado por tener errores, debemos primero ejecutar "fsck" sobre él:

# fsck -y /mnt/sda1.img

Si no encuentra el superblock, tendremos que utilizar uno alternativo, para lo cual habrá que ejecutar, para saber cuáles son los superblocks alternativos:

# dumpe2fs /mnt/sda1.img | grep superblock

Verificar el primero de los números de superblock que aparecerán.

Y luego, para usar el superblock alternativo, se deberá ejecutar:

# fsck -y -b /mnt/sda1.img

Por qué se hace esta imagen? Porque no sabemos hasta cuándo nuestro disco dañado aguantará, y es por ello preferible trabajar sobre una imagen que sobre el disco en sí mismo. Joven precavido vale por dos...

Al finalizar el proceso, se puede ejecutar "poweroff" y listo.

Enjoy and recover, guys!