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!Actualización 29/10/2008:

Permitidme actualizar esta entrada con algunos detalles más tras cierto tiempo y otra instalación en un nuevo equipo.

De momento comentar que ya no es necesario compilar rsync porque cygwin ya trae la versión 3. Así que un problema menos. Por otro lado la configuración para ejecutar como servicio un rsync en modo daemon tiene algunos detalles interesantes, cortesía por supuesto del Windows.

Lo que único prueba primero para crear dicho servicio es editar un fichero rsyncd.conf con los datos pertinentes. Si el fichero está bajo /etc el siguiente paso para ejecutar el servicio es tan sólo rsync --daemon.

De hecho, ejecutando el servicio manualmente de esta manera funciona perfectamente. Tras esta comprobación el siguiente paso es conseguir asociar el arranque de rsync como servicio Windows. Para ello utilizo la herramienta cygrunsrv con la siguiente línea de comandos básica:

cygrunsrv -I rsyncd -p /usr/bin/rsync -a "--daemon --no-detach"

Sin embargo al intentar arrancar el servicio no funciona. Tras varias horas de investigación bastante penosa ya que Windows no proporciona ningún mensaje de error coherente logro descubrir que el problema está en los permisos del usuario que por defecto ejecuta el servicio (SYSTEM). Doy permiso a este usuario a los ficheros necesarios (básicamente acceso al fichero de configuración, logs, etc.) y ya funciona correctamente.