Implement even more accurate space calculation.

This commit is contained in:
Slawomir Wojciech Wojtczak (vermaden) 2012-08-29 21:24:59 +02:00
parent 90c41c7186
commit 0dc9e6737a
1 changed files with 46 additions and 25 deletions

49
beadm
View File

@ -197,17 +197,18 @@ case ${1} in
fi
fi
# get list of USEDBYDATASET and USED properties
USED_ALL=$( zfs list -H -t all -o name,usedbydataset,used -r sys/ROOT \
USED_ALL=$( zfs list -H -t all -o name,usedbydataset,usedbysnapshots,used -r sys/ROOT \
| sed 1d \
| sed '/0$/d' \
| awk '{ gsub("-"," 0 0 ",$2); gsub("-"," 0 0 ",$3);
gsub("K"," 1 ",$2); gsub("K"," 1 ",$3);
gsub("M"," 1024 ",$2); gsub("M"," 1024 ",$3);
gsub("G"," 1048576 ",$2); gsub("G"," 1048576 ",$3);
gsub("T"," 1073741824 ",$2); gsub("T"," 1073741824 ",$3);
gsub("P"," 1099511627776 ",$2); gsub("P"," 1099511627776 ",$3);
gsub("E"," 1125899906842624 ",$2); gsub("E"," 1125899906842624 ",$3);
gsub("Z"," 1152921504606846976 ",$2); gsub("Z"," 1152921504606846976 ",$3);
| sed '/-$/d' \
| awk '{ gsub("-"," 0 0 ",$2); gsub("-"," 0 0 ",$3); gsub("-"," 0 0 ",$4);
gsub("K"," 1 ",$2); gsub("K"," 1 ",$3); gsub("K"," 1 ",$4)
gsub("M"," 1024 ",$2); gsub("M"," 1024 ",$3); gsub("M"," 1024 ",$4);
gsub("G"," 1048576 ",$2); gsub("G"," 1048576 ",$3); gsub("G"," 1048576 ",$4);
gsub("T"," 1073741824 ",$2); gsub("T"," 1073741824 ",$3); gsub("T"," 1073741824 ",$4);
gsub("P"," 1099511627776 ",$2); gsub("P"," 1099511627776 ",$3); gsub("P"," 1099511627776 ",$4);
gsub("E"," 1125899906842624 ",$2); gsub("E"," 1125899906842624 ",$3); gsub("E"," 1125899906842624 ",$4);
gsub("Z"," 1152921504606846976 ",$2); gsub("Z"," 1152921504606846976 ",$3); gsub("Z"," 1152921504606846976 ",$4);
print $0;
}' )
# get the list of names and origins for all boot environments
@ -256,12 +257,32 @@ case ${1} in
# use the USED field from ZFS LIST
TOTAL=${USED}
else
# calculate space total usage for boot environment
TOTAL=$( echo "${USED_ALL}" \
# calculate overhead space usage for boot environment
OVERHEAD=$( echo "${USED_ALL}" \
| grep "^${POOL}\/ROOT\/${NAME}" \
| grep -v "@" \
| awk \
'BEGIN {overhead = 0}
{overhead += $4 * $5}
END {print overhead}' )
# calculate snapshots space usage for boot environment
SNAPS=$( echo "${USED_ALL}" \
| grep "^${POOL}\/ROOT\/${NAME}" \
| grep "@" \
| awk \
'BEGIN {snaps = 0}
{snaps += $6 * $7}
END {print snaps}' )
# calculate space usage for boot environment datasets
USED=$( echo "${USED_ALL}" \
| awk -v name="^${POOL}\/ROOT\/${NAME}" -v snapshot="@${SNAPSHOT}$" \
'BEGIN {total = 0}
($1 ~ name) {total += $2 * $3}
($1 ~ snapshot) {total += $4 * $5}
'BEGIN {used = 0}
($1 ~ name) {used += $2 * $3}
($1 ~ snapshot) {used += $6 * $7}
END {print used}' )
# calculate total space usage for boot environment
TOTAL=$( echo | awk -v used=${USED} -v snaps=${SNAPS} -v overhead=${OVERHEAD} \
'BEGIN {total = used + overhead - snaps}
END {
if (total <= 1024) { unit = "K"; }
else if (total <= 1048576) { total = total / 1024; unit = "M"; }