Calculate exact size only with BEADM LIST -S because its slow. Other minor fixes.

This commit is contained in:
Slawomir Wojciech Wojtczak (vermaden) 2012-08-11 23:38:40 +02:00
parent c8b5290552
commit 625d62f7af
1 changed files with 51 additions and 120 deletions

145
beadm
View File

@ -43,7 +43,7 @@ __usage() {
echo " ${NAME} create [-e nonActiveBe | -e beName@snapshot] beName" echo " ${NAME} create [-e nonActiveBe | -e beName@snapshot] beName"
echo " ${NAME} create beName@snapshot" echo " ${NAME} create beName@snapshot"
echo " ${NAME} destroy [-F] beName | beName@snapshot" echo " ${NAME} destroy [-F] beName | beName@snapshot"
echo " ${NAME} list" echo " ${NAME} list [-S]"
echo " ${NAME} mount" echo " ${NAME} mount"
echo " ${NAME} mount beName [mountpoint]" echo " ${NAME} mount beName [mountpoint]"
echo " ${NAME} umount | unmount [-f] beName" echo " ${NAME} umount | unmount [-f] beName"
@ -51,7 +51,7 @@ __usage() {
exit 1 exit 1
} }
# check if BE exists # check if boot environment exists
__be_exist() { # 1=DATASET __be_exist() { # 1=DATASET
if ! zfs list -H -o name ${1} 1> /dev/null 2> /dev/null if ! zfs list -H -o name ${1} 1> /dev/null 2> /dev/null
then then
@ -65,7 +65,7 @@ __be_snapshot() { # 1=DATASET/SNAPSHOT
echo "${1}" | grep -q "@" echo "${1}" | grep -q "@"
} }
# create new BE # create new boot environment
__be_new() { # 1=SOURCE 2=TARGET __be_new() { # 1=SOURCE 2=TARGET
local SOURCE=$( echo ${1} | cut -d '@' -f 1 ) local SOURCE=$( echo ${1} | cut -d '@' -f 1 )
if __be_snapshot ${1} if __be_snapshot ${1}
@ -86,12 +86,12 @@ __be_new() { # 1=SOURCE 2=TARGET
echo "ERROR: Snapshot '${1}@${2##*/}' already exists" echo "ERROR: Snapshot '${1}@${2##*/}' already exists"
exit 1 exit 1
fi fi
### if ! zfs snapshot -r ${1}@${2##*/} 1> /dev/null 2> /dev/null # old #
FMT=$( date "+%Y-%m-%d-%H:%M:%S" ) # NEW # FMT=$( date "+%Y-%m-%d-%H:%M:%S" ) # NEW #
if ! zfs snapshot -r ${1}@${FMT} 1> /dev/null 2> /dev/null # NEW # if ! zfs snapshot -r ${1}@${FMT} 1> /dev/null 2> /dev/null # NEW #
# if ! zfs snapshot -r ${1}@${2##*/} 1> /dev/null 2> /dev/null # old #
then then
##### echo "ERROR: Cannot create snapshot '${1}@${2##*/}'" # old #
echo "ERROR: Cannot create snapshot '${1}@${FMT}'" # NEW # echo "ERROR: Cannot create snapshot '${1}@${FMT}'" # NEW #
# echo "ERROR: Cannot create snapshot '${1}@${2##*/}'" # old #
exit 1 exit 1
fi fi
fi fi
@ -103,7 +103,7 @@ __be_new() { # 1=SOURCE 2=TARGET
do do
local OPTS="-o ${PROPERTY}=${VALUE} ${OPTS}" local OPTS="-o ${PROPERTY}=${VALUE} ${OPTS}"
done << EOF done << EOF
$( zfs get -o name,property,value -s local,received -H all ${FS} | grep -v -E "(canmount)" ) $( zfs get -o name,property,value -s local,received -H all ${FS} | grep -v -E "canmount" )
EOF EOF
DATASET=$( echo ${FS} | awk '{print $1}' | sed -E s/"^${POOL}\/ROOT\/${SOURCE##*/}"/"${POOL}\/ROOT\/${2##*/}"/g ) DATASET=$( echo ${FS} | awk '{print $1}' | sed -E s/"^${POOL}\/ROOT\/${SOURCE##*/}"/"${POOL}\/ROOT\/${2##*/}"/g )
if [ "${OPTS}" = "-o = " ] if [ "${OPTS}" = "-o = " ]
@ -114,7 +114,7 @@ EOF
then then
zfs clone -o canmount=off ${OPTS} ${FS}@${1##*@} ${DATASET} zfs clone -o canmount=off ${OPTS} ${FS}@${1##*@} ${DATASET}
else else
######### zfs clone -o canmount=off ${OPTS} ${FS}@${2##*/} ${DATASET} # old # # zfs clone -o canmount=off ${OPTS} ${FS}@${2##*/} ${DATASET} # old #
zfs clone -o canmount=off ${OPTS} ${FS}@${FMT} ${DATASET} # NEW # zfs clone -o canmount=off ${OPTS} ${FS}@${FMT} ${DATASET} # NEW #
fi fi
done done
@ -123,7 +123,7 @@ EOF
ROOTFS=$( mount | awk '/ \/ / {print $1}' ) ROOTFS=$( mount | awk '/ \/ / {print $1}' )
if echo ${ROOTFS} | grep -q -E "^/dev/" if echo ${ROOTFS} | grep -q -m 1 -E "^/dev/"
then then
echo "ERROR: This system does not boot from ZFS pool" echo "ERROR: This system does not boot from ZFS pool"
exit 1 exit 1
@ -142,23 +142,23 @@ BOOTFS=$( zpool list -H -o bootfs ${POOL} )
case ${1} in case ${1} in
(list) # -------------------------------------------------------------------- (list) # --------------------------------------------------------------------
if [ ${#} -ne 1 ] if [ ${#} -ne 1 -a "${2}" != "-S" ]
then then
__usage __usage
fi fi
BENAME_STARTS_WITH="${POOL}/ROOT" BENAME_STARTS_WITH="${POOL}/ROOT"
LIST=$( zfs list -o name,mountpoint,creation -s creation -H -d 1 -r ${POOL}/ROOT | grep -E "^${POOL}/ROOT/" ) LIST=$( zfs list -o name,used,mountpoint,creation -s creation -H -d 1 -r ${POOL}/ROOT | grep -E "^${POOL}/ROOT/" )
WIDTH_CREATION=$( echo "${LIST}" | awk '{print $5}' | wc -L ) WIDTH_CREATION=$( echo "${LIST}" | awk '{print $5}' | wc -L )
WIDTH_NAME=$( echo "${LIST}" | awk '{print $1}' | wc -L ) WIDTH_NAME=$( echo "${LIST}" | awk '{print $1}' | wc -L )
WIDTH_NAME=$(( ${WIDTH_NAME} - ${#BENAME_STARTS_WITH} - 1 )) WIDTH_NAME=$(( ${WIDTH_NAME} - ${#BENAME_STARTS_WITH} - 1 ))
printf "%-${WIDTH_NAME}s %-6s %-10s %6s %6s %s\n" \ printf "%-${WIDTH_NAME}s %-6s %-10s %6s %6s %s\n" \
BE Active Mountpoint Space Policy Created BE Active Mountpoint Space Policy Created
echo "${LIST}" \ echo "${LIST}" \
| while read NAME MOUNTPOINT Y m d H M | while read NAME USED MOUNTPOINT Y m d H M
do do
TOTAL=0 TOTAL=0
NAME=${NAME##*/} NAME=${NAME##*/}
unset ACTIVE ACTIVE=''
if [ "${BENAME_STARTS_WITH}/${NAME}" = "${ROOTFS}" ] if [ "${BENAME_STARTS_WITH}/${NAME}" = "${ROOTFS}" ]
then then
ACTIVE="${ACTIVE}N" ACTIVE="${ACTIVE}N"
@ -171,76 +171,50 @@ case ${1} in
then then
ACTIVE="-" ACTIVE="-"
fi fi
printf "%-${WIDTH_NAME}s %-6s " ${NAME} ${ACTIVE}
case ${ACTIVE} in case ${ACTIVE} in
(N|NR) MOUNT="/" ;; (N|NR) MOUNT="/" ;;
(*) MOUNT="-" ;; (*) MOUNT="-" ;;
esac esac
if [ "${2}" = "-S" ]
then
USED_ALL=$( zfs list -H -t all -o name,used )
while read I while read I
do do
USED=$( zfs list -H -o used ${I} ) USED=$( echo "${USED_ALL}" | grep -m 1 -E "^${I}" | awk '{print $2}' )
if [ ${USED} = "0" ] if [ ${USED} = "0" ]
then then
continue continue
fi fi
case "${USED}" in case "${USED}" in
(*K) SIZE=$( echo "${USED} * 1000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;; (*K) USED=$( echo "${USED} * 10" | sed s/K// | bc | cut -d '.' -f 1 ); USED=$(( ${USED} * 100 )) ;;
(*M) SIZE=$( echo "${USED} * 1000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;; (*M) USED=$( echo "${USED} * 10" | sed s/M// | bc | cut -d '.' -f 1 ); USED=$(( ${USED} * 100000 )) ;;
(*G) SIZE=$( echo "${USED} * 1000000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;; (*G) USED=$( echo "${USED} * 10" | sed s/G// | bc | cut -d '.' -f 1 ); USED=$(( ${USED} * 100000000 )) ;;
(*T) SIZE=$( echo "${USED} * 1000000000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;; (*T) USED=$( echo "${USED} * 10" | sed s/T// | bc | cut -d '.' -f 1 ); USED=$(( ${USED} * 100000000000 )) ;;
(*P) SIZE=$( echo "${USED} * 1000000000000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;; (*P) USED=$( echo "${USED} * 10" | sed s/P// | bc | cut -d '.' -f 1 ); USED=$(( ${USED} * 100000000000000 )) ;;
(*E) SIZE=$( echo "${USED} * 1000000000000000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;; (*E) USED=$( echo "${USED} * 10" | sed s/E// | bc | cut -d '.' -f 1 ); USED=$(( ${USED} * 100000000000000000 )) ;;
(*Z) SIZE=$( echo "${USED} * 1000000000000000000000" | tr -c -d '\[0-9]* .\n' | bc -l ) ;; # 100000000000000000 is maximum that is supported by $(( ))
(*) SIZE="${USED}" ;; (*Z) USED=$( echo "${USED} * 10000000000000000000" | sed s/Z// | bc ) ;;
esac esac
TOTAL=$( echo "${SIZE} + ${TOTAL}" | bc -l ) TOTAL=$(( $( echo ${USED} | cut -d '.' -f 1 ) + ${TOTAL} ))
done << EOF done << EOF
$( zfs list -H -t all -o name,origin -r "${BENAME_STARTS_WITH}/${NAME}" | tr '\t' '\n' | grep -v -E "^-$" ) $( zfs list -H -t all -o name,origin -r "${BENAME_STARTS_WITH}/${NAME}" | tr '\t' '\n' | grep -v "^-$" )
EOF EOF
RANGE=$( echo ${TOTAL} | cut -d . -f 1 ) RANGE=$( echo ${TOTAL} | cut -d . -f 1 )
case $( echo "${RANGE}" | wc -c | tr -c -d '[0-9]\n' ) in case $( echo "${RANGE}" | wc -c | tr -c -d '[0-9]\n' ) in
(5|6|7) TOTAL="$( echo ${TOTAL} / 1000 | bc -l | grep -o -E "[0-9]*\.[0-9]{1}" )K" ;; (5|6|7) TOTAL="$( echo ${TOTAL} / 1000 | bc -l | grep -m 1 -o -E "[0-9]*\.[0-9]{1}" )K" ;;
(8|9|10) TOTAL="$( echo ${TOTAL} / 1000000 | bc -l | grep -o -E "[0-9]*\.[0-9]{1}" )M" ;; (8|9|10) TOTAL="$( echo ${TOTAL} / 1000000 | bc -l | grep -m 1 -o -E "[0-9]*\.[0-9]{1}" )M" ;;
(11|12|13) TOTAL="$( echo ${TOTAL} / 1000000000 | bc -l | grep -o -E "[0-9]*\.[0-9]{1}" )G" ;; (11|12|13) TOTAL="$( echo ${TOTAL} / 1000000000 | bc -l | grep -m 1 -o -E "[0-9]*\.[0-9]{1}" )G" ;;
(14|15|16) TOTAL="$( echo ${TOTAL} / 1000000000000 | bc -l | grep -o -E "[0-9]*\.[0-9]{1}" )T" ;; (14|15|16) TOTAL="$( echo ${TOTAL} / 1000000000000 | bc -l | grep -m 1 -o -E "[0-9]*\.[0-9]{1}" )T" ;;
(17|18|19) TOTAL="$( echo ${TOTAL} / 1000000000000000 | bc -l | grep -o -E "[0-9]*\.[0-9]{1}" )P" ;; (17|18|19) TOTAL="$( echo ${TOTAL} / 1000000000000000 | bc -l | grep -m 1 -o -E "[0-9]*\.[0-9]{1}" )P" ;;
(20|21|22) TOTAL="$( echo ${TOTAL} / 1000000000000000000 | bc -l | grep -o -E "[0-9]*\.[0-9]{1}" )E" ;; (20|21|22) TOTAL="$( echo ${TOTAL} / 1000000000000000000 | bc -l | grep -m 1 -o -E "[0-9]*\.[0-9]{1}" )E" ;;
(23|24|25) TOTAL="$( echo ${TOTAL} / 1000000000000000000000 | bc -l | grep -o -E "[0-9]*\.[0-9]{1}" )Z" ;; (23|24|25) TOTAL="$( echo ${TOTAL} / 1000000000000000000000 | bc -l | grep -m 1 -o -E "[0-9]*\.[0-9]{1}" )Z" ;;
esac esac
printf "%-10s %6s %-6s " ${MOUNT} ${TOTAL} "static" else
TOTAL=${USED}
fi
printf "%-${WIDTH_NAME}s %-6s %-10s %6s %-6s " ${NAME} ${ACTIVE} ${MOUNT} ${TOTAL} "static"
date -j -f "%a %b %d %H:%M %Y" "${Y} ${m} ${d} ${H} ${M}" +"%Y-%m-%d %H:%M" date -j -f "%a %b %d %H:%M %Y" "${Y} ${m} ${d} ${H} ${M}" +"%Y-%m-%d %H:%M"
done done
####### LIST=$( zfs list -o name,used,mountpoint,creation -s creation -H -d 1 -r ${POOL}/ROOT | grep -E "^${POOL}/ROOT/" )
####### WIDTH_CREATION=$( echo "${LIST}" | awk '{print $5}' | wc -L )
####### WIDTH_NAME=$( echo "${LIST}" | awk '{print $1}' | wc -L )
####### WIDTH_NAME=$(( ${WIDTH_NAME} - ${#BENAME_STARTS_WITH} - 1 ))
####### printf "%-${WIDTH_NAME}s %-6s %-10s %5s %6s %s\n" \
####### BE Active Mountpoint Space Policy Created
####### echo "${LIST}" \
####### | while read NAME USED MOUNTPOINT Y m d H M
####### do
####### NAME=${NAME##*/}
####### unset ACTIVE
####### if [ "${BENAME_STARTS_WITH}/${NAME}" = "${ROOTFS}" ]
####### then
####### ACTIVE="${ACTIVE}N"
####### fi
####### if [ "${BENAME_STARTS_WITH}/${NAME}" = "${BOOTFS}" ]
####### then
####### ACTIVE="${ACTIVE}R"
####### fi
####### if [ -z "${ACTIVE}" ]
####### then
####### ACTIVE="-"
####### fi
####### printf "%-${WIDTH_NAME}s %-6s " ${NAME} ${ACTIVE}
####### case ${ACTIVE} in
####### (N|NR) MOUNT="/" ;;
####### (*) MOUNT="-" ;;
####### esac
####### printf "%-10s %5s %-6s " ${MOUNT} ${USED} "static"
####### date -j -f "%a %b %d %H:%M %Y" "${Y} ${m} ${d} ${H} ${M}" +"%Y-%m-%d %H:%M"
####### done
;; ;;
(create) # ------------------------------------------------------------------ (create) # ------------------------------------------------------------------
@ -411,58 +385,15 @@ EOF
fi fi
done done
# get origins used by destroyed boot environment # get origins used by destroyed boot environment
ORIGINS=$( zfs list -H -t all -o origin -r ${POOL}/ROOT/${DESTROY} ) ORIGINS=$( zfs list -H -t all -o origin -r ${POOL}/ROOT/${DESTROY} | grep -v '^-$' )
# destroy boot environment # destroy boot environment
zfs destroy -r ${POOL}/ROOT/${DESTROY} zfs destroy -r ${POOL}/ROOT/${DESTROY}
# destroy origins used by destroyed boot environment # destroy origins used by destroyed boot environment
echo "${ORIGINS}" \ echo "${ORIGINS}" \
| while read I | while read I
do do
if [ "${I}" != "-" ]
then
zfs destroy ${I} zfs destroy ${I}
fi
done done
############## # destroy desired boot environment
############## zfs list -r -H -o name ${POOL}/ROOT/${DESTROY} \
############## | sort -n -r \
############## | while read DATASET
############## do
############## zfs umount ${DATASET} 1> /dev/null 2> /dev/null || true
############## done
############## # get origins that needs to be deleted
############## ORIGINS=$( zfs list -r -H -o origin ${POOL}/ROOT/${DESTROY} )
############## # promote dependent clones
############## zfs list -H -o name,origin \
############## | awk -v destroy=${POOL}/ROOT/${DESTROY} '$2 ~ destroy {print $1}' \
############## | sort -r \
############## | while read I
############## do
############## echo PROMOTE 1: $I
############## zfs promote ${I} 2> /dev/null
############## done
############## # destroy desired boot environment
############## if ! zfs destroy ${POOL}/ROOT/${DESTROY} 1> /dev/null 2> /dev/null
############## then
############## # promote dependent clones when needed
############## zfs destroy -r ${POOL}/ROOT/${DESTROY} 2>&1 \
############## | grep "${POOL}/ROOT/" \
############## | grep -v "@" \
############## | while read I
############## do
############## echo PROMOTE 2: $I
############## zfs promote ${I} 2> /dev/null
############## done
############## fi
############## # destroy origins that needs to be deleted
############## if [ "${ORIGINS}" != "-" ]
############## then
############## echo "${ORIGINS}" \
############## | while read I
############## do
############## zfs destroy -r ${I} 2> /dev/null || true
############## done
############## fi
fi fi
echo "Destroyed successfully" echo "Destroyed successfully"
;; ;;