Wer von Apple auf Windows umsteigen möchte und die Daten eines Time Machine Backup in Windows weiternutzen möchte, der wird schnell feststellen, dass das so einfach nicht funktioniert.
Dieser Artikel...
- richtet sich an Profis mit einer entsprechenden Ausbildung als Fachinformatiker oder vergleichbar. Sie müssen wissen, was Sie tun.
- beschreibt das Auslesen eines Time Machine Backups über einen Linux Rechner auf eine externe, unter Windows lesbare Festplatte. So können sie die Daten unter Linux auf einen NTFS-Datenträger kopieren, den sie dann unter Windows lesen können.
- beschreibt nicht, wie sie interne Datenträger eines Mac auslesen, sondern einen USB-Datenträger mit einem Time Machine Backup.
Hintergrund
Das Time Machine Backup ist aufgrund des Dateisystems unter Windows nicht lesbar. Unter Linux ist es – ggf. mit einem zusätzlichen Treiber – zwar lesbar, allerdings sind die Dateien in einer Struktur abgelegt, die durch einen einfachen Kopiervorgang nicht sinnvoll nutzbar sind. Mit dieser Anleitung stellen sie die Dateistruktur so wieder her, wie sie sie von ihrem Mac gewohnt sind.
Vorbereitungen
Folgendes wird benötigt:
- Rechner mit Linux, z.B. Ubuntu
- Installiertem ntfs-3g Treiber oder Kernel mit NTFS Schreibunterstützung, damit sie die Daten auf einen Windows Datenträger kopieren können
- Ggf. APFS-Fuse Treiber, sofern das Time Machine Backup mit APFS formatiert ist.
- Das folgende Bash Skript
- Der Vorgang funktioniert ggf. nicht bei verschlüsselten Datenträgern
Vorgehen
1. Prüfen sie im Vorfeld, ob sie auf den leeren Windows-Sicherungsdatenträger Zugriff unter ihrem Windows System haben, bevor sie damit beginnen, die Mac OS Time-Machine Daten unter Linux hierauf zu sichern.
2. Installieren sie ntfs-3g, damit sie Schreibzugriff auf den leeren Windows-Sicherungsdatenträger haben mit:
sudo apt install ntfs-3g
Stecken sie erst im Anschluss den leeren Windows-Sicherungsdatenträger ein.
3. Installieren sie ggf. den APFS-Fuse Treiber, sofern Sie das Time Machine Backup nicht ins System einbinden können. Der Treiber muss selbst kompiliert und eingebunden werden, diese Artikel geht hierauf nicht ein. Sie benötigen lediglich lesenden Zugriff auf das Time Machine Backup. Den Treiber finden sie hier.
4. Hängen sie den Time-Machine Datenträger in das Dateisystem ein. Sofern das Einbinden nicht automatisch über die Oberfläche geschieht, nutzen sie entsprechende mount-Befehle. Passen sie die Partition (sda/sdb/sdc) entsprechend ihrer eigenen Struktur an.
sudo su
mkdir /media/Time-Machine
mount /dev/sdb1 /media/Time-Machine
mkdir /media/Sicherungslaufwerk
mount /dev/sdc1 /media/Sicherungslaufwerk
5. Kopieren sie das folgende Skript und speichern sie es unter dem Namen copy-from-time-machine.sh. Nutzen sie am besten das Skript aus der Originalquelle, ansonsten ist es in einem Stand vom 08. Jun. 2022 unten als Kopie erhältlich.
6. Starten sie das Skript mit einem Befehl wie unten. Passen Sie hier die Pfade an ihre eigenen Verhältnisse an.
sudo ./copy-from-time-machine.sh /media/Time-Machine/Backup/Backups.backupdb/MACBOOK-NAME/2021-08-05-202501/Macintosh\ HD\ -\ Daten/Users/ /media/Sicherungslaufwerk/
Sofern sie den Befehl nach dem obigen Muster eingeben, stellt das Skript die Ordnerstruktur von ihrem Time-Machine Backup auf ihren leeren Windows-Sicherungsdatenträger lesbar wieder her.
Skript von vjt
#!/bin/bash
#
# Copy data from a Time Machine volume mounted on a Linux box.
#
# Usage: copy-from-time-machine.sh <source> <target>
#
# source: the source directory inside a time machine backup
# target: the target directory in which to copy the reconstructed
# directory trees. Created if it does not exists.
#
# Details:
#
# Time machine implements directory hard links by creating an
# empty file in place of the directory and storing in its
# "number of hard links" metadata attribute a pointer to a
# real directory in "/.HFS Private directory data^M" named
# "dir_$number".
#
# This script reconstructs a plain directory tree from this
# really ugly apple hack. Tested on a 650GB backup from OSX
# 10.6 mounted on a Linux 3.2.0-38 Ubuntu box. YMMV.
#
# MIT License.
#
# - Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!
#
self="$0"
source="$1"
target="$2"
hfsd="$3"
unset LANG
set -e
if [ -z "$source" -o -z "$target" ]; then
echo "Usage: $self <source> <target>"
exit -1
fi
if [ ! -d "$target" ]; then
mkdir -p "$target"
fi
if [ -z "$hfsd" ]; then
# Look for HFS Private directory data
sysname="$(echo -ne '.HFS+ Private Directory Data\r')"
hfsd=$source
while [ "$hfsd" != "/" -a ! -d "$hfsd/$sysname" ]; do
hfsd=`dirname "$hfsd"`;
done
if [ "$hfsd" = '/' ]; then
echo "HFS Private Directory Data not found in $source, is it an HFS filesystem?"
exit -2
else
echo "HFS Private Directory Data found in '$hfsd'"
hfsd="$hfsd/$sysname"
fi
fi
read hlnum type <<<$(stat -c '%h %F' "$source")
if [ "$type" = 'regular empty file' -a -d "$hfsd/dir_$hlnum" ]; then
source="$hfsd/dir_$hlnum"
echo "using source from HFS Private Directory Data"
fi
find "$source" -mindepth 1 -maxdepth 1 -and -not -name . -and -not -name .. | while read entry; do
dest="$target/`basename "$entry"`"
read hlnum type <<<$(stat -c '%h %F' "$entry")
case $type in
'regular file'|'symbolic link')
cp -van "$entry" "$dest"
;;
'directory')
# Recurse
$self "$entry" "$dest" "$hfsd"
;;
'regular empty file')
if [ -d "$hfsd/dir_$hlnum" ]; then
# Recurse
$self "$hfsd/dir_$hlnum" "$dest" "$hfsd"
else
echo "Skipping empty file $entry"
fi
;;
esac
done