]> code.delx.au - monosys/blob - borg/bsnap
borg backups
[monosys] / borg / bsnap
1 #!/bin/bash
2
3 set -eu
4
5 function snap {
6 unsnap
7
8 cat /etc/fstab | awk '{print $5 " " $1 " " $2;}' | while read -r dump dev mnt; do
9 if [ "$dump" = 1 ]; then
10 echo "bind mount $mnt"
11 mount --bind "${mnt}" "/a${mnt}"
12 elif [ "$dump" = 2 ]; then
13 read -r lvname vgname _ < <(lvdisplay --noheadings -C "$dev")
14 echo "snapshot ${vgname}/${lvname}"
15 lvcreate -L1G --snapshot --name "${lvname}snap" "${vgname}/${lvname}"
16 mount -o ro "${dev}snap" "/a${mnt}"
17 fi
18 done
19 }
20
21 function unsnap {
22 tac /etc/fstab | awk '{print $5 " " $1 " " $2;}' | while read -r dump dev mnt; do
23 snapmnt="/a${mnt}"
24 snapdev="${dev}snap"
25 if [ "$dump" = 1 ]; then
26 echo "umount $snapmnt"
27 mountpoint -q "$snapmnt" && umount "$snapmnt"
28 elif [ "$dump" = 2 ]; then
29 echo "umount $snapmnt"
30 mountpoint -q "$snapmnt" && umount "$snapmnt"
31
32 echo "unsnapshot $snapdev"
33 [ -b "$(readlink -f "$snapdev")" ] && echo y | lvremove "${dev}snap"
34 fi
35 done
36 }
37
38 if [ "$(id -u)" -ne 0 ]; then
39 echo "Must be root"
40 exit 1
41 fi
42
43 mkdir -p /a
44
45 if [ "${1:-}" = "off" ]; then
46 unsnap
47 elif [ "${1:-}" = "on" ]; then
48 snap
49 else
50 echo "Usage: $0 on|off"
51 exit 1
52 fi