Velocizzare i backup Time Machine su unità di rete

Se usate i backup di Time Machine su una condivisione in rete, è possibile ottimizzare il disco virtuale di Time Machine con qualche comando da terminale.

Time Machine crea un volume di tipo “sparse bundle” per contenere i backup.
Un disco sparse bundle è un disco virtuale i cui blocchi sono contenuti in file. Il volume può poi essere montato ed usato come se fosse un normale disco esterno.

Normalmente la dimensione dei “bands” (che sono i file fisici dove vengono salvati i blocchi del disco virtuale) è di 8MB, quindi per un backup di 100GB, vengono creati e modificati più di 12000 file durante i backup.
Questo può causare un collo di bottiglia di performance a rallentare il backup, in modo particolare quando viene fatto su condivisioni in rete.

Questa guida spiega come convertire l’immagine del disco di Time Machine, in modo che utilizzi file band di 128MB, incrementandone quindi le performance.
Il protocollo di trasferimento file coperto da questa guida è AFP (che è quello normalmente usato da tutti i produttori di NAS per l’uso con Time Machine), ma possono essere fatte piccole modifiche per altri protocolli.

Il modo più rapido per convertire l’immagine è durante la sua creazione, quindi al primo backup.
In questo caso, la strada migliore è:

  • Aprire l’applicazione Console
  • Configurare Time Machine per effettuare il backup sulla condivisione in rete
  • Mentre Time Machine inizia il primo backup, tenere sotto controllo i messaggi nella Console
  • Interrompere il backup dopo che appare questa riga:
    com.apple.backupd[*]: Forcing deep traversal on source
  • A questo punto, il volume è già stato creato e può essere convertito rapitamente, dal momento che è quasi vuoto.

La conversione può essere eseguita anche su un volume già in uso, ma il volume viene temporaneamente duplicato, quindi occorre verificare che ci sia abbastanza spazio sulla condivisione in rete (comprese eventuali quote utente) e prepararsi ad un tempo di conversione molto lungo.

Ora occorre sostituire questi parametri nelle linee evidenziate dello script sottostante:

  • <hostname/IP> : Hostname o IP del server che ospita la condivisione per Time Machine
  • <share_name> : Nome della condivisione di Time Machine
  • <share username>  / <share password> : Nome utente e password usati da Time Machine per connettersi alla condivisione
  • <volume name> : Nome del volume di backup (da usare al posto di quello standard)

I comandi dal 10 al 12 sono opzionali, nel caso vogliate rinominare il volume di Time Machine.

sudo -i
BCK_SRV=<hostname/IP>
BCK_DIR=<share_name>
BCK_USR=<share username>
BCK_PWD=<share password>
BCK_VOL="<volume name>"
BCK_BND=`hostname -s`
BCK_BND_TMP=`hostname -s`_tmp
mkdir /Volumes/$BCK_DIR
mount_afp afp://$BCK_USR:$BCK_PWD@$BCK_SRV/$BCK_DIR /Volumes/$BCK_DIR
hdiutil attach /Volumes/$BCK_DIR/$BCK_BND.sparsebundle -mountroot .
diskutil rename Time\ Machine\ Backups "$BCK_VOL"
hdiutil detach Time\ Machine\ Backups
hdiutil convert /Volumes/$BCK_DIR/$BCK_BND.sparsebundle -format UDSB -tgtimagekey sparse-band-size=262144 -o /Volumes/$BCK_DIR/$BCK_BND_TMP.sparsebundle
cp /Volumes/$BCK_DIR/$BCK_BND.sparsebundle/com.apple.TimeMachine.* /Volumes/$BCK_DIR/$BCK_BND_TMP.sparsebundle/
rm -R /Volumes/$BCK_DIR/$BCK_BND.sparsebundle
mv /Volumes/$BCK_DIR/$BCK_BND_TMP.sparsebundle /Volumes/$BCK_DIR/$BCK_BND.sparsebundle
umount /Volumes/$BCK_DIR
exit

 

Solo per versioni più vecchie di OS X (fino a OS X 10.9 “Mavericks”, inclusa), potete creare direttamente il volume di Time Machine con la corretta dimensione dei file, prima che giri il primo backup.
Il trucco che ho usato è di nominare il file del volume con hostname e indirizzo Mac della scheda di rete en0, in modo che Time Machine usi (e rinomini) il mio volume, durante il primo backup.

sudo -i
BCK_SRV=<hostname/IP>
BCK_DIR=<share_name>
BCK_USR=<share username>
BCK_PWD=<share password>
BCK_VOL="<volume name>"
BCK_BND=`hostname -s`
BCK_BND_TMP=`hostname -s`_tmp
mkdir /Volumes/$BCK_DIR
mount_afp afp://$BCK_USR:$BCK_PWD@$BCK_SRV/$BCK_DIR /Volumes/$BCK_DIR
hdiutil create -size 100m -layout GPTSPUD -fs "Journaled HFS+" -volname "$BCK_VOL" -type SPARSEBUNDLE -nospotlight -tgtimagekey sparse-band-size=262144 ./`hostname -s`_`ifconfig en0 | grep ether | sed "s|:||g" | cut -f2 -d' '`.sparsebundle
umount /Volumes/$BCK_DIR
exit

 

Dopo queste azioni, il backup funzionerà più velocemente su condivisioni in rete.
Ho anche notato meno problemi di corruzione del volume di backup, anche se non ho fatto sperimentazioni scientifiche in tal senso.