X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=mount-latest-subvol;h=7a179c4fd604480b50af48136d81990a25cef69b;hb=9c77c557e60d21caceeef1e78e35b35ed968fca9;hp=7f54a4c2cfd9c958647dbc68039469df2e59c1ef;hpb=95eb9558206f8287febab80dd3f51d168a3ca831;p=distro-setup diff --git a/mount-latest-subvol b/mount-latest-subvol index 7f54a4c..7a179c4 100644 --- a/mount-latest-subvol +++ b/mount-latest-subvol @@ -28,8 +28,8 @@ Usage: ${0##*/} [OPTIONS] -v|--verbose Be more verbose -Note, at source location, intentionally not executable, run and read -install-my-scripts. +Note: In git this is not not executable because it's meant to be installed +using ./install-my-scripts Note: Uses util-linux getopt option parsing: spaces between args and options, short options can be combined, options before args. @@ -37,6 +37,8 @@ EOF exit $1 } +all_vols=(q a o i ar qr) + tu() { while read -r line; do @@ -132,6 +134,7 @@ umount-kill() { } # duplicated in check-subvol +# Reassign $1 var from /dev/dm- to corresponding /dev/mapper/ mapper-dev() { local mapdev local -n devref=$1 @@ -185,8 +188,15 @@ if [[ -e /mnt/root/root2-fstab ]]; then mnt /mnt/boot2 fi +do_o=true root_dev=$(awk '$2 == "/" {print $1}' /etc/mtab) mapper-dev root_dev +o_dev=$(awk '$2 == "/mnt/o" {print $1}' /etc/mtab) +mapper-dev o_dev + +if [[ $o_dev == "$root_dev" ]]; then + do_o=false +fi # root2_dev=$(awk '$2 == "/mnt/root2" {print $1}' /etc/mtab) # mapper-dev root2_dev @@ -198,6 +208,7 @@ if cryptsetup status $root_dev &>/dev/null; then crypt_dev=$root_dev else # if we are in a recovery boot, find the next best crypt device mopts=,noauto + do_o=false for dev in $(dmsetup ls --target crypt | awk '{print $1}'); do dev=/dev/mapper/$dev if awk '{print $1}' /etc/mtab | grep -Fx $dev &>/dev/null; then @@ -232,21 +243,31 @@ $crypt_dev /q btrfs noatime,subvol=q,gid=1000$mopts 0 0 EOF fi -f=(/mnt/root/btrbk/o.*); f=${f[0]} +f=(/mnt/root/btrbk/qr.*); f=${f[0]} if [[ -e $f ]]; then fstab </dev/null; then continue @@ -361,47 +382,27 @@ for vol in q a o i; do m btrfs property set -ts $leaf ro true ### begin check if leaf is different, delete it if not ### - if [[ -e /a/opt/btrfs-snapshots-diff/btrfs-snapshots-diff.py ]]; then - source /a/bin/distro-functions/src/package-manager-abstractions - #pi python-jmespath # dependency of btrfs-snapshots-diff - # todo: need python3 port of btrfs-snapshots-diff, py2 no exist on nabia - parentid=$(btrfs sub show $leaf | awk '$1 == "Parent" && $2 == "UUID:" {print $3}') - bsubs=(/mnt/root/btrbk/$vol.*) - bsub= - # go in reverse order as its more likely to be at the end - for ((i=${#bsubs[@]}-1; i>=0; i--)); do - if [[ $parentid == $(btrfs sub show ${bsubs[i]} | awk '$1 == "UUID:" {print $2}') ]]; then - bsub=${bsubs[i]} - break - fi - done - if [[ $bsub ]]; then - tmp=$(mktemp) - # in testing, same subvol is 136 bytes. allow some overhead. 32 happens sometimes under systemd. - # $ errno 32 - # EPIPE 32 Broken pipe - btrfs send --no-data -p $bsub $leaf | head -c 1000 > $tmp || [[ $? == 141 || ${PIPESTATUS[0]} == 32 ]] - if (( $(stat -c%s $tmp) < 1000)); then - # example output for an empty diff: - # Found a valid Btrfs stream header, version 1 - # o.leaf.2019-05-15T14:00:50-0400;snapshot: uuid=ba045ea30737dd449003f1ee40ec12d0, ctrasid=109533, clone_uuid=3c7e3544e486834aa71d89e5b8f30056, clone_ctransid=109533 - lines=$(/a/opt/btrfs-snapshots-diff/btrfs-snapshots-diff.py -s -f $tmp | \ - grep -vxF "Found a valid Btrfs stream header, version 1" | \ - grep -cv "^[^;]*;snapshot: ") ||: - if [[ $lines == 0 ]]; then - # rotate in case we find a bug, weve got 2 old ones - tmpleaf=($vol.tmpleaf2.*) - if (( ${#tmpleaf[@]} )); then - x btrfs sub del ${tmpleaf[@]} - fi - tmpleaf=($vol.tmpleaf1.*) - if (( ${#tmpleaf[@]} )); then - x mv ${tmpleaf[0]} $vol.tmpleaf2.${tmpleaf[0]#$vol.tmpleaf1.} - fi - echo suspected identical: $bsub $leaf - x mv $leaf $vol.tmpleaf1.${leaf#$vol.leaf.} - fi - fi + parentid=$(btrfs sub show $leaf | awk '$1 == "Parent" && $2 == "UUID:" {print $3}') + bsubs=(btrbk/$vol.*) + bsub= # base subvolume + # go in reverse order as its more likely to be at the end + for ((i=${#bsubs[@]}-1; i>=0; i--)); do + if [[ $parentid == $(btrfs sub show ${bsubs[i]} | awk '$1 == "UUID:" {print $2}') ]]; then + bsub=${bsubs[i]} + break + fi + done + if [[ $bsub ]]; then + tmp=$(mktemp) + # in testing, same subvol is 136 bytes. allow some overhead. 32 happens sometimes under systemd. + # $ errno 32 + # EPIPE 32 Broken pipe + lines=$(btrfs send --no-data -p $bsub $leaf | btrfs receive --dump | head -n 100 | wc -l || [[ $? == 141 || ${PIPESTATUS[0]} == 32 ]]) + if [[ $lines == 0 ]]; then + # example output of no differences: + # snapshot ./qrtest uuid=c41ff6b7-0527-f34d-95ac-190eecf54ff5 transid=2239 parent_uuid=64949e1b-4a3e-3945-9a8e-cd7b7c15d7d6 parent_transid=2239 + echo suspected identical: $bsub $leaf + x btrfs sub del $leaf fi fi ### end check if leaf is different, delete it if not ###