Time Machine Remote Backup
Donnerstag, 09. November 2023Backups sind für mich eine Selbstverständlichkeit. Meine Server sichere ich stündlich mit restic auf einen Backupserver in Deutschland, und ein mal am Tag erfolgt eine Sicherung dieser Backups in ein Rechenzentrum in Finnland. Man weis ja nie.
Auch meine Arbeitsgeräte zuhause sichere ich damit. Jedoch nur spezielle Ordner wie /opt/homebrew/
, /etc/ppp/
und /Users/martin/
, nicht jedoch das gesamte Betriebssystem. Hierfür nutze ich Time Machine was bisher immer gute Dienste leistete. Die Time Machine Backups landen dabei auf einen AirPort Extreme der mir auch als NAS und Wifi Basis dient.
In manchen Fällen, wie zum Beispiel nach einem Einbruch oder Feuer ist leider auch das NAS weg. Wenn man also ohne Hardware da steht und in das nächste Geschäft geht um sich Ersatz zu besorgen, muss man danach alles mühevoll wiederherstellen. Das geht mit einem Time Machine Backup deutlich einfacher. Die Sicherungen mittels restic sind in diesem Szenario zwar auch hilfreich, aber bilden bei weitem nicht alles ab, was man zur schnellen und unkomplizierten Wiederaufnahme seiner Tätigkeiten braucht.
Das trifft natürlich nicht auf die Linux-Clients zu, bei denen stellt man einfach das ganze Betriebssystem aus dem Backup wieder her.
Also soll ein Time Machine Backup auf einen entfernten Server. Einen Apple Server habe ich nicht zur Hand. Also soll ein Storage-Server dafür herhalten.
Hierfür habe ich netatalk auf einen Debian Bookworm Server installiert. Wie das funktioniert, steht steht im Wiki von netatalk beschrieben, jedoch habe ich auf cracklib verzichtet.
apt install build-essential \ libevent-dev \ libssl-dev \ libgcrypt-dev \ libkrb5-dev \ libpam0g-dev \ libwrap0-dev \ libdb-dev \ libtdb-dev \ libmariadb-dev \ avahi-daemon \ libavahi-client-dev \ libacl1-dev \ libldap2-dev \ systemtap-sdt-dev \ libdbus-1-dev \ libdbus-glib-1-dev \ libglib2.0-dev \ libio-socket-inet6-perl \ libtalloc-dev \ tracker \ libtracker-sparql-3.0-dev \ quota \ libtirpc-dev
Ich habe es dann so kompiliert:
./configure --with-init-style=debian-systemd \ --without-talloc \ --without-tdb \ --enable-krbV-uam \ --with-pam-confdir=/etc/pam.d \ --with-dbus-daemon=/usr/bin/dbus-daemon \ --with-dbus-sysconf-dir=/etc/dbus-1/system.d \ --with-tracker-pkgconfig-version=3.0 make make install
Meine apf.conf ist auch recht unkompliziert, da der Server nur über VPN erreichbar ist, verzichte ich auch auf Anmeldung und erlaube anonymen Zugriff:
[Global] hostname = Time Machine mimic model = TimeCapsule8,119 afp listen = 172.16.18.1 hosts allow = 172.16.0.0/12 uam list = uams_guest.so log file = /var/log/afpd.log [Homes] basedir regex = /home [Time Machine Volume] path = /mnt/TimeMachine time machine = yes spotlight = no rwlist = nobody
Jetzt noch ein Image erstellen:
fallocate -l 500G /TimeMachine.img mkfs -t ext4 /TimeMachine.img tune2fs -m0 /TimeMachine.img mkdir /mnt/TimeMachine mount -t auto -o loop TimeMachine.img /mnt/TimeMachine
Damit es beim Neustart auch wieder da ist:
/TimeMachine.img /mnt/TimeMachine ext4 defaults,user_xattr,acl 0 0
Und zum Schluss noch die Services starten:
systemctl enable --now avahi-daemon systemctl enable --now netatalk.service
Jetzt kann man es im Finder (CMD+K) zum testen einbinden, die Adresse lautet in meinem Fall afp://172.18.0.1
Um das ganze zu automatisieren habe ich ein Skript..
#!/opt/homebrew/bin/bash while true; do if ! /Users/martin/Backup/monitoring; then while [ true ]; do if echo EOF | nc -vc 172.18.0.1 548 &>/dev/null; then /sbin/mount_afp -k "afp://;AUTH=NO%20USER%20AUTHENT@172.18.0.1/Time%20Machine%20Volume" /Users/martin/Backup/ break; else sleep 5; fi; done fi sleep 60; done
Und dazu den passenden cronjob angelegt:
@reboot /bin/sleep 5; /Users/martin/.local/bin/mount-afp >> /tmp/mount-afp.log 2>&1
In Time Machine kann man die Freigabe jedoch nicht ohne weiteres hinzufügen, zumindest nicht über die grafische Oberfläche. Hierzu muss man zuvor noch
defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1
ausführen, oder man prügelt es direkt rein:
tmutil setdestination -a afp://;AUTH=NO%20USER%20AUTHENT@172.18.0.1/Time%20Machine%20Volume