Improve BEADM LIST with space calculation. Simplified and fixed BEADM DESTROY. Other minor fixes.
This commit is contained in:
parent
dd13448ed1
commit
cad38f6720
157
beadm
157
beadm
|
|
@ -86,9 +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
|
### if ! zfs snapshot -r ${1}@${2##*/} 1> /dev/null 2> /dev/null # old #
|
||||||
|
FMT=$( date "+%Y-%m-%d-%H:%M:%S" ) # NEW #
|
||||||
|
if ! zfs snapshot -r ${1}@${FMT} 1> /dev/null 2> /dev/null # NEW #
|
||||||
then
|
then
|
||||||
echo "ERROR: Cannot create snapshot '${1}@${2##*/}'"
|
##### echo "ERROR: Cannot create snapshot '${1}@${2##*/}'" # old #
|
||||||
|
echo "ERROR: Cannot create snapshot '${1}@${FMT}'" # NEW #
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
@ -111,7 +114,8 @@ 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}
|
######### zfs clone -o canmount=off ${OPTS} ${FS}@${2##*/} ${DATASET} # old #
|
||||||
|
zfs clone -o canmount=off ${OPTS} ${FS}@${FMT} ${DATASET} # NEW #
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "Created successfully"
|
echo "Created successfully"
|
||||||
|
|
@ -138,16 +142,21 @@ BOOTFS=$( zpool list -H -o bootfs ${POOL} )
|
||||||
case ${1} in
|
case ${1} in
|
||||||
|
|
||||||
(list) # --------------------------------------------------------------------
|
(list) # --------------------------------------------------------------------
|
||||||
|
if [ ${#} -ne 1 ]
|
||||||
|
then
|
||||||
|
__usage
|
||||||
|
fi
|
||||||
BENAME_STARTS_WITH="${POOL}/ROOT"
|
BENAME_STARTS_WITH="${POOL}/ROOT"
|
||||||
LIST=$( zfs list -o name,used,mountpoint,creation -s creation -H -d 1 -r ${POOL}/ROOT | grep -E "^${POOL}/ROOT/" )
|
LIST=$( zfs list -o name,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 %5s %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 USED MOUNTPOINT Y m d H M
|
| while read NAME MOUNTPOINT Y m d H M
|
||||||
do
|
do
|
||||||
|
TOTAL=0
|
||||||
NAME=${NAME##*/}
|
NAME=${NAME##*/}
|
||||||
unset ACTIVE
|
unset ACTIVE
|
||||||
if [ "${BENAME_STARTS_WITH}/${NAME}" = "${ROOTFS}" ]
|
if [ "${BENAME_STARTS_WITH}/${NAME}" = "${ROOTFS}" ]
|
||||||
|
|
@ -167,9 +176,71 @@ case ${1} in
|
||||||
(N|NR) MOUNT="/" ;;
|
(N|NR) MOUNT="/" ;;
|
||||||
(*) MOUNT="-" ;;
|
(*) MOUNT="-" ;;
|
||||||
esac
|
esac
|
||||||
printf "%-10s %5s %-6s " ${MOUNT} ${USED} "static"
|
while read I
|
||||||
|
do
|
||||||
|
USED=$( zfs list -H -o used ${I} )
|
||||||
|
if [ ${USED} = "0" ]
|
||||||
|
then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "${USED}" in
|
||||||
|
(*K) SIZE=$( echo "${USED} * 1000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;;
|
||||||
|
(*M) SIZE=$( echo "${USED} * 1000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;;
|
||||||
|
(*G) SIZE=$( echo "${USED} * 1000000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;;
|
||||||
|
(*T) SIZE=$( echo "${USED} * 1000000000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;;
|
||||||
|
(*P) SIZE=$( echo "${USED} * 1000000000000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;;
|
||||||
|
(*E) SIZE=$( echo "${USED} * 1000000000000000000 " | tr -c -d '\[0-9]* .\n' | bc -l ) ;;
|
||||||
|
(*Z) SIZE=$( echo "${USED} * 1000000000000000000000" | tr -c -d '\[0-9]* .\n' | bc -l ) ;;
|
||||||
|
(*) SIZE="${USED}" ;;
|
||||||
|
esac
|
||||||
|
TOTAL=$( echo "${SIZE} + ${TOTAL}" | bc -l )
|
||||||
|
done << EOF
|
||||||
|
$( zfs list -H -t all -o name,origin -r "${BENAME_STARTS_WITH}/${NAME}" | tr '\t' '\n' | grep -v -E "^-$" )
|
||||||
|
EOF
|
||||||
|
RANGE=$( echo ${TOTAL} | cut -d . -f 1 )
|
||||||
|
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" ;;
|
||||||
|
(8|9|10) TOTAL="$( echo ${TOTAL} / 1000000 | bc -l | grep -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" ;;
|
||||||
|
(14|15|16) TOTAL="$( echo ${TOTAL} / 1000000000000 | bc -l | grep -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" ;;
|
||||||
|
(20|21|22) TOTAL="$( echo ${TOTAL} / 1000000000000000000 | bc -l | grep -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" ;;
|
||||||
|
esac
|
||||||
|
printf "%-10s %6s %-6s " ${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) # ------------------------------------------------------------------
|
||||||
|
|
@ -320,39 +391,75 @@ EOF
|
||||||
fi
|
fi
|
||||||
case ${CHOICE} in
|
case ${CHOICE} in
|
||||||
(Y|y|[Yy][Ee][Ss])
|
(Y|y|[Yy][Ee][Ss])
|
||||||
|
# delete snapshot or delete boot environment
|
||||||
if __be_snapshot ${POOL}/ROOT/${DESTROY}
|
if __be_snapshot ${POOL}/ROOT/${DESTROY}
|
||||||
then
|
then
|
||||||
|
# destroy desired snapshot
|
||||||
if ! zfs destroy -r ${POOL}/ROOT/${DESTROY} 1> /dev/null 2> /dev/null
|
if ! zfs destroy -r ${POOL}/ROOT/${DESTROY} 1> /dev/null 2> /dev/null
|
||||||
then
|
then
|
||||||
echo "ERROR: Snapshot '${2}' is origin for other boot environment(s)"
|
echo "ERROR: Snapshot '${2}' is origin for other boot environment(s)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
zfs list -r -H -o name ${POOL}/ROOT/${DESTROY} \
|
# promote clones dependent on snapshots used by destroyed boot environment
|
||||||
| sort -n -r \
|
zfs list -H -t all -o name,origin \
|
||||||
| while read DATASET
|
| while read NAME ORIGIN
|
||||||
do
|
do
|
||||||
zfs umount ${DATASET} 1> /dev/null 2> /dev/null || true
|
if echo "${ORIGIN}" | grep -q -E "${POOL}/ROOT/${DESTROY}(/.*@|@)" 2> /dev/null
|
||||||
done
|
|
||||||
ORIGINS=$( zfs list -r -H -o origin ${POOL}/ROOT/${DESTROY} )
|
|
||||||
if ! zfs destroy ${POOL}/ROOT/${DESTROY} 1> /dev/null 2> /dev/null
|
|
||||||
then
|
then
|
||||||
zfs destroy -r ${POOL}/ROOT/${DESTROY} 2>&1 \
|
zfs promote ${NAME}
|
||||||
| grep "${POOL}/ROOT/" \
|
|
||||||
| grep -v "@" \
|
|
||||||
| while read I
|
|
||||||
do
|
|
||||||
zfs promote ${I} 2> /dev/null
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
if [ "${ORIGINS}" != "-" ]
|
done
|
||||||
then
|
# get origins used by destroyed boot environment
|
||||||
|
ORIGINS=$( zfs list -H -t all -o origin -r ${POOL}/ROOT/${DESTROY} )
|
||||||
|
# destroy boot environment
|
||||||
|
zfs destroy -r ${POOL}/ROOT/${DESTROY}
|
||||||
|
# destroy origins used by destroyed boot environment
|
||||||
echo "${ORIGINS}" \
|
echo "${ORIGINS}" \
|
||||||
| while read I
|
| while read I
|
||||||
do
|
do
|
||||||
zfs destroy -r ${I} 2> /dev/null || true
|
zfs destroy ${I}
|
||||||
done
|
done
|
||||||
fi
|
############## # 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"
|
||||||
;;
|
;;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue