Sincronización de archivos · 9 min read · Dec 06, 2025
Configuración de la sincronización de archivos Unison entre dos servidores en Debian 10 (Buster)

Este tutorial muestra cómo configurar la sincronización de archivos entre dos servidores Debian 10 con Unison. Unison es una herramienta de sincronización de archivos similar a rsync, la gran diferencia es que rastrea/sincroniza cambios en ambas direcciones, es decir, los archivos cambiados en server1 se replicarán en server2 y viceversa.
1 Nota Preliminar
En este tutorial usaré los siguientes dos servidores Debian:
- server1.example.com con la dirección IP 192.168.0.100
- server2.example.com con la dirección IP 192.168.0.101
Quiero sincronizar el directorio /var/www entre los dos servidores. Ejecutaré Unison como usuario root en este tutorial para que Unison tenga suficientes permisos para sincronizar los permisos de usuario y grupo.
Todos los comandos en este tutorial se ejecutan como usuario root. Inicie sesión en ambos servidores en la terminal como root y comience con el paso 2 “ Instalando Unison “.
2 Instalando Unison
server1/server2:
Unison debe ser instalado en server1 y server2; dado que nos conectamos desde server1 a server2 usando SSH, también necesitamos los paquetes SSH y voy a instalar el editor nano para la edición de archivos en la terminal. Esto se puede lograr de la siguiente manera:
apt-get -y install unison openssh-server ssh nano3 Creando un par de claves privada/pública en server1
server1:
Ahora creamos un par de claves privada/pública en server1.example.com:
ssh-keygen -t dsaroot@server1:~# ssh-keygen -t dsa
Generando par de claves dsa público/privado.
Ingrese el archivo en el que guardar la clave (/root/.ssh/id_dsa): <– ENTER
Directorio creado ’/root/.ssh’.
Ingrese la frase de pase (vacío para sin frase de pase): <– ENTER
Ingrese la misma frase de pase nuevamente: <– ENTER
Su identificación ha sido guardada en /root/.ssh/id_dsa.
Su clave pública ha sido guardada en /root/.ssh/id_dsa.pub.
La huella digital de la clave es:
ba:82:e1:a1:42:9b:d4:c8:99:c8:bd:8b:7d:4d:d4:66 root@server1
La imagen de arte aleatorio de la clave es:
+—[DSA 1024]—-+
| |
| |
| . |
| . E |
|+ * . S |
|.Ooo o |
|ooo+. + |
|oo=… o |
|.. oo.. |
+—————–+
root@server1:~#
Es importante que no ingrese una frase de pase, de lo contrario, el espejado no funcionará sin interacción humana, así que simplemente presione ENTER.
A continuación, copiamos nuestra clave pública a server2.example.com:
ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]# ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]La autenticidad del host '192.168.1.102 (192.168.0.101)' no se puede establecer.
La huella digital de la clave ECDSA es 2b:3c:35:ad:3d:e2:fc:16:2f:55:5c:e1:2c:d7:3d:a9.
¿Está seguro de que desea continuar conectándose (sí/no)? <-- sí (solo verá esto si es la primera vez que se conecta a server2)
/usr/bin/ssh-copy-id: INFO: intentando iniciar sesión con la(s) nueva(s) clave(s), para filtrar cualquier que ya esté instalada
/usr/bin/ssh-copy-id: INFO: 1 clave(s) permanecen para ser instaladas -- si se le solicita ahora es para instalar las nuevas claves
[email protected]'s password: <-- contraseña de root de server2Número de clave(s) añadidas: 1Ahora intente iniciar sesión en la máquina, con: "ssh '[email protected]'"
y verifique que solo se hayan agregado la(s) clave(s) que deseaba.Ahora verifique en server2 si la clave pública de server1 se ha transferido correctamente:
server2:
cat $HOME/.ssh/authorized_keysroot@server2:/home/administrator# cat $HOME/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAACBAKHLdAztIr8muZIlQYuE/4f75kmgTwWqJRZJ1dTqHDnHWsy48emDU8v85hxAPg43k9aF7/zAwpA0MNNNk5T9Tx/DyUkK/KcyVP2f4p8tvovrkUvoxsZACkTUmFqKdq2x6/AGfjsCRmkpLhZuad7r5rKEXHRh8KYGHqD1Id8wcpy5AAAAFQCww3OekKcKMshMAwBK3XQmmYEGUwAAAIEAgjztlwh8OFYxwQve/RrhI2sceCXwS/yjQyH7q0zdWB9Fr4s/16T2PLBT+7M3vb+JlPDO3JRqgaYbel1kS2F2iKrY0EX0FI3/9fVDfWoz3mhCscPLriqy5AcsHitxQNfiZgA5wDiSjWpk1v+FbIC+VuqbKdQuE4MBKj19N9YALIUAAACABQ4NDsa2UBc8jsxvghjoLhUWF7HChaCksXQcL6i98VNRcemtPC6wpIri75iR4Uhv1666bDOBAdmIBX9Qf7A/+czPKPaj4CGI1hVy1pgYMa3btnEvoSnH/ONtjpOz9q+3up1OOOn+5fud7xjJn+Fq8WoGROgarBpCbQU3w2GUUnM= root@server14 Ejecutando Unison
server1:
Ahora podemos ejecutar Unison por primera vez para sincronizar el directorio /var/www en ambos servidores. En server1 ejecute:
unison /var/www ssh://192.168.0.101//var/wwwLa salida será similar a esta - es posible que tenga que responder algunas preguntas ya que es la primera vez que se ejecuta Unison:
root@server1:/var/www# unison /var/www ssh://192.168.0.101//var/www
Contactando al servidor...
Conectado [//server1//var/www -> //server2//var/www]
Buscando cambios
Advertencia: No se encontraron archivos de archivo para estas raíces, cuyos nombres canónicos son:
/var/www
//server2//var/www
Esto puede suceder porque esta es la primera vez que ha sincronizado estas raíces,
o porque ha actualizado Unison a una nueva versión con un formato de archivo diferente.La detección de actualizaciones puede tardar un tiempo en esta ejecución si los réplicas son
grandes.Unison asumirá que el 'último estado sincronizado' de ambas réplicas
fue completamente vacío. Esto significa que cualquier archivo que sea diferente
se informará como conflictos, y cualquier archivo que exista solo en una
réplica se considerará nuevo y se propagará a la otra réplica.
Si las dos réplicas son idénticas, no se informarán cambios.Si ve este mensaje repetidamente, puede ser porque una de sus máquinas
está obteniendo su dirección de DHCP, lo que está causando que su nombre de host cambie
entre sincronizaciones. Consulte la documentación para la variable de entorno UNISONLOCALHOSTNAME
para obtener consejos sobre cómo corregir esto.Las donaciones al proyecto Unison son aceptadas con gratitud:
http://www.cis.upenn.edu/~bcpierce/unisonPresione return para continuar.[] <-- Presione Enter Esperando cambios del servidor
Reconciliando cambiosservidor local2
dir ----> example.com [f] <-- Presione Enter
dir ----> example.de [f] <-- Presione Enter¿Proceder con la propagación de actualizaciones? [] <-- Ingrese "y"
Propagando actualizaciones
UNISON 2.48.4 comenzó a propagar cambios a las 13:24:01.10 el 05 de mayo de 2020
[BGN] Copiando example.com de /var/www a //server2//var/www
[BGN] Copiando example.de de /var/www a //server2//var/www
Acceso directo: copiado /var/www/example.de/web/index.html desde el archivo local /var/www/.unison.example.com.d3783bddaaf59b9ba4d2ed0433f9db63.unison.tmp/web/index.html
[END] Copiando example.de
[END] Copiando example.com
UNISON 2.48.4 terminó de propagar cambios a las 13:24:01.98 el 05 de mayo de 2020
Guardando estado del sincronizador
Sincronización completa a las 13:24:01 (2 elementos transferidos, 0 omitidos, 0 fallidos)Verifique el directorio /var/www en server1 y server2 ahora, y debería encontrar que están sincronizados.
Por supuesto, no queremos ejecutar Unison de forma interactiva, por lo tanto, podemos crear un archivo de preferencias ( /root/.unison/default.prf) que contenga todas las configuraciones que de otro modo tendríamos que especificar en la línea de comandos:
nano /root/.unison/default.prf# Raíces de la sincronización
root = /var/www
root = ssh://192.168.0.101//var/www
# Rutas a sincronizar
#path = current
#path = common
#path = .netscape/bookmarks.html
# Algunas expresiones regulares que especifican nombres y rutas a ignorar
#ignore = Path stats ## ignora /var/www/stats
#ignore = Path stats/* ## ignora /var/www/stats/*
#ignore = Path */stats ## ignora /var/www/somedir/stats, pero no /var/www/a/b/c/stats
#ignore = Name *stats ## ignora todos los archivos/directorios que terminan con "stats"
#ignore = Name stats* ## ignora todos los archivos/directorios que comienzan con "stats"
#ignore = Name *.tmp ## ignora todos los archivos con la extensión .tmp
# Cuando se establece en verdadero, esta bandera hace que la interfaz de usuario omita
# preguntar confirmaciones sobre cambios no conflictivos. (Más
# precisamente, cuando la interfaz de usuario ha terminado de establecer la
# dirección de propagación para una entrada y está a punto de pasar a la
# siguiente, omitirá todas las entradas no conflictivas y pasará
# directamente al siguiente conflicto.)
auto=true
# Cuando esto se establece en verdadero, la interfaz de usuario no hará
# preguntas en absoluto. Los cambios no conflictivos se propagarán;
# los conflictos se omitirán.
batch=true
# !Cuando esto se establece en verdadero, Unison solicitará una confirmación extra
# si parece que toda la réplica ha sido eliminada, antes de propagar el cambio. Si la bandera de lote
# también está establecida, la sincronización se abortará. Cuando se utiliza la preferencia de ruta
# se solicitará la misma confirmación para las rutas de nivel superior. (En este momento, esta bandera solo afecta a la
# interfaz de usuario de texto.) Consulte también la preferencia de punto de montaje.
confirmbigdel=true
# Cuando esta preferencia se establece en verdadero, Unison utilizará el
# tiempo de modificación y la longitud de un archivo como un `número de inode pseudo`
# al escanear réplicas en busca de actualizaciones, en lugar de leer
# el contenido completo de cada archivo. En Windows, esto puede causar
# que Unison no propague una actualización si el tiempo de modificación
# y la longitud del archivo no se han cambiado por la actualización.
# Sin embargo, Unison nunca sobrescribirá tal actualización con un
# cambio de la otra réplica, ya que siempre realiza una verificación segura
# de actualizaciones justo antes de propagar un cambio. Por lo tanto, es
# razonable usar este interruptor en Windows la mayor parte del tiempo
# y ocasionalmente ejecutar Unison una vez con fastcheck establecido en falso,
# si le preocupa que Unison haya pasado por alto una actualización.
# El valor predeterminado de la preferencia es auto, lo que hace que
# Unison utilice comprobaciones rápidas en réplicas de Unix (donde es seguro)
# y comprobaciones lentas en réplicas de Windows. Para compatibilidad
# hacia atrás, sí, no y predeterminado se pueden usar en lugar de
# verdadero, falso y automático. Consulte la sección "Comprobación Rápida" para más
# información.
fastcheck=true
# Cuando esta bandera se establece en verdadero, los atributos de grupo de los
# archivos se sincronizan. Si se sincronizan los nombres de grupo o los identificadores de grupo
# depende de la preferencia numerids.
group=true
# Cuando esta bandera se establece en verdadero, los atributos de propietario de los
# archivos se sincronizan. Si se sincronizan los nombres de propietario o los identificadores de propietario
# depende de la preferencia extttnumerids.
owner=true
# Incluir la preferencia -prefer root hace que Unison siempre
# resuelva conflictos a favor de root, en lugar de pedir orientación al
# usuario. (La sintaxis de root es la misma que para la preferencia de
# root, más los valores especiales newer y older.)
# Esta preferencia se anula por la preferencia preferpartial.
# Esta preferencia solo debe usarse si está seguro de que sabe
# lo que está haciendo!
prefer=newer
# Cuando esta preferencia se establece en verdadero, la interfaz de usuario
# de texto no imprimirá nada en absoluto, excepto en caso de errores.
# Establecer silent en verdadero automáticamente establece la preferencia de lote
# en verdadero.
silent=true
# Cuando esta bandera se establece en verdadero, los tiempos de modificación de archivos (pero no
# los tiempos de modificación de directorios) se propagan.
times=trueLos comentarios deberían hacer que el archivo sea autoexplicativo, excepto para las directivas de ruta. Si no especifica directivas de ruta, entonces los directorios en las directivas raíz se sincronizarán. Si especifica directivas de ruta, entonces las rutas son relativas a la ruta raíz (por ejemplo, root = /var/www y path = current se traduce a /var/www/current), y solo se sincronizarán estos subdirectorios, no todo el directorio especificado en la directiva raíz.
Puede encontrar más información sobre las opciones disponibles consultando la página del manual de Unison:
man unisonAhora que hemos puesto todas las configuraciones en un archivo de preferencias (especialmente las directivas raíz (y opcionalmente la ruta)), podemos ejecutar Unison sin ningún argumento:
unison5 Creando un trabajo Cron para Unison
server1:
Queremos automatizar la sincronización, por eso creamos un trabajo cron para ello en server1.example.com:
crontab -e*/5 * * * * /usr/bin/unison &> /dev/nullEsto ejecutaría Unison cada 5 minutos; ajústelo a sus necesidades (ver
man 5 crontab). Uso la ruta completa a unison aquí ( /usr/bin/unison) solo para asegurarme de que cron sepa dónde encontrar unison. La ubicación de su unison puede diferir. Ejecute
which unisonpara averiguar dónde está el suyo.
6 Probar Unison
Ahora probaré la sincronización bidireccional de Unison para ver si la configuración está completamente funcionando.
Ejecute el siguiente comando en server1 para crear un archivo de prueba con el contenido “Test 1”:
Server1
echo "Test 1" > /var/www/test.txtAhora espere al menos 5 minutos (ya que creamos un trabajo cron que se ejecuta una vez cada 5 minutos). Luego ejecute en server2:
cat /var/www/test.txtpara mostrar el contenido del archivo test.txt en la pantalla. La salida debería ser similar a esta captura de pantalla.

Ahora ejecute este comando en server2 que actualiza el contenido de nuestro archivo de prueba a “Test 2”:
Server2
echo "Test 2" > /var/www/test.txtY espere al menos 5 minutos. Luego ejecute el comando cat en server1:
Server1
cat /var/www/test.txtLa salida debería ser:

7 Enlaces
- Unison: http://www.cis.upenn.edu/~bcpierce/unison/
- Debian: http://www.debian.org/
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.