#!/bin/bash set -eu function snap { unsnap mkdir -p /a 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 rmdir /a || true } if [ "$(id -u)" -ne 0 ]; then echo "Must be root" exit 1 fi if [ "${1:-}" = "off" ]; then unsnap elif [ "${1:-}" = "on" ]; then snap else echo "Usage: $0 on|off" exit 1 fi