misc config updates
[distro-setup] / filesystem / etc / cron.weekly / btrfs-balance-ian
1 #!/bin/bash
2 set -eE -o pipefail
3 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
4
5 # inspired from
6 # https://github.com/kdave/btrfsmaintenance
7
8
9 # Man page says we could also use a range, i suppose it would be
10 # logical to use a pattern like 5..10 10..20,
11 # but I don't know if this would help us at all.
12 dusage="1 5 10 20 30 40 50"
13 musage="1 5 10 20 30"
14
15 e() { echo "$*"; "$@"; }
16
17 fnd="findmnt --types btrfs --noheading"
18 for x in $($fnd --output "SOURCE" --nofsroot | sort -u); do
19 mnt=$($fnd --output "TARGET" --first-only --source $x)
20 [[ $mnt ]] || continue
21 echo "Before balance of $mnt"
22 e btrfs filesystem df $mnt
23 df -H $mnt
24 if btrfs filesystem df $mnt | grep -q "Data+Metadata"; then
25 for usage in $dusage; do
26 e btrfs balance start -v -dusage=$usage -musage=$usage $mnt
27 done
28 else
29 e btrfs balance start -dusage=0 $mnt
30 for usage in $dusage; do
31 e btrfs balance start -v -dusage=$usage $mnt
32 done
33 e btrfs balance start -musage=0 $mnt
34 for usage in $musage; do
35 e btrfs balance start -v -musage=$usage $mnt
36 done
37 fi
38 echo "After balance of $mnt"
39 btrfs filesystem df $mnt
40 df -H $mnt
41
42 date=$(
43 btrfs scrub status $mnt | \
44 sed -rn 's/^\s*scrub started at (.*) and finished.*/\1/p'
45 )
46 if [[ $date ]]; then
47 date=$(date --date="$date" +%s)
48 # if date is sooner than 30 days ago
49 if (( $date > `date +%s` - 60*60*24*30 )); then
50 echo "skiping scrub of $mnt"
51 continue
52 fi
53 fi
54 btrfs scrub start -Bd $mnt
55 done