Mirroring, copia espejo o cómo copiar carpetas completas
Copyright © 2 Febrero 2004 Antonio Arauzo Azofra
Muchas veces es útil realizar una copia de una carpeta completa con todos sus contenidos (archivos y subcarpetas) en otra parte. Esto se conoce con el nombre de "mirroring" o hacer una copia espejo. En general, es una operación sencilla, y hay herramientas muy potentes en GNU/Linux para hacer la copia. Pero no siempre resulta fácil encontrarlas ni saber cuál es la más apropiada. Esta receta pretende simplificar esta tarea.
Introducción
Son muchas las aplicaciones que tiene la copia de carpetas completas: copias de seguridad, actualización de una página web, distribución de datos, sincronización con un ordenador portátil, trabajo simultáneo de varias personas en un proyecto, crear un servidor espejo (o "mirror")... Cada una tiene requisitos diferentes, y por eso existen muchas utilidades para hacer estas copias.
Copia local
Para copiar una carpeta completa en el mismo ordenador, puedes simplemente seleccionar la/s carpeta/s deseada/s y usar la opción copiar y pegar de Nautilus. (Nautilus es el programa que normalmente se encarga de los archivos y carpetas del escritorio y de permitirte navegar por ellas.)
O puedes hacerlo desde la shell (también conocida como terminal o línea de órdenes) usando la orden cp:
cp -a origen destino
La opción -a es una abreviatura de las opciones -dpR, que indican que queremos copiar todos los contenidos de origen de la forma más fiel posible (enlaces, permisos, propietario, fechas de modificación; para más información usa man cp).
Paquetes
Si lo que queremos es realizar un paquete con todos los contenidos de la carpeta origen, podemos usar algún programa con interfaz gráfico como file-roller.
O desde la shell usar la orden tar, 3 ejemplos:
tar cvf paquete.tar origen
tar cvzf paquete.tgz origen
tar cvjf paquete.tbz origen
En el primero no se utiliza compresión, en el segundo se usa gzip para comprimir (un formato muy extendido), y en la tercera se usa bzip2 (formato más moderno, que crea paquetes más pequeños, pero también algo más lento).
Al paquete podemos darle cualquier nombre, pero se le suele poner la extension .tar, .tgz o .tbz para indicar que ese fichero es un paquete tar y el tipo de compresión. También se usan las extensiones .tar.gz (= .tgz) y .tar.bz (= .tbz).
Para desempaquetar usamos respectivamente desde la carpeta destino:
tar xvf paquete.tar
tar xvzf paquete.tgz
tar xvjf paquete.tbz
En un paquete .tgz (o .tbz) pueden incorporarse varias carpetas y archivos directamente. Pero en el mundo Unix existe la norma de incluir todo dentro de una carpeta y empaquetar sólo ésta. Así, al desempaquetar, todos los contenidos del paquete se extraen en una carpeta nueva y no se mezclan con otros archivos y carpetas que puedan estar en la carpeta donde descomprimimos.
Copia remota
Antiguamente se usaba la orden rcp, pero ha sido descatalogada por los problemas de seguridad que planteaba. Hoy en dia casi todos los sistemas GNU/Linux ofrecen la posibilidad de usar la orden scp, que es similar a rcp pero usa encriptado para todas las transmisiones.:
scp -prC origen computadoraDestino:destino
Las opciones -p y -r son para que haga la copia lo más fiel posible, y la opcion -C para que utilice compresión al transmitir.
Si la computadora de origen o la de destino no tiene la orden scp pero sí nos permiten conectar con ssh, podemos usar:
tar cj origen | ssh computadoraDestino "cd destino; tar xvj"
En esta orden se usa la orden tar para crear un paquete que no se almacena en el ordenador local, sino que se transmite por la red y se desempaqueta según se recibe en el destino. Es un ejemplo de la potencia y flexibilidad de la shell de GNU/Linux, que nos permite combinar varias ordenes para obtener un resultado a nuestra medida.
Otra opción posible es montar algún sistema de ficheros remoto, con nfs, samba o similar, y realizar la copia como si fuera local.
Copias incrementales o cómo mantener sincronizadas dos carpetas
Si queremos mantener una copia actualizada de la carpeta origen, podemos simplemente realizar copias periódicamente con cualquiera de los metodos vistos anteriormente. Pero estos métodos pueden resultar lentos, especialmente si la carpeta tiene muchos contenidos. Lo ideal en este caso es usar algún mecanismo que nos permita copiar únicamente las modificaciones. Vamos a ver algunos comenzando por los más simples.
En un sentido (origen a destino)
rsync tiene una forma de uso parecida a la de scp, pero si el archivo o carpeta existe en el destino lo compara con él (usando un metodo de "checksum" para evitar transmitirlo por la red) y sólo copia la parte que se ha modificado:
rsync -avz --delete-after origen 192.168.2.2:destino
La opción -a nuevamente indica un resumen de otras opciones que indican que la copia sea fiel, -v que nos muestre lo que va haciendo, -z que use compresión, y --delete-after que borre del destino los fichero y carpetas que ya no existen en el origen.
Aunque rsync está convirtiéndose en estándar y está presente en muchos sistemas GNU/Linux, si por alguna razón no lo tenemos ni lo podemos instalar en una de las máquinas, pero sí podemos acceder por ftp, podemos usar mirrordir.
mirrordir no compara el contenido de los archivos, sino su tamaño y fecha. Si la fecha de la copia es más antigua o difieren en tamaño, copia el archivo completo. mirrordir es una herramienta compleja que incorpora muchas opciones, entre ellas su propia compresión y cifrado, e incluso un servidor para ponerlo en el ordenador de destino y acceder a traves de él. Se puede usar a traves de ssh, pero yo no he encontrado cómo, ni he conseguido usar el servidor. Probablemente, si podemos instalar un servidor de mirrordir, podremos instalar rsync, y entonces mi recomendación es usar rsync, que es más rapido y cómodo. Cuando me parece más útil mirrordir es para actualizar una copia de nuestra carpeta en un servidor ftp, como suele ser el caso de los proveedores de alojamiento web:
mirrordir -v /ruta_completa/origen/ ftp://usuario@computadoraDestino/ruta_ftp/destino/origen
Mi experiencia me dice que es mejor indicar las rutas completas de las carpetas para evitar equivocarnos. En el destino se debe indicar la ruta completa del directorio que usaríamos para acceder desde el ftp. Además, hay que indicar el nombre que queremos darle a la carpeta copiada en el destino (en el ejemplo he puesto "origen" de nuevo para darle el mismo nombre). Hay que tener en cuenta que si nos equivocamos, podemos sobreescribir alguna otra carpeta. La opción -v es para que nos muestre lo que va haciendo.
En los dos sentidos
Hay veces que vamos a realizar modificaciones en las dos copias de la carpeta. Seguiré denotándolas origen y destino, aunque en este caso estos nombres sólo sirven para indicar una y otra copia, ya que ambas son origen y destino de los cambios. Por ejemplo, para tener una carpeta en el ordenador de sobremesa y una copia sincronizada en el portátil y modificar ambas en cualquier momento. Esta sincronización es una operación más compleja que los tipos de copia anteriores, y requiere que el programa almacene información sobre los cambios que han ocurrido.
drsync es un programa que hace uso de rsync para mantener una carpeta sincronizada en dos ordenadores. Un ejemplo de su uso:
drsync.pl --verbose --rsh=ssh --recursive \
--state-file=.estado.bz2 origen computadoraDestino:destino
drsync.pl --verbose --rsh=ssh --recursive \
--state-file=.estado.bz2 computadoraDestino:destino origen
Hay que llamarlo 2 veces para que sincronice los cambios en los dos sentidos. La opción --state-file indica el nombre del fichero donde se guarda el estado de la copia para detectar los cambios.
Unison es una aplicación más avanzada para sincronización de carpetas. Incluye un interfaz gráfico de usuario (GUI), y en su documentación hay mucha información sobre el proceso de sincronización de carpetas.
Copia central
En cualquier caso, los anteriores sistemas de sincronización están indicados para cuando no se hacen muchas modificaciones simultáneas. Si lo que queremos es que varias personas puedan modificar una carpeta de trabajo, y sincronizar los cambios que todos van realizando en sus copias con un almacén o "repositorio" central, nos convendrá más utilizar alguno de los sistemas que están más específicamente diseñados con ese objetivo. CVS es el más utilizado, pero han surgido proyectos nuevos y concretamente uno muy prometedor, Subversion (svn), que incorpora bastantes mejoras.
Nomenclatura
"computadoraOrigen" y "computadoraDestino" son las direcciones (IP o nombre) de las computadoras de origen y de destino. En algunos casos puede ser necesario incluir el nombre de usuario con el que nos conectaremos al sistema (si el nombre del usuario es el mismo en ambas computadoras suele tomarlo por defecto; en algunos casos, puede que el programa nos lo pregunte). Para indicar el nombre de usuario en la dirección de la computadora, se suele poner delante con una arroba @. Ejemplos: "perejil.ugr.es", "250.129.4.97", o "antonio@192.168.2.2".
"origen" es la carpeta original que queremos copiar.
"destino" es la carpeta donde queremos poner una copia de origen.
Como siempre la carpeta la podemos indicar de forma absoluta o relativa (/home/antonio/miCarpetaOrigen o miCarpetaOrigen respectivamente). Las ordenes remotas suelen tomar como base para las direcciones relativas el home del usuario, las ordenes locales la carpeta actual. Programas usados
Todos los programas usados son estandares y vienen con la mayoria de las distribuciones de GNU/Linux. En Debian los puedes instalar todos con (aunque muchos ya estaran probablemente instalados por defecto):
apt-get nautilus file-roller tar rsync drsync cvs subversion
Otras consideraciones
En las copias a traves de la red, las ordenes de ejemplo utilizan la maxima compresión posible para aprovechar al máximo el ancho de banda. Si tenemos canales de comunicación muy rápidos puede ser más rápido eliminar la compresión, porque el tiempo de compresión puede ser mayor que el de envio.





