Copia de seguridad sincronizada de tu biblioteca de iTunes

26/12/2012 por Carlos Burges

Si tienes una biblioteca de iTunes muy grande, como me ocurre a mi, las copias de seguridad son una tarea titánica. La posibilidad de añadir simplemente la biblioteca al esquema de copia de Time Machine es una posibilidad, pero prefiero mantener ambas copias separadas porque las modificaciones a la biblioteca de iTunes no son ni continuas ni muy grandes y los más de 400 GB son un exceso y engordan en demasía (además de disminuir la vida útil) la copia de seguridad de Time Machine. Así que la opción es sincronizar la biblioteca que uso con la copia de seguridad para que los cambios realizados no supongan la copia entera de la biblioteca una y otra vez.

La solución viene incluida el el sistema y se llama rsync.

rsync es una aplicación libre para sistemas de tipo Unix y Microsoft Windows que ofrece transmisión eficiente de datos incrementales, que opera también con datos comprimidos y cifrados. Mediante una técnica de delta encoding, permite sincronizar archivos y directorios entre dos máquinas de una red o entre dos ubicaciones en una misma máquina, minimizando el volumen de datos transferidos.

rsync viene incluido en OS X y se gestiona desde el Terminal (aunque hay algunas aplicaciones que añaden un interfaz a esta aplicación).

El proceso de sincronización es relativamente sencillo: necesitas una biblioteca de origen y una ubicación de destino para la sincronización. La sincronización es siempre en un sentido.

La sintaxis para esta tarea es sencilla:

rsync [opciones] [origen] [destino]

Entre las opciones que vamos a utilizar para esta tarea son:

  • -av: -a básicamente indica que se sincronice todo de forma recursiva y preserve ciertos datos como la fecha de modificación. -v es para el modo verbose que te permitirá recibir más información en el archivo de resultados (log).
  • --force previene que tengas que confirmar los posibles cambios
  • --delete: si algo se elimina en la fuente, se borrará también en el destino
  • --size-only: obvia los archivos que tienen el mismo tamaño.

Todo empieza con una primera sincronización: borra tu actual copia de seguridad de la biblioteca de iTunes (la vamos a sustituir por una copia sincronizada) y luego abriremos el Terminal, en Aplicaciones > Utilidades y ejecutaremos el siguiente comando:

rsync -av --force --delete --size-only [origen] [destino]

Donde [origen] será la biblioteca de iTunes que estás usando y [destino] será la ubicación donde se hará la copia de seguridad separadas ambas ubicaciones por un espacio en blanco. Lo más sencillo para sacar ambas rutas es arrastrar las correspondientes carpetas al Terminal y que el se encargue.

Así, un ejemplo de este comando con sus rutas colocadas sería:

rsync -av --force --delete --size-only /Volumes/Enterprise/iTunes\ 1 /Volumes/April/Music

Esas "\ " corresponden, por cierto, a los espacios en los nombres: se añaden así con una barra invertida y un espacio en blanco después.

Adicionalmente puedes añadir un archivo de control (un log) para ver que está ocurriendo o que ha ocurrido durante la sincronización. Esta opción se añade al comando indicando una ubicación y el nombre del archivo y su extensión. Un ejemplo sobre el comando de ejemplo sería:

rsync -av --force --delete --size-only /Volumes/Enterprise/iTunes\ 1 /Volumes/April/Music > ~/Documents/SincronizacioniTunes.log

La primera sincronización llevará su tiempo, así que no cierres la ventana del Terminal hasta que te vuelva a aparecer el prompt del sistema ($tu_usuario).

Uno de los problemas que te puedes encontrar a la hora de realizar esta sincronización es que tengas problemas con los permisos de la carpeta original y que además, una reparación de los mismos no te resuelva el problema. La opción más sencilla para forzar la sincronización es utilizar sudo en el inicio del comando.

sudo rsync -av --force --delete --size-only /Volumes/Enterprise/iTunes\ 1 /Volumes/April/Music > ~/Documents/SincronizacioniTunes.log

Recuerda también que todos los comandos del Terminal van en una única línea.

Te pedirá, por supuesto, la contraseña del administrador. En el archivo de log puedes ver a tiempo real como se van realizando la copia de los archivos. De nuevo, recuerda no cerrar la ventana del Terminal hasta que acabe el proceso o lo interrumpirás.

El archivo final que recibirás será una copia de seguridad exacta, incremental de los contenidos de la biblioteca original de iTunes.

Al acceder a la sincronización de seguridad que acabas de realizar (la primera sincronización lleva su tiempo, varias horas en función del tamaño de la biblioteca) puedes encontrarte que no tienes permisos para acceder a ella. Simplemente solicita la información de la carpeta, añade el usuario y los correspondientes permisos de lectura y escritura y aplica recursivamente los permisos. Este paso es importante porque sin acceso a la copia, en futuras sincronizaciones rsync creará un nuevo volumen y se comerá literalmente tu disco de arranque.

2
Comentarios
  • #1 por rafa espada el 26/12/2012
    Antes utilizaba esto para enviar la música al NAS con DAAP.

    Si esta va a ser tu copia de seguridad yo quitaría la opción de --delete, prefiero tener canciones duplicadas que borradas.

    Respecto a no utilizar TimeMachine yo de vez en cuando (una vez al año) borro la carpeta de iTunes de Time Machine para que la genere de nuevo entera.

    i_NPlA73AM3j.png
  • #2 por Carlos Burges el 26/12/2012
    #1 yo no puedo mezclar mi biblioteca de iTunes con Time Machine. Va camino ya de los 400 GB y sería un dispendio inútil de espacio muerto en disco. No me queda otro remedio que tener la copia aparte.

    La pena es que Time Machine no tenga opciones avanzadas para poder crear esquemas de copia de seguridad por carpetas hacia unidades. Ya sería la leche.
  • #3 por Oscar Guitart Garcia el 26/12/2012
    ¿Serviría este comando para la biblioteca de Aperture?
  • #4 por rafa espada el 26/12/2012
    #3 sí, sirve para cualquier cosa que quieras copiar. Aunque Aperture tiene sus baúles, creo son más adecuados.
  • #5 por superlativo el 26/12/2012
    Muchas gracias por el artículo. He usado rsync en local de un disco a otro y es una pasada pero lo he intentado con el NAS y es obligatorio tener la carpeta (disco) para la copia montado. Supongo que se puede así que os propongo un futuro artículo. Cómo crear un script que realize esta tarea automática a un NAS o servidor en la nuve. Por ejemplo, que cada dia realize la conexión al NAS/servidor mediante login/password y realize la copia con rsync.

    Saludos y felices fiestas a tod@s!
  • #6 por Carlos Burges el 26/12/2012
    #5 mañana lo tienes. Es MUY fácil.
  • #7 por superlativo el 26/12/2012
    Hombre era una propuesta, no lo pedía para ya y menos en estos días de estar para aquí y para allá en família. Pero mil gracias Carlos! Es que lo he probado y si la carpeta compartida del NAS no está montada me da error, no se como darle el login para que lo monte si en el momento de hacer la copia no está montado y yo no estoy delante. Además esto de las copias si no es todo automatizado pasan los dias sinó semanas y no haces backups, por eso Time Machine aunque sólo lo uso como una cosa más pero no única como backup ha triunfado porque la gente que pasaba de backups o que nunca había pensado hacerlas con TM era enchufar y listo. La gracia de rsync es la rapidez de las copias una vez está hecha la primera. Yo hasta esta guía ; ) usaba iBackup que tiene la opción de activar rsync y la verdad que estoy muy contento pero esto de usarlo via Terminal el Mac ni se despeina, en cambio al iBackup le cuesta y hay momentos que no sabes si está vivo o muerto. He mirado "man rsync" y con -vv estás informado en todo momento del proceso, y si todavía quieres más -vvv.

    Saludos y gracias faq-mac!
  • #8 por Alquimista el 27/12/2012
    Al comparar un archivo .mp3 con otro igual pero .m4a los considerará como archivos diferentes, ¿no? ¿Se podría evitar?
    Tengo recodificados casi todos mis CDs a AppleLossless, el problema ahora es añadir todo lo que tengo en la biblioteca original y que no esté recodificado; no se me ocurre otra forma que no sea a mano, artista por artista, álbum por álbum...
  • #9 por Carlos Burges el 27/12/2012
    #8 Si, los va a considerar diferentes. Ten en cuenta que usando rsync el primer paso es crear una copia exacta de la biblioteca actual y después, sincronizarla.
  • #11 por superlativo el 27/12/2012
    A Alquimista decirle que hay opciones para excluir carpetas y archivos: http://juanchorossi.com/cmo-excluir-carpetas-archivos-con-rsync/ lo que no se como excluir un conjunto de archivos como es su caso, un conjunto de archivos de la misma extensión.

    Sigo con las pruebas en local antes de saltar a la copias en el NAS, pero es que quiero entender rsync y sobre todo comprobar que actua correctamente.

    Tras la primera copia, aparentemente todo perfecto. Procedo a la segunda y me encuentro con este error marcado en negrita:
    Mac-Pro:~ user$ rsync -avvt /Volumes/Feines/FEINES\ DAVID /Volumes/WD2TB/Feines
    building file list ...
    done
    delta-transmission disabled for local transfer or --whole-file
    ...

    y a continuación un listado con aparentemente todos los directorios/ficheros con un "is uptodate" que entiendo que me informa de que ya estaba actualizado. No le daría importancia si no fuera por el error final (marcado en negrita):

    total: matches=0 hash_hits=0 false_alarms=0 data=1967983
    sent 2656470 bytes received 134700 bytes 26456.59 bytes/sec
    total size is 66421323611 speedup is 23796.95
    rsync error: some files could not be transferred (code 23) at /SourceCache/rsync/rsync-42/rsync/main.c(992) [sender=2.6.9]

    Una segunda vez:
    sent 3341907 bytes received 134700 bytes 34593.10 bytes/sec
    total size is 66421323611 speedup is 19105.21

    Una tercera vez:
    sent 2656470 bytes received 134700 bytes 28336.75 bytes/sec
    total size is 66421323611 speedup is 23796.95

    Y una cuarta:
    sent 3341907 bytes received 134700 bytes 34940.77 bytes/sec
    total size is 66421323611 speedup is 19105.21

    1. ¿Por qué esa diferencia entre sent y received? ¿no deberían ser iguales si están sicronizados?
    2. ¿Por qué los sent son diferentes y coinciden de manera alterna? Esto si que me tiene loco.
    3.¿Y total size que también es diferente a que suma corresponde, que no coincide con lo enviado a que total se refiere?

    Perdonen el tocho pero ¿alguien me podría explicarme estas dudas?

    Muchas gracias y felices fiestas!
  • #12 por bladerunner el 28/12/2012
    Superlativo,

    Voy a intentar responder a tus preguntas. Lo primero que tienes que saber es que rsync es una herramienta portada a OS X, como muchos otros comandos Unix.

    La version incluida con el sistema operativo es bastante antigua (la version 2.6.9 del 2006). La version actual es la 3.0.9. Esto se debe a que desde la version 3.0 rsync usa la licencia GPL3, y Apple nunca va a incluir ninguna aplicacion que la use.

    Hay maneras para instalar una version mas reciente, ya sea a través de proyectos como MacPorts o descargando las fuentes de rsync.samba.org. Lo importante sobre este asunto es que ciertos aspectos de los archivos en OS X no pueden ser tratados correctamente por la versión 2.6.9. De memoria, te puedo decir que las ACLs no están soportadas hasta la versión 3.0. Por eso, si los archivos que estas copiando tienen ACLs, usando la versión incluida con el sistema operativo, no se van a replicar. Hay otro punto especifico a OS X, pero no me acuerdo ahora (creo que son los atributos extendidos).

    El error que estas viendo esta seguramente causado por ese aspecto. En muchos casos no debería de ser un problema si lo que estas copiando es tu librería de música. En mi caso, normalmente uso rsync para replicar sistemas de archivos en las decenas de terabytes, con distintos usuarios y permisos, por eso si que me es importante que replique esta información correctamente.

    Un último aspecto que me parece importante para entender que significan los números que estas viendo es que cuando tu ejecutas rsync desde un sistema se desdoblara en tres procesos. Puedes ver esto en "Monitor de Actividad". Sin entrar en mas detalles tienes al menos un proceso de envío y otro de escucha para cada transferencia. Por lo general si estas enviando del sistema A al sistema B, lo que tendrás es al sistema B generando una lista de archivos que enviará al sistema A. En base a esta lista, el sistema A enviará los cambios que detecte, esto es, solo va sincronizar archivos que cumplan con las características indicadas por el comando. En el ejemplo que han puesto arriba, copiara archivos que hayan tenido alguna actualización desde la última sincronización, aunque no copiará archivos que puedan haber sido alterados en su contenido si su fecha y tamaño sigue siendo el mismo.


    Entendiendo esto, sobre los mensajes que indicas:

    "total: matches=0 hash_hits=0 false_alarms=0 data=1967983
    sent 2656470 bytes received 134700 bytes 26456.59 bytes/sec
    total size is 66421323611 speedup is 23796.95"

    Sent indica cuantos datos han sido enviados, en tu caso ha mandado 2656470 bytes. Esto es, desde que sincronizaste por última vez se han modificado 2656470 bytes de un total de 66421323611 bytes. El speedup de 23796.95 indica que la actualización ha sido 23796.95 veces mas rápida que si hubieses tenido que copiar todos los archivos. Recuerda que el objetivo de rsync es copiar la menor cantidad de datos. Si no no sería eficiente, y por ello solo esta copiando aquello que necesita ser actualizado, en base de los parámetros que le hayas introducido.

    Fíjate en el resto de resultados:

    "sent 3341907 bytes received 134700 bytes 34593.10 bytes/sec
    total size is 66421323611 speedup is 19105.21"

    "sent 2656470 bytes received 134700 bytes 28336.75 bytes/sec
    total size is 66421323611 speedup is 23796.95"

    "sent 3341907 bytes received 134700 bytes 34940.77 bytes/sec
    total size is 66421323611 speedup is 19105.21"

    Todos ellos coinciden en dos aspectos, el tamaño total de datos (66421323611 bytes) y en el tamaño de la lista enviada (134700 bytes). Pero cada vez, transmite un numero de datos distintos, eso es porque cada vez necesita copiar archivos distintos, aunque viendo que algunos de los tamaños se repiten seguramente deben de ser los mismos archivos (la base de datos que marca cuantas veces has oído cada canción, por ejemplo).

    Como la versión que estás usando es antigua copia todo el archivo. Creo que la nueva versión puede copiar bloques de datos (o sea, que si un archivo de 500MB se ha modificado solo enviaría los bloques o secciones que se han actualizado, en lugar de enviarte todo el archivo). Hay opciones por ejemplo para guardar archivos a mitad de transmisión, por si estas haciendo copias a través de una red que se pueda caer y los archivos son grandes (--partial).

    Para comprobar si te sigue diciendo que algunos archivos no pudieron ser transferidos por problemas de permisos puedes probar a ejecutar rsync con sudo delante (por ejemplo, 'sudo rsync -av --force --delete --size-only /Volumes/Enterprise/iTunes\ 1 /Volumes/April/Music')

    Hay otras opciones que lo mismo te interesan y que puedes utilizar:

    --progress (te da datos sobre la transferencia, cuantos archivos ha transferido y cuantos le quedan)

    --human-readable (te da los datos en MB en lugar de bytes)

    --dry-run (no ejecuta la copia, te dará información sobre que archivos habría copiado tal y como si lo hiciese, pero sin modificar los archivos. Muy útil si estas probando comandos y quieres ver que pasaría antes)

    En mi opinión la versión incluida tiene varias limitaciones. La mayor para mi es que tiene que generar la lista antes de empezar la copia, cuando la versión 3.0 genera la lista al mismo tiempo, acelerando el inicio de la copia. No es un problema con unos pocos archivos, pero con cientos de miles o millones de archivos puede llevarte horas hasta que empiece la copia.

    Hay muchas mas cosas que se pueden configurar con rsync. Puedes por ejemplo usarlo para replicar una estructura de directorios, pero sin copiar los archivos contenidos. Puedes poner reglas para ignorar ciertos tipos de archivos. Puedes usar cifrado para transferir los datos, puedes usar llaves ssh para que la copia no requiera contraseña y que solo se permita ejecutar desde ciertos sistemas y por determinados usuarios. O por ejemplo para marcar que el sistema de inicio no pueda ser sobrescrito.

    rsync es una herramienta increíble. Hay mucha mas información en http://rsync.samba.org

    Espero no haber complicado la explicación y que te haya aclarado las preguntas que tenias.

    Saludos,
    david
  • #13 por digitalmaxima el 28/12/2012
    Están los comentarios en faq-mac y después, todos los demás. Gracias, Bladerunner.
  • #14 por Alquimista el 28/12/2012
    Caramba bladerunner, me has dejado sin palabras.
    Estudiando tus explicaciones sobre las dificultades de rsync para copiar correctamente los archivos he pensado: ¿y cómo se las apaña Carbon Copy Cloner? He buscador en encontrado la solución:
    Carbon Copy Cloner also includes, independently in binary form, rsync version 3.0.6. rsync is made available under the GNU General Public License. Per the license requirements, the source code and my modifications may be downloaded via the links provided below. This modified software is provided at no cost and with no warranty, also per the GNU GPL.

    Gracias a todos por las explicaciones.
  • #15 por superlativo el 28/12/2012
    Bladerunner muchas gracias por tu exquisita clase de rsync. De verdad, me ha sido de gran ayuda.

    Sigo probando...

    Alquimista he encontrado esto:
    Incluyendo y excluyendo archivos y/o directorios (ver punto 5).

    Saludos