martes, 27 de mayo de 2008

Como harcer merge de directorios en linux

Bueno, el problema que tenemos es el siguiente:

Tenemos dos discos duros, con un montón de ficheros, y queremos que ambos discos aparezcan como si fuesen uno sólo, como si uniésemos el contenido de ambos directorios.

¿Qué hacemos?

En windows llorar. Lo único que podemos hacer es montar un directorio en una tercera unidad, y dentro de él meter referencias a sistema de ficheros para que se monten dentro del anterior desde el administrador lógico de discos (en vez de dar una letra de unidad al disco, le asignamos un punto de montaje... anda, como en sistemas Unix,... qué curioso...)

En linux, tenemos 3 opciones:

  • La consabida opción de montar los sistemas de ficheros de ambos discos en un directorio de un tercer disco..., lo cuál nos deja como en entornos windows,
  • hacer un link simbólico a cada directorio en un directorio común, con la puñeta de que cada vez que metamos algo a los discos hay que actualizar los links simbólicos, con lo que nos tendríamos que hacer un script, ya que si tenemos muchos directorios y ficheros, hacerlo a mano puede ser la muerte.
  • o utilizar (una vez montados normalmente) el sistema de archivos unionfs. (ESTE ESTE!!! :P)

Con unionfs lo que hacemos es indicar dos ramas (o directorios, o discos en nuestro caso), que se van a juntar en un nuevo directorio que nosotros digamos, y darán la impresión de que sólo hay un disco duro gigante.

Se trata de eso, de la impresión de, no de que realmente tengamos un disco duro o que el sistema de archivos se porte como un sólo disco.

Mi consejo es utilizar este sistema de ficheros en solo lectura, para evitar problemas, y cuando se quiera meter datos, meterlos directamente al disco que queramos en los puntos de montaje habituales.

Lo mejor de esto, es que una vez montado en el sistema linux, si compartimos el directorio por red, la máquina windows la ve como si de un disco se tratase (ideal cuando tienes un media center con todos los dvds originales pasados al ordenador para que no se te jodan los discos)

Ahora el ejemplo práctico.

Supongamos que tengo un disco duro que llamare A montado en el directorio
'/home/antuan/uno'
dentro de ese disco hay un fichero que se llama 1.txt

El disco duro B lo tengo montado en
'/home/antuan/dos'
y dentro tiene un fichero llamado 2.txt

Lo que tengo que hacer para unir ambos directorios es hacer un directorio nuevo donde estará la unión de ambos, que llamaré
'/home/antuan/uniondediscos' , y lo hago con la orden
mkdir /home/antuan/uniondediscos


a continuación pondré
sudo mount -t unionfs -o ro,dirs=/home/antuan/uno:/home/antuan/dos none /home/antuan/uniondediscos


Una vez hecho esto, si mi sistema tiene el unionfs instalado, podré entrar al directorio /home/antuan/uniondediscos, y cuando haga un ls me dará:
1.txt
2.txt

Con lo que habré conseguido lo que buscaba.

Las opciones del comando son:
  • -t unionfs : indico que para el montaje quiero usar el sistema de ficheros unionfs. Tienes que tenerlo instalado (en un Ubuntu mirate el synaptic)
  • -o : para indicar que lo que viene a continuación son opciones de configuración
  • ro,dirs=/home/antuan/uno:/home/antuan/dos=ro : Damos la lista de directorios que queremos unir, y especificamos ro para decir que tiene que quedarse como de sólo lectura (nadie los puede modificar en el directorio de unión, hay que hacerlo a mano en los directoriso originales)
  • none : no montamos ningún dispositivo
  • /home/antuan/uniondediscos : el directorio de destino de la unión
Unionfs tiene muchas opciones, y no solo de sólo lectura, y por supuesto puede unir todos los directorios que quieras, si quieres saber más: UnionFS, Tutorial, y el combo definitivo: unir con unionfs dos directorios samba montandolo todo en el fstab

No hay comentarios: