5/04/08

Rsync 3 bajo Windows

Como ya sabéis los que hayáis leido posts anteriores de este blog utilizo mucho rsync para realizar copias de seguridad de manera remota a través de Internet (y también red local, por qué no) dado su alta eficiencia. Normalmente dichas copias de seguridad las realizo entre equipos corriendo sobre una versión u otra de Linux y todo funciona de maravilla. Sin embargo un par de las copias que hago son de estaciones de trabajo Windows utilizando el mismo rsync como servicio que incluye el paquete backuppc.

El problema viene con la gestión de los juegos de carácteres de los nombres de los ficheros. Al hacer la copia entre un Windows (cp1252) y un Linux (UTF-8 en mi caso) los nombres de los ficheros se corrompen. El contenido por supuesto siempre es tratado de manera binaria y por tanto es perfectamente correcto. Como tampoco había ninguna solución durante este tiempo simplemente me he "aguantado" y si tenia que recuperar algo pues lo hacía con los nombres mal (aunque yo personalmente nunca utilizo carácteres fuera del ascii básico precisamente por este tipo de cosas).

Recientemente el grupo de trabajo de Samba ha sacado la versión 3 de rsync que incorpora jugosas novedades entre las que destaca (en este caso) el soporte de la libreria iconv para convertir los nombres de ficheros entre juegos de carácteres. Así que me he armado de valor para intentar compilar e instalar como servicio Windows un software diseñado para Linux.

Ha resultado ser sorprendentemente fácil. Con cygwin por supuesto. Primero he eliminado el anterior servicio rsyncd basado en el paquete que viene con backuppc. He instalado cygwin junto con algunos paquetes extras necesarios para compilar el paquete (gcc, libiconv, make, cygrunsrv). He descargado, compilado e instalado el paquete rsync que ha funcionado de manera sorprendentemente fluida y sin errores (para ser un entorno un poco "delicado" como cygwin). Lo he instalado como servicio mediante la utilidad cygrunsrv y finalmente he conseguido sincronizar los datos para la copia de seguridad contra un Debian Lenny (testing) ejecutando rsync 3.0.0 y manteniendo correctamente todas las eñes, vocales acentuadas y demás engendros diabólicos.

Comentar tan sólo algunos problemas encontrados:
  • Hay que ir con cuidado al compilar rsync 3 porque realmente no requiere la libreria libiconv pero si no la encuentra simplemente lo compila sin soporte para esa característica.
  • Quizás es un problema de cygwin o de la versión de rsync 3 o simplemente de compatibilidad con Windows pero la configuración por defecto del rsyncd que incluye un fichero pid donde almacena el identificador del proceso del daemon no me funciona. Al cerrar el equipo no borra el fichero y al siguiente arranque el servicio no arranca alegando que ya existe el fichero. Quitando la opción para que no utilice el fichero lo soluciona.
  • La versión 3.0.0 de rsync tiene un bug que impide en ciertos casos que se transfiera correctamente el nombre de un fichero deteniendo toda la transferencia. En la versión 3.0.1 ya está corregida. Yo mismo detecté el error y lo transmití a la lista de distribución de rsync donde, de manera muy rápida y eficiente, Wayne Davison corrigió el error. Desde aquí (aunque no lo vaya a leer), gracias Wayne!