10 dispatch snap
< /etc
/fstab
14 tac /etc
/fstab | dispatch unsnap
22 local action
="" snaptype
=""
23 local dev
="" mnt
="" fstype
="" opts
="" dump
=""
25 while read -r dev mnt fstype opts dump pass
; do
26 snaptype
="$(get_snaptype "$fstype" "$dump")"
27 if [ -z "$snaptype" ]; then
30 action
="${1}_${snaptype}"
32 "$action" "$dev" "$mnt" "$opts"
36 function get_snaptype
{
37 local fstype
="$1" dump
="$2"
38 if [ "$dump" = "1" ]; then
40 elif [ "$dump" = "2" ] && [ "$fstype" = "btrfs" ]; then
42 elif [ "$dump" = "2" ]; then
49 mount
--bind "${mnt}" "/a${mnt}"
52 function unsnap_bind
{
54 if mountpoint
-q "$snapmnt"; then
60 local dev
="$1" mnt
="$2"
61 local lvname
="" vgname
=""
62 read -r lvname vgname _
< <(lvdisplay
--noheadings -C "$dev")
63 echo "snapshot ${vgname}/${lvname}"
64 lvcreate
-L1G --snapshot --name "${lvname}snap" "${vgname}/${lvname}"
65 mount
-o ro
"${dev}snap" "/a${mnt}"
69 local snapdev
="${1}snap"
71 if mountpoint
-q "$snapmnt"; then
74 if [ -b "$(readlink -f "$snapdev")" ]; then
75 lvremove
-f "${dev}snap"
80 local mnt
="$2" opts
="$3" snapdir
=""
82 snapdir
="$(get_btrfs_snapshot_dir "$opts" "$mnt")"
83 btrfs subvolume snapshot
"$mnt" "$snapdir"
85 mount
--bind "$snapdir" "/a${mnt}"
88 function unsnap_btrfs
{
89 local mnt
="$2" opts
="$3" snapdir
=""
92 if mountpoint
-q "$snapmnt"; then
96 snapdir
="$(get_btrfs_snapshot_dir "$opts" "$mnt")"
97 if [ -d "$snapdir" ]; then
98 btrfs subvolume delete
"$snapdir"
102 function get_btrfs_snapshot_dir
{
103 local opts
="$1" mnt
="$2" subvol
=""
104 subvol
="$(echo "$opts" | sed -nE 's/^.*\bsubvol=([^,]+)\b.*$/\1/p')"
105 if [ -z "$subvol" ]; then
106 echo "Unknown subvol for mountpoint: $mnt"
109 echo "/$(cat /etc/hostname)/${subvol}-snap"
112 if [ "$(id -u)" -ne 0 ]; then
117 if [ "${1:-}" = "off" ]; then
119 elif [ "${1:-}" = "on" ]; then
122 echo "Usage: $0 on|off"