Fix problem with activating BE with extra datasets in the root

This commit is contained in:
Slawomir Wojciech Wojtczak (vermaden) 2012-04-30 02:44:04 +02:00
parent f69ee1cfc2
commit cab7c0a671
1 changed files with 19 additions and 6 deletions

25
beadm
View File

@ -57,7 +57,7 @@ __be_snapshot() { # 1=DATASET/SNAPSHOT
} }
__be_new() { # 1=SOURCE 2=TARGET __be_new() { # 1=SOURCE 2=TARGET
__be_snapshot && { __be_snapshot ${1} && {
zfs clone ${1} ${2} zfs clone ${1} ${2}
} || { } || {
zfs list -H -o name ${1}@${2##*/} 1> /dev/null 2> /dev/null && { zfs list -H -o name ${1}@${2##*/} 1> /dev/null 2> /dev/null && {
@ -70,13 +70,13 @@ __be_new() { # 1=SOURCE 2=TARGET
} }
zfs clone ${1}@${2##*/} ${2} zfs clone ${1}@${2##*/} ${2}
} }
BASENAME=${1##*/}
zfs list -H -o name -t filesystem -r ${1} \ zfs list -H -o name -t filesystem -r ${1} \
| grep -v -E "${1}$" \ | grep -v -E "${1}$" \
| while read I | while read I
do do
DATASET=$( echo ${I} | sed s/"${POOL}\/ROOT\/${BASENAME}\/"//g ) DATASET=$( echo ${I} | sed s/"${POOL}\/ROOT\/${1##*/}\/"//g )
zfs clone ${I}@${2##*/} ${2}/${DATASET} zfs clone ${I}@${2##*/} ${2}/${DATASET}
zfs set canmount=noauto ${2}/${DATASET}
done done
echo "Created successfully" echo "Created successfully"
} }
@ -143,6 +143,7 @@ case ${1} in
esac esac
;; ;;
(activate) # ---------------------------------------------------------------- (activate) # ----------------------------------------------------------------
__be_exist ${POOL}/ROOT/${2}
[ "${BOOTFS}" = "${POOL}/ROOT/${2}" ] || { [ "${BOOTFS}" = "${POOL}/ROOT/${2}" ] || {
[ "${ROOTFS}" = "${POOL}/ROOT/${2}" ] || { [ "${ROOTFS}" = "${POOL}/ROOT/${2}" ] || {
MNT="/tmp/BE" MNT="/tmp/BE"
@ -151,8 +152,10 @@ case ${1} in
exit 1 exit 1
} }
zfs set mountpoint=${MNT} ${POOL}/ROOT/${2} zfs set mountpoint=${MNT} ${POOL}/ROOT/${2}
cp /boot/zfs/zpool.cache ${MNT}/boot/zfs/zpool.cache cp /boot/zfs/zpool.cache ${MNT}/boot/zfs/zpool.cache 2> /dev/null
sed -i '' -E s/"^vfs.root.mountfrom=.*$"/"vfs.root.mountfrom=\"zfs:${POOL}\/ROOT\/${2##*/}\""/g ${MNT}/boot/loader.conf LOADER_CONFIGS=${MNT}/boot/loader.conf
[ -f ${MNT}/boot/loader.conf.local ] && LOADER_CONFIGS="${LOADER_CONFIGS} ${MNT}/boot/loader.conf.local"
sed -i '' -E s/"^vfs.root.mountfrom=.*$"/"vfs.root.mountfrom=\"zfs:${POOL}\/ROOT\/${2##*/}\""/g ${LOADER_CONFIGS} 2> /dev/null
zfs set mountpoint=legacy ${POOL}/ROOT/${2} zfs set mountpoint=legacy ${POOL}/ROOT/${2}
} }
zpool set bootfs=${POOL}/ROOT/${2} ${POOL} && { zpool set bootfs=${POOL}/ROOT/${2} ${POOL} && {
@ -161,10 +164,20 @@ case ${1} in
exit 1 exit 1
} }
} }
zfs list -H -o name -r sys/ROOT \
| grep -v "${POOL}/ROOT/${2}" \
| while read I
do
zfs set canmount=noauto ${I}
done
zfs list -H -o name -t filesystem -r ${POOL}/ROOT/${2} \ zfs list -H -o name -t filesystem -r ${POOL}/ROOT/${2} \
| while read I | while read I
do do
zfs promote ${POOL}/ROOT/${2} 2> /dev/null MOUNT=$( echo ${I} | sed s/"${POOL}\/ROOT\/${2}"//g )
zfs set canmount=noauto ${I}
[ "$MOUNT" = "" ] || zfs set mountpoint=${MOUNT} ${I}
zfs set canmount=on ${I} 2> /dev/null
zfs promote ${I} 2> /dev/null
done done
echo "Activated successfully" echo "Activated successfully"
;; ;;