Merge de Time Machine (et autres informations)

Time Machine d'Apple est uns solution simple (sans être simpliste) et pratique de backup très bien intégrée à OSX que j'utilise depuis maintenant plusieurs années. Voici les points clés :
  • Effectue une sauvegarde horaire sur 24 heures, conserve les sauvegardes quotidiennes sur un mois, puis hebdomadaires pour les mois précédents tant qu'il reste de la place sur le support, et supprime les sauvegardes les plus anciennes quand la place vient à manquer (ce point vient justement de me poser problème !).
  • Il est possible de ne pas sauvegarder automatiquement mais à la demande.
  • il est possible de sauvegarder la machine entière ou seulement une partie (par définition d'exclusions).
  • Supporte les backups vers un disque local (externe ou non) ou réseau : serveur OSX (il faut définir un partage sur le serveur comme étant une cible Time Machine) ou Apple Time Capsule.
  • Supporte la dé-duplication par utilisation de hardlinks lorsque les fichiers sont identiques.
Pour faire simple, la sauvegarde Time Machine est équivalente à une copie rsync avec utilisation de --link-dest vers la date précédente, sauf qu'Apple utilise des ACL et des extended attributes spécifiques sans lesquels un snapshot ne sera pas reconnu.
Lorsque la cible est un disque local externe, les backups se font dans répertoire Backups.backupdb à la racine du disque, et si ils se font sur un OSX serveur, c'est à l'intérieur d'une image disque de type sparse bundle.

L'utilisation basique de Time Machine est :
  • on branche le disque de sauvegarde pour effectuer une sauvegarde, ou on sauvegarde au fil de l'eau sur le réseau
  • en cas de besoin on peut remonter le temps pour restaurer un fichier, répertoire dans le Finder, ou retrouver des messages dans Mail.app qui intègre aussi Time Machine
  • en cas de sinistre, ou lors de l'installation d'une nouveau disque système ou d'une nouvelle machine, on peut réinstaller tout le système à partir du disque externe (c'est possible aussi via le réseau mais je déconseille à cause de la lenteur, et personnellement j'ai abandonné une restauration via WIFI)
Mais comment faire
  • si on installe un nouveau disque système pour continuer de sauvegarder sur le même support ? Time Machine associe un UID du disque et de la machine aux backups et refusera d'ajouter de nouvelles dates après (il est possible de démarrer un nouveau backup mais on perd l'historique) ?
  • si on veut copier une sauvegarde réseau sur un disque externe pour avoir un meilleur débit ?
  • si on veut supprimer une date de la sauvegarde (on peut supprimer un fichier ou toutes les sauvegardes d'un fichier depuis le Finder en mode Time Machine)
  • si on veut consolider des backups différents (dates ou machines différentes) sur un même support ?
Le site Pondini.org est une mine d'informations sur le sujet, alors que partout ailleurs il y a très peu d'informations sur les détails d'implémentation et les manipulations possibles.

Sachez que la commande tmutil permet de piloter Time Machine, entre autres :

  • activer, désactiver les backups, configurer les exclusions
  • comparer l'état actuel avec une sauvegarde
  • restaurer un backup
  • supprimer des dates
  • de ré-associer un disque de sauvegarde à une nouvelle machine ou un nouveau disque pour conserver l'historique
Dernièrement, en voulant faire une sauvegarde incluant une VM Virtualbox dont le disque système fait plus de 110GiB, Time Machine a commencé à supprimer les dates les plus anciennes pour récupérer de l'espace (sans prévenir ailleurs que dans les logs systèmes et sans demander de confirmation préalable). Le problème c'est qu'avant d'arriver à libérer 110GiB, il a supprimé 97 dates différentes, soit les 3 premières années d'un historique de 4 ans (!). Ayant une copie de la plus grosse partie de ces dates sur mon serveur OSX (à l'époque où j'utilisais la sauvegarde par réseau er avant que j'aie besoin de restaurer) j'ai cherché à fusionner mes 2 sources Time Machine avec rsync.

Avancée de mes recherches :
  • il faut au minimum rsync 3.1.1+ pour supporter la copie d'extended attributes OSX (sur mon serveur 10.6, le rsync système 2.6.9 ne convient pas, j'ai pu installer une version plus récente 3.1.2 avec brew)
  • en connectant le disque externe sur le serveur et en montant l'image sparse bundle avec Utilitaire Disque, certains fichiers ne sont pas lisibles, on a des erreurs rsync indiquant une erreur E/S, et on voit des logs bizarres "tried to access a compressed file of unregistered type xx", c'est parce que le sparse bundle était accédé via le réseau par un MacOS plus récent (10.8) et que celui-ci a écrit certains fichiers compressés avec une méthode inconnue de 10.6, si j'ai bien compris, via une kext com.apple.AppleFSCompression.AppleFSCompressionTypeLZVN qui n'existe pas sur 10.6
  • il a donc fallu copier toute l'image machine.sparsebundle sur un disque externe pour pouvoir la monter et la lire depuis le mac qui avait produit ces sauvegardes
  • les backups Time Machine sont protégés en écriture pour tout le monde y compris root via une kext TMSafetyNet mais heureusement elle contient un helper permettant de bypasser la sécurité : /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass (suivant la version d'OSX le helper est ailleurs dans le bundle, par exemple dans le répertoire helper)
  • on arrive enfin à recopier une date de backup d'un disque sur l'autre avec rsync, l'option --link-dest permet de faire des hardlinks lorsqu'un fichier existe déjà pour ne pas doubler la place. On fait alors un --link-dest vers la date précédente lorsqu'on ajoute une date, on peut aussi utiliser plusieurs --link-dest si on insère entre 2 dates existantes :
sudo /System/Library/Extensions/TMSafetyNet.kext/Helpers/bypass rsync -v -Pa -HAXE --link-dest=../2015-07-15-073249 --link-dest=../2016-11-13-215936 /Volumes/copy of my server/Backups.backupdb/myhost/2015-07-15-083402/ /Volumes/BackupDrive/Backups.backupdb/myhost/2015-07-15-083402
  • Attention : l'argument de --link-dest est un chemin relatif par rapport au répertoire en cours de copie.
  • Attention 2 : on ne peut malheureusement pas recopier un ensemble de dates en une seule commande; il faut faire une date à la fois avec --link-dest vers la précédente. Ça peut être (très) long. Après avoir automatisé avec quelques lignes de Perl, la recopie des 97 backups a duré 6 jours ! (USB 2...)
J'essaierai de détailler les différents extended attributes d'un snapshot dans un futur posy. Sans eux Time Machine ne reconnaît pas les donnés.

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Courier} span.s1 {letter-spacing: 0.0px}

Comments