X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=mount-latest-subvol;h=13cfc3d159967ad8bff254093081dbe66933962a;hb=51c8b40fd2aac71d29dc9298ca65425725ad1edd;hp=4c1ee2f6b1ca1ae1239062d5fe329f2b20bb983a;hpb=89fc59d6e4bbeb1778c6aaaee776122dcf790871;p=distro-setup diff --git a/mount-latest-subvol b/mount-latest-subvol index 4c1ee2f..13cfc3d 100644 --- a/mount-latest-subvol +++ b/mount-latest-subvol @@ -18,7 +18,7 @@ readonly this_file cd / [[ $EUID == 0 ]] || exec sudo -E "$this_file" "$@" -source /usr/local/lib/err +source /usr/local/lib/bash-bear usage() { cat <=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 - # 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 + if [[ -e $vol ]]; then + if [[ $vol == qd ]]; then + m btrfs sub del qd + else + leaf=$vol.leaf.$(date +%Y-%m-%dT%H:%M:%S%z) + m mv $vol $leaf + m btrfs property set -ts $leaf ro true + + ### begin check if leaf is different, delete it if not ### + 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 + # 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 ### + + ## begin expire leaf vols ## + leaf_vols=($vol.leaf.*) + count=${#leaf_vols[@]} + leaf_limit_time=$(( EPOCHSECONDS - 60*60*24*60 )) # 60 days + leaf_new_limit_time=$(( EPOCHSECONDS - 60*60*24 * 5 )) # 5 days this + # goes backwards from oldest. leaf_new_limit_time is a safety + # measure to ensure we don't delete very recent leafs. + for leaf in ${leaf_vols[@]}; do + leaf_time=$(date -d ${leaf#"$vol".leaf.} +%s) + if (( leaf_limit_time > leaf_time || ( leaf_new_limit_time > leaf_time && count > 30 ) )); then + x btrfs sub del $leaf + fi + count=$((count-1)) + done fi - ### end check if leaf is different, delete it if not ### - - ## begin expire leaf vols ## - leaf_vols=($vol.leaf.*) - count=${#leaf_vols[@]} - leaf_limit_time=$(( EPOCHSECONDS - 60*60*24*60 )) # 60 days - leaf_new_limit_time=$(( EPOCHSECONDS - 60*60*24 * 5 )) # 5 days this - # goes backwards from oldest. leaf_new_limit_time is a safety - # measure to ensure we don't delete very recent leafs. - for leaf in ${leaf_vols[@]}; do - leaf_time=$(date -d ${leaf#"$vol".leaf.} +%s) - if (( leaf_limit_time > leaf_time || ( leaf_new_limit_time > leaf_time && count > 30 ) )); then - x btrfs sub del $leaf - fi - count=$((count-1)) - done ## end expire leaf vols ## fi #### end dealing with leaf vols #### @@ -472,6 +501,9 @@ for dir in /mnt/r7/amy/{root/root,boot/boot}_ubuntubionic /mnt/{root2/root,boot2 rm -f /nocow/btrfs-stale/$vol done +if (( ret >= 1 )); then + echo "$0: exit status $ret. see error above" +fi exit $ret