Si por casualidad acabamos ejecutando un rm -fr /var/lib, tendremos un pequeño problema. El directorio /var/lib está pensado para que los programas instalados guarden información variable (ver man hier). Puestos a suponer, supongamos que esto es exactamente lo que acaba de pasar, que aún no hemos reiniciado la máquina y que seguimos teniendo acceso por SSH.

Copias de seguridad

En este momento, ya es tarde para pensar en copias de seguridad si no las habíamos hecho antes. Habrá información que hayamos perdido y que sea imposible recuperar, por ejemplo, las bases de datos MySQL. Probablemente, perderemos información importante para los programas y es posible que recuperar el sistema en lugar de reinstalar favorezca que haya toda clase de errores extraños.

Además, tras borrar el directorio /var/lib, programas como dpkg y apt-get o aptitude no funcionarán, ya que guardan información de los programas instalados en directorios como /var/lib/dpkg, /var/lib/apt o /var/lib/aptitude, lo que provoca que la recuperación del sistema sea tediosa.

Recuperar el instalador

El primer paso es poder ejecutar el instalador de paquetes de nuevo, para poder reinstalar todos los paquetes. Para esto, partiremos de un livecd de la misma versión que tengamos instalada y copiaremos el directorio /var/lib/dpkg, en este caso, Ubuntu Server 14.04.1 de 32 bits:

bash $ wget http://releases.ubuntu.com/14.04/ubuntu-14.04.1-server-i386.iso

Podemos utilizar unetbootin para instalar la distribución en un USB, o como en este caso, ejecutar una máquina virtual con virtualbox y especificando que el disco contenga esa ISO. Arrancamos la máquina virtual y seleccionamos el "Modo rescate".

Desde la consola de rescate, copiaremos el contenido del directorio /var/lib a la máquina en la que hemos sufrido el percance, cuya IP pongamos que sea 192.168.1.100:

bash (virtualbox)$ cd /tmp (virtualbox)$ tar -cf lib.tar /var/lib (virtualbox)$ cat lib.tar | nc 192.168.1.100 9090

En la máquina a reparar debemos ejecutar:

bash $ mkdir /tmp/recover $ cd /tmp/recover $ sudo ufw allow proto tcp from 192.168.50.0/24 to any port 9090 $ nc -l 9090 | tar x $ sudo ufw delete allow proto tcp from 192.168.50.0/24 to any port 9090 $ sudo chown -R root:root var/lib $ sudo mv var/lib /var

Si todo ha ido bien, deríamos poder ejecutar algunos comandos:

bash $ sudo dpkg --audit $ sudo apt-get update $ sudo apt-get check $ sudo dpkg --configure -a $ sudo apt-get install -f $ sudo apt-get upgrade

Reinstalar todos los programas

Podemos encontrar una copia del fichero /var/lib/dpkg/status con toda la información de los paquetes instalados en /var/backups/dpkg.status.0. También podemos revisar el fichero /var/log/apt.log para reinstalar los últimos paquetes añadidos o eliminados:

bash $ /var/tmp/packages0.list $ sudo apt-get --reinstall install `cat /var/tmp/packages0.list`

Es posible que algunos paquetes den error debido a alguna depedencia que no está correctamente instalada, pero conforme se van reinstalando todos, deberían quedar todos correctamente instalados. Ej:

bash E: Couldn't configure pre-depend dpkg:i386 for mountall:i386, probably a dependency cycle.

También iremos viendo avisos como el siguiente, especialmente de aquellos paquetes que necesitaremos reinstalar:

bash dpkg: aviso: falta el fichero de lista de ficheros del paquete `python-lxml', se supondrá que el paquete no tiene ningún fichero actualmente instalado

Una vez que termine, nos aseguramos que los ficheros base quedaron bien instalados:

bash $ sudo apt-get download base-files $ sudo apt-get install --reinstall base-files

Recuperar MySQL

MySQL guarda los ficheros de la base de datos en /var/lib/mysql/. Si tuviéramos una copia, recuperar la base de datos sería tan sencillo como ejecutar:

bash $ mysql -uroot -p < mysql_backup.sql


Entradas relacionadas