Ok, here's the code. It's not perfected by any means, but it's already saved me once... in removing all the unnecessary packages from dpkg
using apt
, each removal triggered a snapshot, and the snapshots built up until there was no more space for snapshots and hard drive space used was 12.3 GB (yes, as I removed stuff, hard drive space used went up!).
Using my zfsflush.sh code and the code below, I was able to whittle it down to only one large snapshot (as you remove a snapshot, its contents get incorporated into other snapshots with redundancies removed), total hard drive space used is only 5.15 GB and the system is now saving snapshots again.
#!/bin/bash
# Manual zsysctl gc
clear
garbagespace=
kernelscount=
kernelstrim=
chosenpool=rpool
check () {
echo "These are your pools:"
sudo zpool list -Ho name
read -p "Which ZFS pool would you like to work on? " chosenpool
garbagespace=$(sudo zpool list -o capacity $chosenpool | awk '{if (NR==2) {print substr($1, 1, length($1)-1)}}')
kernelscount=$(zsysctl show --full | grep -c -C 2 Kernel)
kernelscount=$((kernelscount-1))
clear
echo "Your" $chosenpool "is" $garbagespace% "full."
echo "You have $kernelscount kernel snapshots available to be removed."
echo ""
}
empty () {
garbagespace=$(zpool list | awk -F '[% ]+' '/$chosenpool/ {print $8}')
kernelscount=$(zsysctl show --full | grep -c -C 2 Kernel)
kernelscount=$((kernelscount-1))
if [[ $garbagespace -gt 50 ]]
then
echo "How many snapshots would you like to trim?"
echo "0 - $kernelscount"
while :; do
read kernelstrim
[[ $kernelstrim =~ ^[0-9]+$ ]] || { echo "Enter a valid number!"; continue; }
if ((kernelstrim >= 0 && kernelstrim <= (kernelscount))); then
break
else
echo "Number out of range, try again!"
fi
done
if [[ $kernelstrim -gt 0 ]]
then
clear
echo ""
echo "Collecting Garbage"
echo ""
sudo zsysctl show --full | grep -C 2 Kernel | grep $chosenpool | tac | grep $chosenpool -m $kernelstrim | awk -F '[_ ]+' /${chosenpool}/''' {print $5}'| xargs -n1 zsysctl state remove -s
echo ""
echo "Done."
echo ""
elif [[ $kernelstrim = 0 ]]
then
clear
echo ""
echo "Cancelled" >&2
echo ""
fi
else
clear
echo $chosenpool "is less than 50% full"
echo "Do you still want to trim snapshots?"
read trimanswer
if [[ $trimanswer = yes ]] || [[ $trimanswer = y ]]
then
clear
echo "How many snapshots would you like to trim?"
echo "0 - $kernelscount"
while :; do
read kernelstrim
[[ $kernelstrim =~ ^[0-9]+$ ]] || { echo "Enter a valid number!"; continue; }
if ((kernelstrim >= 0 && kernelstrim <= (kernelscount))); then
break
else
echo "Number out of range, try again!"
fi
done
if [[ $kernelstrim -gt 0 ]]
then
clear
echo ""
echo "Collecting Garbage"
echo ""
sudo zsysctl show --full | grep -C 2 Kernel | grep $chosenpool | tac | grep $chosenpool -m $kernelstrim | awk -F '[_ ]+' /${chosenpool}/''' {print $5}'| xargs -n1 zsysctl state remove -s
echo ""
echo "Done."
echo ""
elif [[ $kernelstrim = 0 ]]
then
clear
echo ""
echo "Cancelled"
echo ""
fi
fi
fi
}
clear
echo "This script:"
echo "A) Allows you to check space used by snapshots on each pool."
echo "B) Allows you to check how many kernel shapshots you have."
echo "C) Allows you to delete all but one kernel snapshot"
while true; do
options=("Check Garbage" "Empty Garbage" "Quit")
echo "Choose an option: "
select opt in "${options[@]}"; do
case $REPLY in
1) check; break ;;
2) empty; break ;;
3) break 2 ;;
*) echo "Invalid Option!" >&2
esac
done
done
echo "Exiting..."
sleep 3