[ˈrantnotiːts]

Time Machine Remote Backup

Donnerstag, 09. November 2023

Backups 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

Fragen oder Anregungen? Gern per E-Mail. Mein PGP-Key (4096) / (2048). Über diese Internetseite Git