tmutil doesn't create a real snapshot (since Catalina?)
I'm using rsync on top of a mount_apfs snapshots, to backup a consistent file system view and without having to stop applications during the backup.
After having investigated the rsync error 'file has vanished', I've discovered that tmutil doesn't create real snapshots:
15:50:34 [admin@MAC10143-ROTH ~]$ tmutil snapshot /
Created local snapshot with date: 2020-12-21-155054
15:52:08 [admin@MAC10143-ROTH ~]$ sudo mount_apfs -o rdonly -s "com.apple.TimeMachine.2020-12-21-155054.local" / /tmp/snap
Password:
15:52:30 [admin@MAC10143-ROTH ~]$ cat /etc/profile
# System-wide .profile for sh(1)
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
...
15:53:20 [admin@MAC10143-ROTH ~]$ vi /etc/profile
<File is changed>
15:58:42 [admin@MAC10143-ROTH ~]$ cat /tmp/snap/etc/profile
# System-wide .profile for sh(1)
# <====
# TEST CHANGE <====
if [ -x /usr/libexec/path_helper ]; then
...
As you can see, all changes are reflected in the mounted snapshot. I've also tried file additions and deletions.
I think the problem is that Catalina has started to split the whole file system into a read-only system volume plus a data volume (plus maybe something else?):
16:07:33 [admin@MAC10143-ROTH ~]$ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1s6 466Gi 11Gi 176Gi 6% 488281 4881964599 0% /
devfs 197Ki 197Ki 0Bi 100% 682 0 100% /dev
/dev/disk1s5 466Gi 276Gi 176Gi 62% 2492125 4879960755 0% /System/Volumes/Data
/dev/disk1s4 466Gi 2.0Gi 176Gi 2% 2 4882452878 0% /private/var/vm
/dev/disk1s1 466Gi 804Ki 176Gi 1% 88 4882452792 0% /Volumes/Macintosh HD - Data
map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /System/Volumes/Data/home
map -fstab 0Bi 0Bi 0Bi 100% 0 0 100% /System/Volumes/Data/Network/Servers
/dev/disk3s1 25Gi com.apple.TimeMachine.2020-12-21-155054.local@/dev/disk1s6 466Gi 11Gi 176Gi 6% 488281 4881964599 0% /private/tmp/snap
16:07:35 [admin@MAC10143-ROTH ~]$
I could try to mount the more specific file systems, but the problem is I want to make the whole / visible to rsync, to perform a system backup. Is there a way?
Solution 1:
I'll answer myself, though it's a partial answer.
When tmutils is used with partitions like /
, the result isn't a true snapshot, the file system I mount this way reflects the original one in real-time (ie, any change in the original is immediately visible in the "snapshot").
In order to make it work, I have to mount partitions like this:
vol_path=/System/Volumes/Data
snap_id=$(tmutil snapshot "$vol_path" | sed s/'Created local snapshot with date: '//)
mount_apfs -o rdonly -s "com.apple.TimeMachine.${snap_id}.local" "$vol_path" snap-mnt
This works fine when you want to backup a subdirectory like /System/Volumes/Data/Users/user/
.
The flip side is that directories like /etc
aren't under Data/
, but /etc/
is actually a link to Data/private/
, so one doesn't lose much by backing up the Data/ dir only.