ZFS hook fails to correctly unmount snapshots when a dataset is mounted at / #1319

Closed
opened 2026-06-09 12:20:42 +00:00 by lwatsondev · 6 comments

What I'm trying to do and why

When a ZFS dataset is mounted at / with canmount=noauto (common on ZFS-on-root systems), cleanup emits umount: not mounted errors for every child dataset. The backup completes successfully but without snapshot consistency for those datasets.

Dataset layout

lwatson@serenity ~> zfs list -H -t filesystem -o name,mountpoint,canmount,org.torsion.borgmatic:backup
rpool	/	off	-
rpool/DATA	none	off	-
rpool/DATA/docker	/var/lib/docker	on	-
rpool/DATA/logs	/var/log	on	-
rpool/HOME	/home	off	-
rpool/HOME/lwatson	/home/lwatson	on	-
rpool/HOME/root	/root	on	-
rpool/ROOT	none	off	-
rpool/ROOT/gentoo	/	noauto	-

The problem

umount: /tmp/borgmatic-5xlu197j/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log: not mounted.
umount: /tmp/borgmatic-5xlu197j/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root: not mounted.
umount: /tmp/borgmatic-5xlu197j/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson: not mounted.

During cleanup, remove_data_source_dumps() tries to unmount child datasets from inside the root dataset's snapshot directory, rather than their own.

Steps to reproduce

No response

Actual behavior

/etc/borgmatic/config.yaml: Calling uptime_kuma hook function initialize_monitor
/etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor
/etc/borgmatic/config.yaml: Pushing Uptime Kuma push_url https://monitor.lwatson.dev/api/push/***?status=up&msg=start
/etc/borgmatic/config.yaml: Full Uptime Kuma state URL https://monitor.lwatson.dev/api/push/***?status=up&msg=start
/etc/borgmatic/config.yaml: MYSQL_HISTFILE=*** PGPASSFILE=*** PGSERVICEFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg --version --log-json --debug --show-rc
/etc/borgmatic/config.yaml: Borg 1.4.3
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Running actions for repository
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating archive
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Using runtime directory /tmp/borgmatic-27v4i13g/borgmatic
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for bootstrap manifest files to remove in /tmp/borgmatic-*/borgmatic/bootstrap
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling btrfs hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling lvm hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mariadb hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MariaDB data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mongodb hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MongoDB data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mysql hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MySQL data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling postgresql hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing PostgreSQL data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling sqlite hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing SQLite data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t snapshot -o name
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for snapshots to remove in /tmp/borgmatic-*/borgmatic/zfs_snapshots/*
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function dump_data_sources
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function dump_data_sources
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Snapshotting ZFS datasets
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint,canmount,org.torsion.borgmatic:backup
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/ROOT/gentoo@borgmatic-22333 of /
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/ROOT/gentoo@borgmatic-22333
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/ROOT/gentoo@borgmatic-22333 at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/ROOT/gentoo@borgmatic-22333 /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/HOME/lwatson@borgmatic-22333 of /home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/HOME/lwatson@borgmatic-22333
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/HOME/lwatson@borgmatic-22333 at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/HOME/lwatson@borgmatic-22333 /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/DATA/logs@borgmatic-22333 of /var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/DATA/logs@borgmatic-22333
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/DATA/logs@borgmatic-22333 at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/DATA/logs@borgmatic-22333 /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Writing patterns to /tmp/borgmatic-27v4i13g/borgmatic/tmpz32j3nt5:
R /etc/borgmatic/config.yaml
+ /etc/borgmatic/config.yaml
R /tmp/borgmatic-27v4i13g/./borgmatic/bootstrap
+ /tmp/borgmatic-27v4i13g/./borgmatic/bootstrap
R /efi
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./etc
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.config
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.local/share/weechat/logs
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.ssh
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/documents
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/games
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/music
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/pictures
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./usr/local
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./var/lib/portage
R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/./var/log
! fm:**/*.bak
! fm:**/*.pid
! fm:**/*.pyc
! fm:**/*~
! fm:**/.cache/
! fm:**/.config/Code/
! fm:**/.config/pulse/*-*
! fm:**/.gnupg/.#*
! fm:**/.gnupg/random_seed
! fm:**/.gnupg/sshcontrol
! fm:**/.npm/
! fm:**/.poetry/
! fm:**/.ssh/control-*
! fm:**/.venv/
! fm:**/__pycache__/
! fm:**/cache/
! fm:**/env/
! fm:**/etc/ld.so.cache
! fm:**/etc/ssl/
! fm:**/node_modules/
! fm:**/undo/
! fm:**/vendor/
! fm:**/venv/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Checking file paths Borg plans to include
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: MYSQL_HISTFILE=*** PGPASSFILE=*** PGSERVICEFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg create --patterns-from /tmp/borgmatic-27v4i13g/borgmatic/tmpz32j3nt5 --exclude-caches --exclude-if-present .nobackup --compression zstd --upload-ratelimit 10000 --remote-path borg14 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::{hostname}-{now:%Y-%m-%dT%H:%M:%S} --dry-run --list
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: MYSQL_HISTFILE=*** PGPASSFILE=*** PGSERVICEFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg create --patterns-from /tmp/borgmatic-27v4i13g/borgmatic/tmpz32j3nt5 --exclude-caches --exclude-if-present .nobackup --compression zstd --upload-ratelimit 10000 --remote-path borg14 --log-json --debug --show-rc ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::{hostname}-{now:%Y-%m-%dT%H:%M:%S}
using builtin fallback logging configuration
33 self tests completed in 0.05 seconds
SSH command line: ['ssh', '-i', '/etc/borgmatic/id_ed25519', '***@***.rsync.net', 'borg14', 'serve', '--debug']
TAM-verified manifest
security: read previous location 'ssh://***@***.rsync.net/./borg/serenity.lwatson.dev'
security: read manifest timestamp '2026-06-09T12:09:19.736225'
security: determined newest manifest timestamp as 2026-06-09T12:09:19.736225
security: repository checks ok, allowing access
Creating archive at "ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::serenity-2026-06-09T13:11:26"
Verified integrity of /root/.cache/borg/***/chunks
Reading files cache ...
Verified integrity of /root/.cache/borg/***/files
security: saving state for *** to /root/.config/borg/security/***
security: current location   ssh://***@***.rsync.net/./borg/serenity.lwatson.dev
security: key type           3
security: manifest timestamp 2026-06-09T12:14:31.410333
RemoteRepository: 6.79 MB bytes sent, 3.22 kB bytes received, 30 messages sent
terminating with success status, rc 0
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for bootstrap manifest files to remove in /tmp/borgmatic-*/borgmatic/bootstrap
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing bootstrap manifest at /tmp/borgmatic-27v4i13g/borgmatic/bootstrap/manifest.json
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling btrfs hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling lvm hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mariadb hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MariaDB data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mongodb hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MongoDB data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mysql hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MySQL data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling postgresql hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing PostgreSQL data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling sqlite hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing SQLite data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t snapshot -o name
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for snapshots to remove in /tmp/borgmatic-*/borgmatic/zfs_snapshots/*
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log
umount: /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log: not mounted.
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Command 'umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log' returned non-zero exit status 32.
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root
umount: /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root: not mounted.
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Command 'umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root' returned non-zero exit status 32.
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson
umount: /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson: not mounted.
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Command 'umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson' returned non-zero exit status 32.
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/DATA/logs@borgmatic-22333
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/DATA/logs@borgmatic-22333
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/HOME/lwatson@borgmatic-22333
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/HOME/lwatson@borgmatic-22333
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/ROOT/gentoo@borgmatic-22333
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/ROOT/gentoo@borgmatic-22333
/etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor
/etc/borgmatic/config.yaml: Pushing Uptime Kuma push_url https://monitor.lwatson.dev/api/push/***?status=up&msg=finish
/etc/borgmatic/config.yaml: Full Uptime Kuma state URL https://monitor.lwatson.dev/api/push/***?status=up&msg=finish
/etc/borgmatic/config.yaml: Calling uptime_kuma hook function destroy_monitor

summary:
/etc/borgmatic/config.yaml: Loading configuration file
/etc/borgmatic/config.yaml: Successfully ran configuration file

Expected behavior

No response

Other notes / implementation ideas

No response

borgmatic version

2.1.6

borgmatic installation method

Gentoo package

Borg version

borg 1.4.3

Python version

Python 3.14.4

Database version (if applicable)

No response

Operating system and version

Gentoo Linux 2.18

### What I'm trying to do and why When a ZFS dataset is mounted at `/` with `canmount=noauto` (common on ZFS-on-root systems), cleanup emits `umount: not mounted` errors for every child dataset. The backup completes successfully but without snapshot consistency for those datasets. ### Dataset layout ``` lwatson@serenity ~> zfs list -H -t filesystem -o name,mountpoint,canmount,org.torsion.borgmatic:backup rpool / off - rpool/DATA none off - rpool/DATA/docker /var/lib/docker on - rpool/DATA/logs /var/log on - rpool/HOME /home off - rpool/HOME/lwatson /home/lwatson on - rpool/HOME/root /root on - rpool/ROOT none off - rpool/ROOT/gentoo / noauto - ``` ### The problem ``` umount: /tmp/borgmatic-5xlu197j/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log: not mounted. umount: /tmp/borgmatic-5xlu197j/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root: not mounted. umount: /tmp/borgmatic-5xlu197j/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson: not mounted. ``` During cleanup, `remove_data_source_dumps()` tries to unmount child datasets from inside the root dataset's snapshot directory, rather than their own. ### Steps to reproduce _No response_ ### Actual behavior ``` /etc/borgmatic/config.yaml: Calling uptime_kuma hook function initialize_monitor /etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor /etc/borgmatic/config.yaml: Pushing Uptime Kuma push_url https://monitor.lwatson.dev/api/push/***?status=up&msg=start /etc/borgmatic/config.yaml: Full Uptime Kuma state URL https://monitor.lwatson.dev/api/push/***?status=up&msg=start /etc/borgmatic/config.yaml: MYSQL_HISTFILE=*** PGPASSFILE=*** PGSERVICEFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg --version --log-json --debug --show-rc /etc/borgmatic/config.yaml: Borg 1.4.3 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Running actions for repository ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating archive ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Using runtime directory /tmp/borgmatic-27v4i13g/borgmatic ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for bootstrap manifest files to remove in /tmp/borgmatic-*/borgmatic/bootstrap ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling btrfs hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling lvm hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mariadb hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MariaDB data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mongodb hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MongoDB data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mysql hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MySQL data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling postgresql hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing PostgreSQL data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling sqlite hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing SQLite data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t snapshot -o name ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for snapshots to remove in /tmp/borgmatic-*/borgmatic/zfs_snapshots/* ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function dump_data_sources ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function dump_data_sources ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Snapshotting ZFS datasets ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint,canmount,org.torsion.borgmatic:backup ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/ROOT/gentoo@borgmatic-22333 of / ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/ROOT/gentoo@borgmatic-22333 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/ROOT/gentoo@borgmatic-22333 at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/ROOT/gentoo@borgmatic-22333 /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/HOME/lwatson@borgmatic-22333 of /home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/HOME/lwatson@borgmatic-22333 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/HOME/lwatson@borgmatic-22333 at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/HOME/lwatson@borgmatic-22333 /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/DATA/logs@borgmatic-22333 of /var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/DATA/logs@borgmatic-22333 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/DATA/logs@borgmatic-22333 at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/DATA/logs@borgmatic-22333 /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Writing patterns to /tmp/borgmatic-27v4i13g/borgmatic/tmpz32j3nt5: R /etc/borgmatic/config.yaml + /etc/borgmatic/config.yaml R /tmp/borgmatic-27v4i13g/./borgmatic/bootstrap + /tmp/borgmatic-27v4i13g/./borgmatic/bootstrap R /efi R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./etc R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.config R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.local/share/weechat/logs R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.ssh R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/documents R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/games R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/music R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/pictures R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./usr/local R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./var/lib/portage R /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/./var/log ! fm:**/*.bak ! fm:**/*.pid ! fm:**/*.pyc ! fm:**/*~ ! fm:**/.cache/ ! fm:**/.config/Code/ ! fm:**/.config/pulse/*-* ! fm:**/.gnupg/.#* ! fm:**/.gnupg/random_seed ! fm:**/.gnupg/sshcontrol ! fm:**/.npm/ ! fm:**/.poetry/ ! fm:**/.ssh/control-* ! fm:**/.venv/ ! fm:**/__pycache__/ ! fm:**/cache/ ! fm:**/env/ ! fm:**/etc/ld.so.cache ! fm:**/etc/ssl/ ! fm:**/node_modules/ ! fm:**/undo/ ! fm:**/vendor/ ! fm:**/venv/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Checking file paths Borg plans to include ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: MYSQL_HISTFILE=*** PGPASSFILE=*** PGSERVICEFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg create --patterns-from /tmp/borgmatic-27v4i13g/borgmatic/tmpz32j3nt5 --exclude-caches --exclude-if-present .nobackup --compression zstd --upload-ratelimit 10000 --remote-path borg14 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::{hostname}-{now:%Y-%m-%dT%H:%M:%S} --dry-run --list ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: MYSQL_HISTFILE=*** PGPASSFILE=*** PGSERVICEFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg create --patterns-from /tmp/borgmatic-27v4i13g/borgmatic/tmpz32j3nt5 --exclude-caches --exclude-if-present .nobackup --compression zstd --upload-ratelimit 10000 --remote-path borg14 --log-json --debug --show-rc ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::{hostname}-{now:%Y-%m-%dT%H:%M:%S} using builtin fallback logging configuration 33 self tests completed in 0.05 seconds SSH command line: ['ssh', '-i', '/etc/borgmatic/id_ed25519', '***@***.rsync.net', 'borg14', 'serve', '--debug'] TAM-verified manifest security: read previous location 'ssh://***@***.rsync.net/./borg/serenity.lwatson.dev' security: read manifest timestamp '2026-06-09T12:09:19.736225' security: determined newest manifest timestamp as 2026-06-09T12:09:19.736225 security: repository checks ok, allowing access Creating archive at "ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::serenity-2026-06-09T13:11:26" Verified integrity of /root/.cache/borg/***/chunks Reading files cache ... Verified integrity of /root/.cache/borg/***/files security: saving state for *** to /root/.config/borg/security/*** security: current location ssh://***@***.rsync.net/./borg/serenity.lwatson.dev security: key type 3 security: manifest timestamp 2026-06-09T12:14:31.410333 RemoteRepository: 6.79 MB bytes sent, 3.22 kB bytes received, 30 messages sent terminating with success status, rc 0 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for bootstrap manifest files to remove in /tmp/borgmatic-*/borgmatic/bootstrap ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing bootstrap manifest at /tmp/borgmatic-27v4i13g/borgmatic/bootstrap/manifest.json ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling btrfs hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling lvm hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mariadb hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MariaDB data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mongodb hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MongoDB data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mysql hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MySQL data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling postgresql hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing PostgreSQL data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling sqlite hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing SQLite data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t snapshot -o name ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for snapshots to remove in /tmp/borgmatic-*/borgmatic/zfs_snapshots/* ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log umount: /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log: not mounted. ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Command 'umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/var/log' returned non-zero exit status 32. ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root umount: /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root: not mounted. ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Command 'umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/root' returned non-zero exit status 32. ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson umount: /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson: not mounted. ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Command 'umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/home/lwatson' returned non-zero exit status 32. ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-27v4i13g/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/DATA/logs@borgmatic-22333 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/DATA/logs@borgmatic-22333 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/HOME/lwatson@borgmatic-22333 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/HOME/lwatson@borgmatic-22333 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/ROOT/gentoo@borgmatic-22333 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/ROOT/gentoo@borgmatic-22333 /etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor /etc/borgmatic/config.yaml: Pushing Uptime Kuma push_url https://monitor.lwatson.dev/api/push/***?status=up&msg=finish /etc/borgmatic/config.yaml: Full Uptime Kuma state URL https://monitor.lwatson.dev/api/push/***?status=up&msg=finish /etc/borgmatic/config.yaml: Calling uptime_kuma hook function destroy_monitor summary: /etc/borgmatic/config.yaml: Loading configuration file /etc/borgmatic/config.yaml: Successfully ran configuration file ``` ### Expected behavior _No response_ ### Other notes / implementation ideas _No response_ ### borgmatic version 2.1.6 ### borgmatic installation method Gentoo package ### Borg version borg 1.4.3 ### Python version Python 3.14.4 ### Database version (if applicable) _No response_ ### Operating system and version Gentoo Linux 2.18
lwatsondev changed title from ZFS hook produces incorrect snapshot paths when a dataset has a blank mountpoint (e.g. root dataset mounted via initrd/fstab to ZFS hook fails to correctly unmount snapshots when a dataset is mounted at / 2026-06-09 13:06:51 +00:00
Owner

Thanks for filing this. It looks like it happens because of the way that removals work:

  • borgmatic loops over every snapshot directory it finds directly in .../zfs_snapshots/*
    • For each one, it loops over every ZFS dataset mount point.
      • For each one, it constructs a potential snapshot mount path from the combination of the snapshot directory joined with the dataset mount point. E.g.: .../zfs_snapshots/d34db33f/var/log.
      • If it's not an existent directory (because, say, /var/log's actual snapshot directory is elsewhere), then it bails.
      • Otherwise, it attempts a removal and unmount of the snapshot mount path.

That's why you're seeing child dataset snapshots being unmounted from the "wrong" snapshot directory—borgmatic is trying to unmount every combination. Normally, this doesn't result in any errors because of that existent directory check; if borgmatic constructs a non-existent directory, it just moves on. The problem comes when you have a ZFS root among your datasets. Then, when borgmatic constructs a "wrong" directory, it actually exists, because the root filesystem contains those child directories. And this results in the errors you're seeing.. although they are bypassed and therefore and don't stop borgmatic's execution.

The fix is probably to make borgmatic a little more clever about how it probes these paths. For instance, instead of probing for every combination of snapshot directory plus dataset mount point, it could maybe make sure that the hash in the snapshot directory actually matches the dataset mount point path before proceeding. I'll have to think this through a bit.

Thanks for filing this. It looks like it happens because of the way that removals work: * borgmatic loops over every snapshot directory it finds directly in `.../zfs_snapshots/*` * For each one, it loops over every ZFS dataset mount point. * For each one, it constructs a potential snapshot mount path from the combination of the snapshot directory joined with the dataset mount point. E.g.: `.../zfs_snapshots/d34db33f/var/log`. * If it's not an existent directory (because, say, `/var/log`'s actual snapshot directory is elsewhere), then it bails. * Otherwise, it attempts a removal and unmount of the snapshot mount path. That's why you're seeing child dataset snapshots being unmounted from the "wrong" snapshot directory—borgmatic is trying to unmount every combination. Normally, this doesn't result in any errors because of that existent directory check; if borgmatic constructs a non-existent directory, it just moves on. The problem comes when you have a ZFS root among your datasets. Then, when borgmatic constructs a "wrong" directory, it actually exists, because the root filesystem contains those child directories. And this results in the errors you're seeing.. although they are bypassed and therefore and don't stop borgmatic's execution. The fix is probably to make borgmatic a little more clever about how it probes these paths. For instance, instead of probing for every combination of snapshot directory plus dataset mount point, it could maybe make sure that the hash in the snapshot directory actually matches the dataset mount point path before proceeding. I'll have to think this through a bit.
Owner

I have a potential fix, but I don't have a system with a ZFS root at the moment to test it on. (I have tested it against a ZFS dataset that's not at the root.) Since you already have a repro of the problem, do you feel comfortable modifying your local borgmatic source with a potential fix?

If so, the attached zfs.py is a drop-in replacement for the existing copy that's installed by your Gentoo package. Not sure exactly where that is on your system; let me know if you have trouble finding it.

If you don't feel comfortable, let me know and I can look into setting up a VM to try to repro this.

Thanks!

I have a potential fix, but I don't have a system with a ZFS root at the moment to test it on. (I have tested it against a ZFS dataset that's not at the root.) Since you already have a repro of the problem, do you feel comfortable modifying your local borgmatic source with a potential fix? If so, the attached `zfs.py` is a drop-in replacement for the existing copy that's installed by your Gentoo package. Not sure exactly where that is on your system; let me know if you have trouble finding it. If you don't feel comfortable, let me know and I can look into setting up a VM to try to repro this. Thanks!
17 KiB
Author

Just tested it, all looks good to me, snapshots are created and deleted clean

/etc/borgmatic/config.yaml: Calling uptime_kuma hook function initialize_monitor
/etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor
/etc/borgmatic/config.yaml: Pushing Uptime Kuma push_url https://monitor.lwatson.dev/api/push/***?status=up&msg=start
/etc/borgmatic/config.yaml: Full Uptime Kuma state URL https://monitor.lwatson.dev/api/push/***?status=up&msg=start
/etc/borgmatic/config.yaml: PGSERVICEFILE=*** PGPASSFILE=*** MYSQL_HISTFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg --version --log-json --debug --show-rc
/etc/borgmatic/config.yaml: Borg 1.4.3
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Running actions for repository
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating archive
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Using runtime directory /tmp/borgmatic-lod42hhf/borgmatic
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for bootstrap manifest files to remove in /tmp/borgmatic-*/borgmatic/bootstrap
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling btrfs hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling lvm hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mariadb hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MariaDB data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mongodb hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MongoDB data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mysql hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MySQL data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling postgresql hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing PostgreSQL data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling sqlite hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing SQLite data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t snapshot -o name
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for snapshots to remove in /tmp/borgmatic-*/borgmatic/zfs_snapshots/*
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function dump_data_sources
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function dump_data_sources
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Snapshotting ZFS datasets
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint,canmount,org.torsion.borgmatic:backup
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/ROOT/gentoo@borgmatic-18512 of /
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/ROOT/gentoo@borgmatic-18512
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/ROOT/gentoo@borgmatic-18512 at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/ROOT/gentoo@borgmatic-18512 /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/HOME/lwatson@borgmatic-18512 of /home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/HOME/lwatson@borgmatic-18512
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/HOME/lwatson@borgmatic-18512 at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/HOME/lwatson@borgmatic-18512 /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/DATA/logs@borgmatic-18512 of /var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/DATA/logs@borgmatic-18512
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/DATA/logs@borgmatic-18512 at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/DATA/logs@borgmatic-18512 /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Writing patterns to /tmp/borgmatic-lod42hhf/borgmatic/tmpgsf_el3j:
R /etc/borgmatic/config.yaml
+ /etc/borgmatic/config.yaml
R /tmp/borgmatic-lod42hhf/./borgmatic/bootstrap
+ /tmp/borgmatic-lod42hhf/./borgmatic/bootstrap
R /efi
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./etc
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.config
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.local/share/weechat/logs
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.ssh
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/documents
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/games
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/music
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/pictures
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./usr/local
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./var/lib/portage
R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/./var/log
! fm:**/*.bak
! fm:**/*.pid
! fm:**/*.pyc
! fm:**/*~
! fm:**/.cache/
! fm:**/.config/Code/
! fm:**/.config/pulse/*-*
! fm:**/.gnupg/.#*
! fm:**/.gnupg/random_seed
! fm:**/.gnupg/sshcontrol
! fm:**/.npm/
! fm:**/.poetry/
! fm:**/.ssh/control-*
! fm:**/.venv/
! fm:**/__pycache__/
! fm:**/cache/
! fm:**/env/
! fm:**/etc/ld.so.cache
! fm:**/etc/ssl/
! fm:**/node_modules/
! fm:**/undo/
! fm:**/vendor/
! fm:**/venv/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Checking file paths Borg plans to include
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: PGSERVICEFILE=*** PGPASSFILE=*** MYSQL_HISTFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg create --patterns-from /tmp/borgmatic-lod42hhf/borgmatic/tmpgsf_el3j --exclude-caches --exclude-if-present .nobackup --compression zstd --upload-ratelimit 10000 --remote-path borg14 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::{hostname}-{now:%Y-%m-%dT%H:%M:%S} --dry-run --list
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: PGSERVICEFILE=*** PGPASSFILE=*** MYSQL_HISTFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg create --patterns-from /tmp/borgmatic-lod42hhf/borgmatic/tmpgsf_el3j --exclude-caches --exclude-if-present .nobackup --compression zstd --upload-ratelimit 10000 --remote-path borg14 --log-json --debug --show-rc ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::{hostname}-{now:%Y-%m-%dT%H:%M:%S}
using builtin fallback logging configuration
33 self tests completed in 0.05 seconds
SSH command line: ['ssh', '-i', '/etc/borgmatic/id_ed25519', '***@***.rsync.net', 'borg14', 'serve', '--debug']
TAM-verified manifest
security: read previous location 'ssh://***@***.rsync.net/./borg/serenity.lwatson.dev'
security: read manifest timestamp '2026-06-10T12:23:01.736042'
security: determined newest manifest timestamp as 2026-06-10T12:23:01.736042
security: repository checks ok, allowing access
Creating archive at "ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::serenity-2026-06-10T14:32:15"
Verified integrity of /root/.cache/borg/***/chunks
Reading files cache ...
Verified integrity of /root/.cache/borg/***/files
security: saving state for *** to /root/.config/borg/security/***
security: current location   ssh://***@***.rsync.net/./borg/serenity.lwatson.dev
security: key type           3
security: manifest timestamp 2026-06-10T13:35:40.417311
RemoteRepository: 160.27 MB bytes sent, 5.16 kB bytes received, 270 messages sent
terminating with success status, rc 0
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for bootstrap manifest files to remove in /tmp/borgmatic-*/borgmatic/bootstrap
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing bootstrap manifest at /tmp/borgmatic-lod42hhf/borgmatic/bootstrap/manifest.json
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling btrfs hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling lvm hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mariadb hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MariaDB data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mongodb hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MongoDB data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mysql hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MySQL data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling postgresql hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing PostgreSQL data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling sqlite hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing SQLite data source dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function remove_data_source_dumps
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t snapshot -o name
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for snapshots to remove in /tmp/borgmatic-*/borgmatic/zfs_snapshots/*
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/DATA/logs@borgmatic-18512
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/DATA/logs@borgmatic-18512
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/HOME/lwatson@borgmatic-18512
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/HOME/lwatson@borgmatic-18512
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/ROOT/gentoo@borgmatic-18512
ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/ROOT/gentoo@borgmatic-18512
/etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor
/etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor
/etc/borgmatic/config.yaml: Pushing Uptime Kuma push_url https://monitor.lwatson.dev/api/push/***?status=up&msg=finish
/etc/borgmatic/config.yaml: Full Uptime Kuma state URL https://monitor.lwatson.dev/api/push/***?status=up&msg=finish
/etc/borgmatic/config.yaml: Calling uptime_kuma hook function destroy_monitor

summary:
/etc/borgmatic/config.yaml: Loading configuration file
/etc/borgmatic/config.yaml: Successfully ran configuration file

Also, I don't know if you're aware but ZFS can actually manage mounting/unmounting snapshots itself. All datasets have a .zfs directory at the root containing snapshots. You won't see it in ls -a but it's there, and when snapshots here are accessed they are transparently mounted on demand, and unmounted when deleted. Maybe you could take advantage of that instead of handling it manually?

https://theorangeone.net/posts/zfs-browsable-snapshots/

lwatson@serenity ~> mount | grep gentoo@auto
lwatson@serenity ~> zfs list -t snapshot | grep gentoo
rpool/ROOT/gentoo@auto-20260604010000    195M      -  25.3G  -
rpool/ROOT/gentoo@auto-20260605010007    118M      -  25.2G  -
rpool/ROOT/gentoo@auto-20260607180002   67.4M      -  22.4G  -
rpool/ROOT/gentoo@auto-20260608130018   2.59M      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609010018   3.46M      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609140031   15.1M      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609150000   1.66M      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609160007    380K      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609170014    380K      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609180014    448K      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609190014    756K      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609200006    192K      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609210014    192K      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609220005    696K      -  22.4G  -
rpool/ROOT/gentoo@auto-20260609230010   5.91M      -  22.4G  -
rpool/ROOT/gentoo@auto-20260610140005   9.73M      -  22.4G  -
lwatson@serenity ~> ls /.zfs/snapshot/auto-20260610140005/
bin@   dev/  etc/   lib@    lost+found/  mnt/  proc/  run/   src/  sys/  usr/
boot/  efi/  home/  lib64@  media/       opt/  root/  sbin@  srv/  tmp/  var/
lwatson@serenity ~> mount | grep gentoo@auto
rpool/ROOT/gentoo@auto-20260610140005 on /.zfs/snapshot/auto-20260610140005 type zfs (ro,relatime,xattr,posixacl,casesensitive)
lwatson@serenity ~> sudo umount rpool/ROOT/gentoo@auto-20260610140005
lwatson@serenity ~> mount | grep gentoo@auto
# Non-root too
lwatson@serenity ~> mount | grep lwatson@auto
rpool/HOME/lwatson@auto-20260605010007 on /home/lwatson/.zfs/snapshot/auto-20260605010007 type zfs (ro,relatime,xattr,posixacl,casesensitive)
rpool/HOME/lwatson@auto-20260604010000 on /home/lwatson/.zfs/snapshot/auto-20260604010000 type zfs (ro,relatime,xattr,posixacl,casesensitive)
Just tested it, all looks good to me, snapshots are created and deleted clean ``` /etc/borgmatic/config.yaml: Calling uptime_kuma hook function initialize_monitor /etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor /etc/borgmatic/config.yaml: Pushing Uptime Kuma push_url https://monitor.lwatson.dev/api/push/***?status=up&msg=start /etc/borgmatic/config.yaml: Full Uptime Kuma state URL https://monitor.lwatson.dev/api/push/***?status=up&msg=start /etc/borgmatic/config.yaml: PGSERVICEFILE=*** PGPASSFILE=*** MYSQL_HISTFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg --version --log-json --debug --show-rc /etc/borgmatic/config.yaml: Borg 1.4.3 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Running actions for repository ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating archive ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Using runtime directory /tmp/borgmatic-lod42hhf/borgmatic ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for bootstrap manifest files to remove in /tmp/borgmatic-*/borgmatic/bootstrap ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling btrfs hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling lvm hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mariadb hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MariaDB data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mongodb hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MongoDB data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mysql hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MySQL data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling postgresql hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing PostgreSQL data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling sqlite hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing SQLite data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t snapshot -o name ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for snapshots to remove in /tmp/borgmatic-*/borgmatic/zfs_snapshots/* ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function dump_data_sources ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function dump_data_sources ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Snapshotting ZFS datasets ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint,canmount,org.torsion.borgmatic:backup ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/ROOT/gentoo@borgmatic-18512 of / ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/ROOT/gentoo@borgmatic-18512 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/ROOT/gentoo@borgmatic-18512 at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/ROOT/gentoo@borgmatic-18512 /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/HOME/lwatson@borgmatic-18512 of /home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/HOME/lwatson@borgmatic-18512 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/HOME/lwatson@borgmatic-18512 at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/HOME/lwatson@borgmatic-18512 /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Creating ZFS snapshot rpool/DATA/logs@borgmatic-18512 of /var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs snapshot rpool/DATA/logs@borgmatic-18512 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Mounting ZFS snapshot rpool/DATA/logs@borgmatic-18512 at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: mount -t zfs -o ro rpool/DATA/logs@borgmatic-18512 /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Writing patterns to /tmp/borgmatic-lod42hhf/borgmatic/tmpgsf_el3j: R /etc/borgmatic/config.yaml + /etc/borgmatic/config.yaml R /tmp/borgmatic-lod42hhf/./borgmatic/bootstrap + /tmp/borgmatic-lod42hhf/./borgmatic/bootstrap R /efi R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./etc R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.config R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.local/share/weechat/logs R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/.ssh R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/documents R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/games R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/music R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/./home/lwatson/pictures R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./usr/local R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/./var/lib/portage R /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/./var/log ! fm:**/*.bak ! fm:**/*.pid ! fm:**/*.pyc ! fm:**/*~ ! fm:**/.cache/ ! fm:**/.config/Code/ ! fm:**/.config/pulse/*-* ! fm:**/.gnupg/.#* ! fm:**/.gnupg/random_seed ! fm:**/.gnupg/sshcontrol ! fm:**/.npm/ ! fm:**/.poetry/ ! fm:**/.ssh/control-* ! fm:**/.venv/ ! fm:**/__pycache__/ ! fm:**/cache/ ! fm:**/env/ ! fm:**/etc/ld.so.cache ! fm:**/etc/ssl/ ! fm:**/node_modules/ ! fm:**/undo/ ! fm:**/vendor/ ! fm:**/venv/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Checking file paths Borg plans to include ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: PGSERVICEFILE=*** PGPASSFILE=*** MYSQL_HISTFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg create --patterns-from /tmp/borgmatic-lod42hhf/borgmatic/tmpgsf_el3j --exclude-caches --exclude-if-present .nobackup --compression zstd --upload-ratelimit 10000 --remote-path borg14 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::{hostname}-{now:%Y-%m-%dT%H:%M:%S} --dry-run --list ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: PGSERVICEFILE=*** PGPASSFILE=*** MYSQL_HISTFILE=*** BORG_RSH=*** BORG_PASSPHRASE_FD=*** BORG_EXIT_CODES=*** borg create --patterns-from /tmp/borgmatic-lod42hhf/borgmatic/tmpgsf_el3j --exclude-caches --exclude-if-present .nobackup --compression zstd --upload-ratelimit 10000 --remote-path borg14 --log-json --debug --show-rc ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::{hostname}-{now:%Y-%m-%dT%H:%M:%S} using builtin fallback logging configuration 33 self tests completed in 0.05 seconds SSH command line: ['ssh', '-i', '/etc/borgmatic/id_ed25519', '***@***.rsync.net', 'borg14', 'serve', '--debug'] TAM-verified manifest security: read previous location 'ssh://***@***.rsync.net/./borg/serenity.lwatson.dev' security: read manifest timestamp '2026-06-10T12:23:01.736042' security: determined newest manifest timestamp as 2026-06-10T12:23:01.736042 security: repository checks ok, allowing access Creating archive at "ssh://***@***.rsync.net/./borg/serenity.lwatson.dev::serenity-2026-06-10T14:32:15" Verified integrity of /root/.cache/borg/***/chunks Reading files cache ... Verified integrity of /root/.cache/borg/***/files security: saving state for *** to /root/.config/borg/security/*** security: current location ssh://***@***.rsync.net/./borg/serenity.lwatson.dev security: key type 3 security: manifest timestamp 2026-06-10T13:35:40.417311 RemoteRepository: 160.27 MB bytes sent, 5.16 kB bytes received, 270 messages sent terminating with success status, rc 0 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling bootstrap hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for bootstrap manifest files to remove in /tmp/borgmatic-*/borgmatic/bootstrap ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing bootstrap manifest at /tmp/borgmatic-lod42hhf/borgmatic/bootstrap/manifest.json ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling btrfs hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling lvm hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mariadb hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MariaDB data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mongodb hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MongoDB data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling mysql hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing MySQL data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling postgresql hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing PostgreSQL data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling sqlite hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Removing SQLite data source dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Calling zfs hook function remove_data_source_dumps ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t filesystem -o name,mountpoint ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs list -H -t snapshot -o name ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Looking for snapshots to remove in /tmp/borgmatic-*/borgmatic/zfs_snapshots/* ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/6a821861c282528e2ec8/var/log ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/185568b7478b0a5a81a2/home/lwatson ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Unmounting ZFS snapshot at /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: umount /tmp/borgmatic-lod42hhf/borgmatic/zfs_snapshots/3751af5bd81011e6d21d/ ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/DATA/logs@borgmatic-18512 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/DATA/logs@borgmatic-18512 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/HOME/lwatson@borgmatic-18512 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/HOME/lwatson@borgmatic-18512 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: Destroying ZFS snapshot rpool/ROOT/gentoo@borgmatic-18512 ssh://***@***.rsync.net/./borg/serenity.lwatson.dev: zfs destroy rpool/ROOT/gentoo@borgmatic-18512 /etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor /etc/borgmatic/config.yaml: Calling uptime_kuma hook function ping_monitor /etc/borgmatic/config.yaml: Pushing Uptime Kuma push_url https://monitor.lwatson.dev/api/push/***?status=up&msg=finish /etc/borgmatic/config.yaml: Full Uptime Kuma state URL https://monitor.lwatson.dev/api/push/***?status=up&msg=finish /etc/borgmatic/config.yaml: Calling uptime_kuma hook function destroy_monitor summary: /etc/borgmatic/config.yaml: Loading configuration file /etc/borgmatic/config.yaml: Successfully ran configuration file ``` Also, I don't know if you're aware but ZFS can actually manage mounting/unmounting snapshots itself. All datasets have a `.zfs` directory at the root containing snapshots. You won't see it in `ls -a` but it's there, and when snapshots here are accessed they are transparently mounted on demand, and unmounted when deleted. Maybe you could take advantage of that instead of handling it manually? https://theorangeone.net/posts/zfs-browsable-snapshots/ ```fish lwatson@serenity ~> mount | grep gentoo@auto lwatson@serenity ~> zfs list -t snapshot | grep gentoo rpool/ROOT/gentoo@auto-20260604010000 195M - 25.3G - rpool/ROOT/gentoo@auto-20260605010007 118M - 25.2G - rpool/ROOT/gentoo@auto-20260607180002 67.4M - 22.4G - rpool/ROOT/gentoo@auto-20260608130018 2.59M - 22.4G - rpool/ROOT/gentoo@auto-20260609010018 3.46M - 22.4G - rpool/ROOT/gentoo@auto-20260609140031 15.1M - 22.4G - rpool/ROOT/gentoo@auto-20260609150000 1.66M - 22.4G - rpool/ROOT/gentoo@auto-20260609160007 380K - 22.4G - rpool/ROOT/gentoo@auto-20260609170014 380K - 22.4G - rpool/ROOT/gentoo@auto-20260609180014 448K - 22.4G - rpool/ROOT/gentoo@auto-20260609190014 756K - 22.4G - rpool/ROOT/gentoo@auto-20260609200006 192K - 22.4G - rpool/ROOT/gentoo@auto-20260609210014 192K - 22.4G - rpool/ROOT/gentoo@auto-20260609220005 696K - 22.4G - rpool/ROOT/gentoo@auto-20260609230010 5.91M - 22.4G - rpool/ROOT/gentoo@auto-20260610140005 9.73M - 22.4G - lwatson@serenity ~> ls /.zfs/snapshot/auto-20260610140005/ bin@ dev/ etc/ lib@ lost+found/ mnt/ proc/ run/ src/ sys/ usr/ boot/ efi/ home/ lib64@ media/ opt/ root/ sbin@ srv/ tmp/ var/ lwatson@serenity ~> mount | grep gentoo@auto rpool/ROOT/gentoo@auto-20260610140005 on /.zfs/snapshot/auto-20260610140005 type zfs (ro,relatime,xattr,posixacl,casesensitive) lwatson@serenity ~> sudo umount rpool/ROOT/gentoo@auto-20260610140005 lwatson@serenity ~> mount | grep gentoo@auto # Non-root too lwatson@serenity ~> mount | grep lwatson@auto rpool/HOME/lwatson@auto-20260605010007 on /home/lwatson/.zfs/snapshot/auto-20260605010007 type zfs (ro,relatime,xattr,posixacl,casesensitive) rpool/HOME/lwatson@auto-20260604010000 on /home/lwatson/.zfs/snapshot/auto-20260604010000 type zfs (ro,relatime,xattr,posixacl,casesensitive) ```
Owner

@lwatsondev wrote in #1319 (comment):

Just tested it, all looks good to me, snapshots are created and deleted clean

Glad to hear that worked! I'll clean this up, and then it should be part of the next release.

Also, I don't know if you're aware but ZFS can actually manage mounting/unmounting snapshots itself. All datasets have a .zfs directory at the root containing snapshots. You won't see it in ls -a but it's there, and when snapshots here are accessed they are transparently mounted on demand, and unmounted when deleted. Maybe you could take advantage of that instead of handling it manually?

Good idea. Unfortunately, the .zfs auto-mounted snapshots don't support a particular trick that borgmatic uses with Borg 1.4+ to rewrite the snapshot mount path on the way into the Borg archive. The idea is that when you access those snapshotted files within the archive, they appear at their original pre-snapshot paths. For instance, if borgmatic mounts a snapshot of the /zpool path at /run/borgmatic/zfs_snapshots/94adefd5ca2747d1434b/zpool, then within the Borg archive, it'll "magically" appear at /zpool with that ugly prefix stripped off. But due to ZFS snapshot naming limitations, I don't know of a way to accomplish that same thing with .zfs auto-mounted snapshots.

@lwatsondev wrote in https://projects.torsion.org/borgmatic-collective/borgmatic/issues/1319#issuecomment-14180: > Just tested it, all looks good to me, snapshots are created and deleted clean Glad to hear that worked! I'll clean this up, and then it should be part of the next release. > Also, I don't know if you're aware but ZFS can actually manage mounting/unmounting snapshots itself. All datasets have a `.zfs` directory at the root containing snapshots. You won't see it in `ls -a` but it's there, and when snapshots here are accessed they are transparently mounted on demand, and unmounted when deleted. Maybe you could take advantage of that instead of handling it manually? Good idea. Unfortunately, the `.zfs` auto-mounted snapshots don't support a particular trick that borgmatic uses with Borg 1.4+ to _rewrite_ the snapshot mount path on the way into the Borg archive. The idea is that when you access those snapshotted files within the archive, they appear at their original pre-snapshot paths. For instance, if borgmatic mounts a snapshot of the `/zpool` path at `/run/borgmatic/zfs_snapshots/94adefd5ca2747d1434b/zpool`, then within the Borg archive, it'll "magically" appear at `/zpool` with that ugly prefix stripped off. But due to ZFS snapshot naming limitations, I don't know of a way to accomplish that same thing with `.zfs` auto-mounted snapshots.
Owner

This is implemented in main and will be part of the next release. Closing this ticket, but I'm happy to continue the discussion.

This is implemented in main and will be part of the next release. Closing this ticket, but I'm happy to continue the discussion.
Owner

Released in borgmatic 2.1.7!

Released in borgmatic 2.1.7!
Sign in to join this conversation.
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
borgmatic-collective/borgmatic#1319
No description provided.