Como hacer Linux tolerante a apagones, fallos en el sistema de archivos, …

Cuando estamos diseñando un sistema domótico, y llega la hora de probarlo, ¿a quien no le ha pasado que a los pocos días de usarlo se va la luz, y se va todo a tomar viento? ¿Qué se puede hacer para proteger el sistema ante corrupciones del sistema de archivos o apagones repentinos? La respuesta es hacer el sistema de sólo lectura, como un liveCD pero con la posibilidad de hacer modificaciones. Ha varias soluciones, aunque la más fácil es dividir nuestra partición / en varias, unas no modificables (archivos de sistema y configuraciones) y otras modificables (para datos).

Haciendo esto conseguimos que nuestro sistema siempre arranque, aunque no se garantiza la integridad de los datos que manejan los programas: bases de datos, logs, capturas de imágenes… Para proteger los datos deberemos establecer posteriormente una política de copias de seguridad (que se podrían guardar en el propio equipo en otra partición de sólo lectura la mayor parte del tiempo, excepto cuando vayamos a hacer la copia de seguridad).

Es más fácil de lo que parece. Vamos a ello.

En los sistemas Linux los archivos extremadamente críticos están en /boot, que suele estar en una partición separada y que se modifican muy rara vez (cuando se actualiza el kernel). Después tenemos los programas, que se suelen guardar en /bin, /sbin, /usr… Las configuraciones y scripts de inicio están en /etc, y los datos de los programas y logs van en /var.

Una vez que tenemos esto claro podemos intuir que si dividimos el sistema en tres particiones ya tenemos un punto de partida para hacer pruebas:

  1. /boot: sólo lectura
  2. /var y /tmp: lectura y escritura
  3. El resto, /bin, /usr, /etc, /sbin, /lib… sólo lectura

Cuando tenemos el sistema instalado, podemos arrancar con un liveCD o insertar la tarjeta SD o MMC en otro equipo y redimensionar las particiones con gparted o similar. Por ejemplo, con el sistema instalado en una tarjeta SD de 16Gb podemos dejar una partición /boot de 256Mb, otra de sólo lectura de 6Gb, y el resto para la partición de lectura/escritura que llamaremos /mnt/Data con formato ext4. En /mnt/Data copiaremos los directorios que vayan a contener archivos modificables y en su lugar dejaremos un enlace simbólico a la copia en /mnt/Data.

En el caso de las distribuciones que tengan la partición de /boot, debemos asegurarnos de que en el fichero /etc/fstab, esta indicado que se debe montar como sólo lectura, de forma parecida a:

Si, por el contrario, nuestra distribución incluye el directorio /boot en la partición del sistema archivos raíz, junto con el resto, no pasa nada ya que haremos la partición / de sólo lectura.

Creamos el directorio /mnt/Data y modificamos el ficheros /etc/fstab para que nos monte la nueva partición (la de lectura/escritura en ella), para ello necesitamos su UUID:

 Añadimos la partición al fichero /etc/fstab, que quedaría más o menos así:

Obsérvese que de las opciones de montaje de /boot y de / se ha cambiado rw por ro, para hacerlas de sólo lectura. En cambio /mnt/Data usa las opciones típicas.

Antes de poder mover los archivos de /var, tenemos que asegurarnos de que no hay ninguno en uso. Recordemos que estos archivos son usados por bases de datos, registros, y demás. Para saber que hay en uso tenemos el comando lsof:

Detenemos todos los servicios que podamos de los que aparecen en la primera columna para que los archivos dejen de estar en uso. Esto es importante hacerlo con programas que manejen archivos críticos que no se puedan truncar, con los que tengan en uso archivos de log no es tan importante ya que un log truncado no va a provocarnos ningún problema más adelante:

Ahora vamos a mover los datos de /var a /mnt/Data/var y algunos ficheros de /etc a /mnt/Data/etc.

Hay ciertos archivos en el directorio /etc que varían a medida que pasa el tiempo en el sistema, por ejemplo el /etc/mtab, donde se guardan las particiones que hay montadas en un momento dado. Hay que cambiar de ubicación estos archivos:

Y probamos suerte con:

En la pantalla de arranque del sistema, veremos los errores que van teniendo los programas para arrancar y deberemos mover los archivos afectados o cambiando las rutas que usan los programas durante su ejecución. Para comprobar que el sistema está usando las particiones que le hemos dicho, en modo solo lectura usamos el comando mount:

Podéis ver como /boot y / están montadas con la opción ro, ¡y el sistema arranca!

Como nota hay que decir que cuantos más servicios tengas corriendo en el equipo a la hora de querer hacerlo de sólo lectura, más programas habrá que cambiar, y más archivos habrá colocados en lugares que no nos convengan, pero siempre podremos crear una carpeta para ellos en /mnt/Data, copiarlos allí y crear un enlace simbólico a ellos.

Siguiendo estas instrucciones podéis crear una máquina MAME o un XBMC/Kodi en vuestras Raspberry Pi u Odroid y cuando os canséis la apagáis directamente de botonazo o quitándole la corriente (como hago yo cuando apago el XBMC que tengo alimentado por la TV) si preocuparos, ya que volverá a arrancar sin mayor problema… 🙂

 En el caso de que la distribución este basada en Debian (apt), podemos crear un archivo /etc/apt/apt.conf.d/99ro con el siguiente contenido:

Con los anterior conseguiremos que cuando vayamos a instalar actualizaciones o programas nuevos, el sistema automágicamente monte la partición / como lectura/escritura y al acabar lo deje en sólo lectura. Es posible que al instalar algo nuevo, o si nos hemos dejado algo, al intentar montar el sistema / en modo solo lectura, nos aparezcan mensajes de mount: / esta ocupado o similares, que se pueden solucionar fácilmente reiniciando o currándoselo más y buscando quien es el culpable de tener un fichero abierto en modo escritura en la partición /.

Comentarios

  1. Por Rubén Espinoza

    Responder

  2. Por Julio Marín

    Responder

    • Por José María

      Responder

      • Por Julio Marín

        Responder

        • Por José María

          Responder

          • Por José María

Deja un comentario

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