Sincronizar carpetas y archivos entre dos macs usando rsync
Desde hace un tiempo me pasé completamente a Mac. Aunque para ser totalmente sincero, me pasé a OS-X ya que una de mis «mac» es una Hackintosh, es decir, una PC a la que se le instaló el OS-X. Todo funciona perfecto en la Hackintosh y hasta mejor que mi MacBook White. En la oficina también me dieron una MacBook, así que ya no estoy usando Windows, ni Ubuntu, ni nada que no sea OS-X. Las cosas son más lindas en una Mac, o en una pc disfrazada de Mac. El único «problema» que he tenido es que al trabajar cosas en mi Laptop, estas no estaban después en la Desktop y así de la misma manera cuando trabajaba en la Desktop. Entonces decidí aprender como hacer para que se sincronicen estas dos computadoras primero manualmente, en lo que termino de organizar las cosas, y luego automatizando la tarea, así que me imagino que esta no será la última vez que escriba de esto.
Debo indicar que durante mi búsqueda, he encontrado varias formas que pasan por Dropbox, y el uso de aplicaciones de terceros. Yo me decidí por rsync porque es un comando que uso mucho, además porque no tengo que instalar nada adicional y porque me permite una evolución y aprendizaje del comando.
rsync -rtv Origen/ Destino/
r recursivo
t mantiene fecha de modificación
v verbose
Inicialmente debemos activar en «preferencias de sistema > compartir» el check en «Sesión remota» o «Remote login» para permitir el acceso.
Yo hice mis primeras pruebas con la ip de los equipos y funcionó perfecto, luego descubrí que en «preferencias de sistema > compartir» también aparecía el nombre de red del equipo en mi caso Mac-Pro.local y pude usar este nombre para poder hacer un script sync.sh que contenga los comandos que deseaba ejecutar y sin preocuparme por la ip dinámica de mis equipos.
El proceso
Lo que voy a hacer es lo siguiente, sincronizaré algunas carpetas (Downloads, Documents, Wip, etc) entre la MacBook y la MacPro. Como la MacPro tiene los discos más grandes, entonces primero solo copiaré desde la MacBook todo lo que haya recolectado estos dos años hacia la MacPro.
rsync -rtv /Users/username/Desktop/ username@192.168.1.100:/Users/username/Desktop/
rsync -rtv /Users/username/Documents/ username@192.168.1.100:/Users/username/Documents/
rsync -rtv /Users/username/Downloads/ username@192.168.1.100:/Users/username/Downloads/
rsync -rtv /Users/username/Wip/ username@192.168.1.100:/Users/username/Wip/
O también:
rsync -rtvl /Users/username/Desktop/ username@Mac-Pro.local:/Users/username/Desktop/
rsync -rtv /Users/username/Documents/ username@Mac-Pro.local:/Users/username/Documents/
rsync -rtv /Users/username/Downloads/ username@Mac-Pro.local:/Users/username/Downloads/
rsync -rtv /Users/username/Wip/ username@Mac-Pro.local:/Users/username/Wip/
*No olvidar reemplazar username con su nombre de usuario de cada equipo
De esta manera tendré «toda» la información en la MacPro. Una vez ahí, ordenaré los contenidos en su lugar del disco de respaldo «Storage» con lo cual dejaré en las carpetas sincronizadas solamente la información necesaria y que esté usando en este momento, para luego hacer una sincronización de este estado hacia la MacBook liberando espacio en la misma. Aún no he llegado a esta parte, ahora pienso hacerlo con Rsync invirtiendo los equipos de origen y destino, aunque también puede ser que me anime a probar Unison
A partir de este momento, realizaré sincronizaciones en dos sentidos, primero manual, y luego automáticas (cuando descubra cómo hacerlo) al conectarse ambas en la misma red.
Editado 2013 04 03
Unison
Leyendo sobre Rsync he descubierto que no es recomendable realizar la sincronización en ambos sentidos, y todos coinciden que Unison es una buena alternativa para esto. En las pruebas que realicé con Rsync, no conseguí el resultado que esperaba con los archivos eliminados, ya que al ser en doble sentido, siempre terminaba copiando nuevamente los archivos al equipo donde los había eliminado en lugar de eliminarlos del equipo réplica. Por estas razones completé el procedimiento con Unison.
La instalación es de lo más común, solamente que para instalar las instrucciones para el terminal hay que haciendo desde la misma aplicación.
Una vez instalado, solo es necesario indicarle los directorios que se desea sincronizar:
unison directorio1 directorio2 -parámetros
El script que usé es más o menos así:
unison /Volumes/Data/usuario/Desktop ssh://usuario@macbook.local/Desktop -ui text -batch
lo que es igual a:
unison /Volumes/Data/usuario/Desktop ssh://usuario@192.168.1.103/Desktop -ui text -batch
El parámetro -ui text sirve para indicarle que utilice la interfaz de texto, y el parámetro -batch sirve para que realice el procedimiento sin preguntas de confirmación. Hay otros parámetros del aplicativo que aún no he probado pero que seguramente estaré comentando más adelante.
Detectando si el equipo está en la red
Una de las cosas que pretendo lograr es que mi MacPro detecte cuando la MacBook se encuentra en la misma red y haga la sincronización de las carpetas. Para esto, la forma que encontré se basa en un pequeño script para hacerle ping al equipo, y procesar la respuesta:
#!/bin/bash
echo "begin ping"
ping -c 1 -t 1 sergios-macbook.local > /dev/null 2> /dev/null;
if [ $? -eq 0 ]; then
echo "ip is up";
else
echo "ip is down";
fi
Los parámetros adicionales al comando ping sirven para que no muestre la salida en la ventana del terminal.
Una vez detectado el equipo puedo indicarle que haga la sincronización:
#!/bin/bash
echo "begin ping"
ping -c 1 -t 1 sergios-macbook.local > /dev/null 2> /dev/null;
if [ $? -eq 0 ]; then
unison /Volumes/Data/usuario/Desktop ssh://sergio@macbook.local/Desktop -ui text -batch
else
echo "ip is down";
fi
Uno de los problemas que estoy tratando de solucionar se debe a la variable $LOCALHOSTNAME que Unison me pide ya que los equipos que estoy sincronizando no tienen ip fija. Aún estoy trabajando ene sta parte.
Crontab
El paso faltante es hacer que todo esto funcione solo, para esto crearé una tarea programada que se ejecute cada cierto tiempo (en mi caso cada 10 minutos) y realice la sincronización como si se tratara de un folder de Dropbox.
Lo primero será crear un archivo ejecutable conteniendo el script anterior para luego agregar la tarea al crontab usando el comando:
crontab -e
Debemos tener mucho cuidado al agregar la tarea, sobretodo con los separadores entre los parámetros, estos deben ser un salto de tabulador y no espacios en blanco, esto es muy importante así que cuidado al copiar cualquier código hacia esta sección.
La creación de la tarea depende de los siguientes parámetros:
Argument 1: Minute (0 - 59)
Argument 2: Hour (0 - 23)
Argument 3: Day of Month (1 - 31)
Argument 4: Month (1-12)
Argument 5: Day of Week (0 - 6) Sunday = 0
Argument 6: Command
Ejemplo:
#min hour mday month wday user command
*/10 * * * * root /home/sync.sh
Cada tarea es una línea nueva en el archivo crontab.
Guardamos el archivo. Cómo se abrió en vi, deberemos presionar la tecla escape y luego escribir:
:wq!
Listo! ya tenemos corriendo nuestro script :)
Referencias
A continuación dejo algunos artículos que leí mientras investigaba y algunas referencias útiles:
- How do I change my Mac’s name on the network?
- Synchronize two folders on a Mac with Automator and Rsync
- Two Macs and Keeping Things Together
- Using rsync to Keep Your Files in Sync
- How can I write a linux bash script, that tells me which computer are on in my LAN?
- Using the ‘cron’ scheduler
- Using Crontab with Mac OS X, Unix, and Linux
- Real time file synchronization like Dropbox via Unison
ser humano
Music & Design & Photo & Bike.
Test, fail, learn, repeat.
Excelente Post ..
Yo también migre a Mac este año y estoy muy feliz con el cambio , desgraciadamente en la oficina sigo usando Windows …
Yo para solucionar parcialmente el problema que tu mencionas uso Evernote , y me va genial , porque se syncroniza en todos mis dipositivos
Mi macbook pro de casa
Mi Laptop Windows del trabajo
Mi Smartphone Nexus con Android
Mi Tablet Nexus 7 con Android para las reuniones
Saludos!!
Cesar A.
Hola me gustaría saber un poco más acerca de este tema, acabo de comprar un macbook pro nuevo y quiero sincronizar unas carpetas que tenia en uno viejo que pretendo seguir usando; no me queda muy claro como usar el unison y si usando esta aplicación ya no se necesita usa rsync, cómo podría comunicarme contigo para tenerlo todo mucho más claro?, agradecería enormemente tu respuesta.
David, efectivamente usando Unison ya no es necesario hacerlo con Rsync.
Saludos,