comparison etc/periodic/daily/800.scrub-zfs @ 354:a7dfa074dae1 origin

ADD: the original etc/periodic/daily/800.scrub-zfs from FreeBSD 13.1.
author Franz Glasner <fzglas.hg@dom66.de>
date Thu, 08 Dec 2022 00:50:15 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 354:a7dfa074dae1
1 #!/bin/sh
2 #
3 # $FreeBSD$
4 #
5
6 # If there is a global system configuration file, suck it in.
7 #
8
9 newline="
10 " # A single newline
11
12 if [ -r /etc/defaults/periodic.conf ]
13 then
14 . /etc/defaults/periodic.conf
15 source_periodic_confs
16 fi
17
18 : ${daily_scrub_zfs_default_threshold=35}
19
20 case "$daily_scrub_zfs_enable" in
21 [Yy][Ee][Ss])
22 echo
23 echo 'Scrubbing of zfs pools:'
24
25 if [ -z "${daily_scrub_zfs_pools}" ]; then
26 daily_scrub_zfs_pools="$(zpool list -H -o name)"
27 fi
28
29 rc=0
30 for pool in ${daily_scrub_zfs_pools}; do
31 # sanity check
32 _status=$(zpool list "${pool}" 2> /dev/null)
33 if [ $? -ne 0 ]; then
34 rc=2
35 echo " WARNING: pool '${pool}' specified in"
36 echo " '/etc/periodic.conf:daily_scrub_zfs_pools'"
37 echo " does not exist"
38 continue
39 fi
40 _status=${_status##*$newline}
41 case ${_status} in
42 *FAULTED*)
43 rc=3
44 echo "Skipping faulted pool: ${pool}"
45 continue ;;
46 *UNAVAIL*)
47 rc=4
48 echo "Skipping unavailable pool: ${pool}"
49 continue ;;
50 esac
51
52 # determine how many days shall be between scrubs
53 eval _pool_threshold=\${daily_scrub_zfs_$(echo "${pool}"|tr ".:-" "_")_threshold}
54 if [ -z "${_pool_threshold}" ];then
55 _pool_threshold=${daily_scrub_zfs_default_threshold}
56 fi
57
58 _last_scrub=$(zpool history ${pool} | \
59 egrep "^[0-9\.\:\-]{19} zpool scrub ${pool}\$" | tail -1 |\
60 cut -d ' ' -f 1)
61 if [ -z "${_last_scrub}" ]; then
62 # creation time of the pool if no scrub was done
63 _last_scrub=$(zpool history ${pool} | \
64 sed -ne '2s/ .*$//p')
65 fi
66 if [ -z "${_last_scrub}" ]; then
67 echo " skipping scrubbing of pool '${pool}':"
68 echo " can't get last scrubbing date"
69 continue
70 fi
71
72 # Now minus last scrub (both in seconds) converted to days.
73 _scrub_diff=$(expr -e \( $(date +%s) - \
74 $(date -j -v -70M -f %F.%T ${_last_scrub} +%s) \) / 60 / 60 / 24)
75 if [ ${_scrub_diff} -lt ${_pool_threshold} ]; then
76 echo " skipping scrubbing of pool '${pool}':"
77 echo " last scrubbing is ${_scrub_diff} days ago, threshold is set to ${_pool_threshold} days"
78 continue
79 fi
80
81 _status="$(zpool status ${pool} | grep scan:)"
82 case "${_status}" in
83 *"scrub in progress"*)
84 echo " scrubbing of pool '${pool}' already in progress, skipping:"
85 ;;
86 *"resilver in progress"*)
87 echo " resilvering of pool '${pool}' is in progress, skipping:"
88 ;;
89 *"none requested"*)
90 echo " starting first scrub (since reboot) of pool '${pool}':"
91 zpool scrub ${pool}
92 [ $rc -eq 0 ] && rc=1
93 ;;
94 *)
95 echo " starting scrub of pool '${pool}':"
96 zpool scrub ${pool}
97 [ $rc -eq 0 ] && rc=1
98 ;;
99 esac
100
101 echo " consult 'zpool status ${pool}' for the result"
102 done
103 ;;
104
105 *)
106 rc=0
107 ;;
108 esac
109
110 exit $rc