+#!/bin/bash
+
+set -eu
+
+function snap {
+ unsnap
+
+ cat /etc/fstab | awk '{print $5 " " $1 " " $2;}' | while read -r dump dev mnt; do
+ if [ "$dump" = 1 ]; then
+ echo "bind mount $mnt"
+ mount --bind "${mnt}" "/a${mnt}"
+ elif [ "$dump" = 2 ]; then
+ read -r lvname vgname _ < <(lvdisplay --noheadings -C "$dev")
+ echo "snapshot ${vgname}/${lvname}"
+ lvcreate -L1G --snapshot --name "${lvname}snap" "${vgname}/${lvname}"
+ mount -o ro "${dev}snap" "/a${mnt}"
+ fi
+ done
+}
+
+function unsnap {
+ tac /etc/fstab | awk '{print $5 " " $1 " " $2;}' | while read -r dump dev mnt; do
+ snapmnt="/a${mnt}"
+ snapdev="${dev}snap"
+ if [ "$dump" = 1 ]; then
+ echo "umount $snapmnt"
+ mountpoint -q "$snapmnt" && umount "$snapmnt"
+ elif [ "$dump" = 2 ]; then
+ echo "umount $snapmnt"
+ mountpoint -q "$snapmnt" && umount "$snapmnt"
+
+ echo "unsnapshot $snapdev"
+ [ -b "$(readlink -f "$snapdev")" ] && echo y | lvremove "${dev}snap"
+ fi
+ done
+}
+
+if [ "$(id -u)" -ne 0 ]; then
+ echo "Must be root"
+ exit 1
+fi
+
+mkdir -p /a
+
+if [ "${1:-}" = "off" ]; then
+ unsnap
+elif [ "${1:-}" = "on" ]; then
+ snap
+else
+ echo "Usage: $0 on|off"
+ exit 1
+fi