Improve ZFS diagnostics, import and mounting

Make ZFS only import the specified pool
Set zfsutil when mounting non-legacy rootfs
Check for /sbin/zpool in addition to /sbin/zfs
Print information messages when ZFS pools are imported
Prompt user when mounting a ZFS filesystem without ZFS support
Verify that <dataset> in real_root=ZFS=<dataset> is a filesystem
cleanup-cruft
Richard Yao 13 years ago
parent 0f399f48ff
commit 6968584a58

@ -654,11 +654,29 @@ startVolumes() {
if [ "${USE_ZFS}" = '1' ] if [ "${USE_ZFS}" = '1' ]
then then
if [ -e '/sbin/zpool' ] if [ -z "${ZFS_POOL}" ];
then then
/sbin/zpool import -N -a ${ZPOOL_FORCE} good_msg "Importing ZFS pools"
/sbin/zpool import -N -a "${ZPOOL_FORCE}"
if [ "$?" = '0' ]
then
good_msg "Importing ZFS pools succeeded"
else
bad_msg "Imported ZFS pools failed"
fi
else else
bad_msg "zpool not found: skipping ZFS pool import!" good_msg "Importing ZFS pool ${ZFS_POOL}"
/sbin/zpool import -N "${ZPOOL_FORCE}" "${ZFS_POOL}"
if [ "$?" = '0' ]
then
good_msg "Importing ${ZFS_POOL} succeeded"
else
bad_msg "Importing ${ZFS_POOL} failed"
fi
fi fi
fi fi
} }

@ -251,6 +251,11 @@ fi
# Set variables based on the value of REAL_ROOT # Set variables based on the value of REAL_ROOT
case "${REAL_ROOT}" in case "${REAL_ROOT}" in
ZFS*) ZFS*)
ZFS_POOL=${REAL_ROOT#*=}
ZFS_POOL=${ZFS_POOL%%/*}
USE_ZFS=1
;;
ZFS)
USE_ZFS=1 USE_ZFS=1
;; ;;
esac esac
@ -258,12 +263,15 @@ esac
# Verify that it is safe to use ZFS # Verify that it is safe to use ZFS
if [ "USE_ZFS" = "1" ] if [ "USE_ZFS" = "1" ]
then then
if [ -x /sbin/zfs ] if [ -x /sbin/zfs -a -x /sbin/zpool ]
then then
MY_HWOPTS="${MY_HWOPTS} zfs" MY_HWOPTS="${MY_HWOPTS} zfs"
else else
bad_msg 'zfs binary not found: aborting use of zfs!'
USE_ZFS=0 USE_ZFS=0
[ -x /sbin/zfs ] || bad_msg '/sbin/zfs not found!'
[ -x /sbin/zpool ] || bad_msg '/sbin/zpool not found!'
bad_msg 'Aborting use of zfs!'
fi fi
fi fi
@ -486,16 +494,24 @@ do
fi fi
;; ;;
ZFS*) ZFS*)
if [ "${USE_ZFS}" = '0' ]; then
prompt_user "REAL_ROOT" "root block device"
continue
fi
ROOT_DEV="${REAL_ROOT#*=}" ROOT_DEV="${REAL_ROOT#*=}"
if [ "${ROOT_DEV}" != 'ZFS' ] if [ "${ROOT_DEV}" != 'ZFS' ]
then then
zfs get type ${ROOT_DEV} > /dev/null if [ "$(zfs get type -o value -H ${ROOT_DEV})" = 'filesystem' ]
if [ "$?" = '0' ]
then then
got_good_root=1; got_good_root=1;
REAL_ROOT=${ROOT_DEV} REAL_ROOT=${ROOT_DEV}
ROOTFSTYPE=zfs ROOTFSTYPE=zfs
else
bad_msg "${ROOT_DEV} is not a filesystem"
prompt_user "REAL_ROOT" "root block device"
got_good_root=0
continue
fi fi
else else
BOOTFS=$(/sbin/zpool list -H -o bootfs) BOOTFS=$(/sbin/zpool list -H -o bootfs)
@ -562,8 +578,13 @@ do
good_msg "Mounting $REAL_ROOT as root..." good_msg "Mounting $REAL_ROOT as root..."
if [ "${ROOTFSTYPE}" = 'zfs' ] if [ "${ROOTFSTYPE}" = 'zfs' ]
then
if [ "zfs get -H -o value mountpoint ${REAL_ROOT}" = 'legacy' ]
then then
MOUNT_STATE=rw MOUNT_STATE=rw
else
MOUNT_STATE=rw,zfsutil
fi
else else
MOUNT_STATE=ro MOUNT_STATE=ro
fi fi

Loading…
Cancel
Save