mount bind linux vs reconfiguración de aplicación

Cuando montamos sistemas Linux una de las reglas de oro es externalizar la configuración y los datos de la aplicación a otro volumen. Esto se puede hacer fácilmente por ejemplo montando /opt sobre otro disco y realizando las instalaciones sobre /opt.

Las instalaciones sobre otros volúmenes son sencillas siempre y cuando no recurramos al repositorio de la distribución que estemos usando, en este caso vamos a tener configuración y datos en unos cuantos sitios. En una situación así podemos hacer 2 cosas:

  1. Pasearnos por todos los ficheros de configuración de la aplicación en cuestión y modificar rutas de logs, datos, configuración, etc… un trabajazo vamos.
  2. Usar mount con la opcion –bind y no tocar absolutamente nada de la aplicación.

La sintaxis básica de la llamada es:

Source   
mount --bind origen destino

Donde “origen” es un directorio que queremos montar sobre el “destino”, para más información ver la documentación. Puede parecer algo como un link simbólico pero es algo mucho mejor ya que:

  • Para crear un link simbólico hay que destruir el directorio original y sustituirlo por el link simbólico.
  • Funciona con usuario enjaulados.

Pongamos un ejemplo, hemos instalado en 5 minutos desde el repositorio un servidor MySQL y queremos externalizar todo. En un ubuntu toda la información relacionada se encuentra en:

Source   
/etc/mysql
/var/lib/mysql
/var/log/mysql

Paramos la aplicación, en este caso MySQL. Supongamos que queremos que esté todo en /opt, lo primero que hacemos es crear una estructura de directorios mínima (dejamos el directorio más profundo sin crear para que al copiar no nos cree subdirectorios):

Source   
mkdir -p /opt/mysql/etc/
mkdir -p /opt/mysql/var/lib
mkdir -p /opt/mysql/var/log

Ahora copiamos el contenido original dentro de los directorios que montaremos sobre los destino (las ubicaciones reales):

Source   
cp -a /etc/mysql /opt/mysql/etc/
cp -a /var/lib/mysql /opt/mysql/var/lib/
cp -a /var/log/mysql /opt/mysql/var/log/

Se ha usado la opción -a para que se copien todos los permisos, propietarios y de forma recursiva.

Ahora solo nos queda hacer los mount bind de la siguiente forma:

Source   
mount --bind /opt/mysql/etc/mysql /etc/mysql
mount --bind /opt/mysql/var/lib/mysql /var/lib/mysql
mount --bind /opt/mysql/var/log/mysql /var/log/mysql

Si revisamos los montajes veremos que realmente /var/log/mysql y /vol/mysql/var/log/mysql son la misma cosa:

Source   
ubuntu@ipXXXXXXXX:~$ mount
...
/opt/mysql/etc/mysql on /etc/mysql type none (rw,bind)
/opt/mysql/var/lib/mysql on /var/lib/mysql type none (rw,bind)
/opt/mysql/var/log/mysql on /var/log/mysql type none (rw,bind)
ubuntu@ipXXXXXXXX:~$ sudo ls /var/log/mysql
mysql-bin.000001  mysql.log      mysql.log.3.gz  mysql.log.6.gz  mysql-slow.log.1.gz  mysql-slow.log.4.gz  mysql-slow.log.7.gz
mysql-bin.index   mysql.log.1.gz  mysql.log.4.gz  mysql.log.7.gz  mysql-slow.log.2.gz  mysql-slow.log.5.gz
mysql.error.log   mysql.log.2.gz  mysql.log.5.gz  mysql-slow.log  mysql-slow.log.3.gz  mysql-slow.log.6.gz
ubuntu@ipXXXXXXXX:~$ sudo touch /var/log/mysql/test.mount.bind
ubuntu@ipXXXXXXXX:~$ sudo ls /opt/mysql/var/log/mysql
mysql-bin.000001  mysql.log      mysql.log.3.gz  mysql.log.6.gz  mysql-slow.log.1.gz  mysql-slow.log.4.gz  mysql-slow.log.7.gz
mysql-bin.index   mysql.log.1.gz  mysql.log.4.gz  mysql.log.7.gz  mysql-slow.log.2.gz  mysql-slow.log.5.gz  test.mount.bind
mysql.error.log   mysql.log.2.gz  mysql.log.5.gz  mysql-slow.log  mysql-slow.log.3.gz  mysql-slow.log.6.gz

Ahora ya se podría arrancar la aplicación sin problemas.

Como último detalle indicar que este montaje debería estar en el /etc/fstab con las lineas:

Source   
/opt/mysql/etc/mysql        /etc/mysql    none    bind    0 0
/opt/mysql/var/lib/mysql    /var/lib/mysql    none    bind    0 0
/opt/mysql/var/log/mysql    /var/log/mysql    none    bind    0 0

Espero que os simplifique la vida 🙂

Deja un comentario