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
61 local lvname
="" vgname
=""
62 read -r lvname vgname _
< <(get_lvm_vgname_lvname
"${mnt}")
64 echo "snapshot ${vgname}/${lvname}"
65 lvcreate
-L1G --snapshot --name "${lvname}-snap" "${vgname}/${lvname}"
66 mount
-o ro
"/dev/${vgname}/${lvname}-snap" "/a${mnt}"
71 local lvname
="" vgname
=""
73 if mountpoint
-q "/a$mnt"; then
77 read -r lvname vgname _
< <(get_lvm_vgname_lvname
"${mnt}")
78 if lvdisplay
"${vgname}/${lvname}-snap" &> /dev
/null
; then
79 lvremove
-f "${vgname}/${lvname}-snap"
83 function get_lvm_vgname_lvname
{
84 local mnt
="$1" subvol
=""
85 lvdisplay
--noheadings -C "$(findmnt -n -o source "$mnt")"
89 local mnt
="$2" opts
="$3" snapdir
=""
91 snapdir
="$(get_btrfs_snapshot_dir "$opts" "$mnt")"
92 btrfs subvolume snapshot
"$mnt" "$snapdir"
94 mount
--bind "$snapdir" "/a${mnt}"
97 function unsnap_btrfs
{
98 local mnt
="$2" opts
="$3" snapdir
=""
101 if mountpoint
-q "$snapmnt"; then
105 snapdir
="$(get_btrfs_snapshot_dir "$opts" "$mnt")"
106 if [ -d "$snapdir" ]; then
107 btrfs subvolume delete
"$snapdir"
111 function get_btrfs_snapshot_dir
{
112 local opts
="$1" mnt
="$2" subvol
=""
113 subvol
="$(echo "$opts" | sed -nE 's/^.*\bsubvol=([^,]+)\b.*$/\1/p')"
114 if [ -z "$subvol" ]; then
115 echo "Unknown subvol for mountpoint: $mnt"
118 echo "/.snapshots/tmp-bsnap-${subvol}"
121 if [ "$(id -u)" -ne 0 ]; then
126 if [ "${1:-}" = "off" ]; then
128 elif [ "${1:-}" = "on" ]; then
131 echo "Usage: $0 on|off"