]> code.delx.au - monosys/blob - bsnap-zfs
v1.0.4
[monosys] / bsnap-zfs
1 #!/bin/bash
2
3 set -eu
4
5 function snap {
6 unsnap
7
8 znap-take bsnap 1
9 mount_snapshots
10 mkdir -p /a/boot
11 mount --bind /boot /a/boot
12 }
13
14 function unsnap {
15 if ! [ -d /a ]; then
16 return
17 fi
18
19 umount /a/boot || true
20 rmdir /a/boot || true
21
22 if ls &> /dev/null /a/*; then
23 umount /a/* || true
24 rmdir /a/* || true
25 fi
26 rmdir /a || true
27 }
28
29 function list_snapshots {
30 local fsname
31 for fsname in $(zfs list -H -o name); do
32 zfs list -H -o name -S creation -t snapshot -d 1 -r "$fsname" | \
33 grep '@znap_....-..-..-...._bsnap' | \
34 head -n1
35 done
36 }
37
38 function mount_snapshots {
39 local snapname
40 local fsname
41 local mountpoint
42
43 for snapname in $(list_snapshots); do
44 fsname="${snapname%@*}"
45 mountpoint="/a/$(echo "$fsname" | cut -d/ -f2- | tr '/' '_')"
46 mkdir -p "$mountpoint"
47 mount -t zfs "$snapname" "$mountpoint"
48 done
49 }
50
51 if [ "$(id -u)" -ne 0 ]; then
52 echo "Must be root"
53 exit 1
54 fi
55
56 if [ "${1:-}" = "off" ]; then
57 unsnap
58 elif [ "${1:-}" = "on" ]; then
59 snap
60 else
61 echo "Usage: $0 on|off"
62 exit 1
63 fi