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