mirror_zfs/dracut/90zfs/mount-zfs.sh.in

83 lines
2.3 KiB
Bash
Raw Normal View History

#!/bin/sh
. /lib/dracut-lib.sh
ZPOOL_FORCE=""
OLDIFS="$IFS"
NEWLINE="
"
if getargbool 0 zfs_force -y zfs.force -y zfsforce ; then
warn "ZFS: Will force-import pools if necessary."
ZPOOL_FORCE="-f"
fi
# Delay until all required block devices are present.
udevadm settle
case "$root" in
zfs:*)
# We have ZFS modules loaded, so we're able to import pools now.
if [ "$root" = "zfs:AUTO" ] ; then
# Need to parse bootfs attribute
info "ZFS: Attempting to detect root from imported ZFS pools."
# Might be imported by the kernel module, so try searching before
# we import anything.
zfsbootfs=`zpool list -H -o bootfs | sed -n '/^-$/ !p' | sed 'q'`
if [ $? -ne 0 ] || [ -z "$zfsbootfs" ] || \
[ "$zfsbootfs" = "no pools available" ] ; then
# Not there, so we need to import everything.
info "ZFS: Attempting to import additional pools."
zpool import -N -a ${ZPOOL_FORCE}
zfsbootfs=`zpool list -H -o bootfs | sed -n '/^-$/ !p' | sed 'q'`
if [ $? -ne 0 ] || [ -z "$zfsbootfs" ] || \
[ "$zfsbootfs" = "no pools available" ] ; then
rootok=0
pool=""
warn "ZFS: No bootfs attribute found in importable pools."
# Re-export everything since we're not prepared to take
# responsibility for them.
# Change IFS to allow for blanks in pool names.
IFS="$NEWLINE"
for fs in `zpool list -H -o name` ; do
zpool export "$fs"
done
IFS="$OLDIFS"
return 1
fi
fi
info "ZFS: Using ${zfsbootfs} as root."
else
# Should have an explicit pool set, so just import it and we're done.
zfsbootfs="${root#zfs:}"
pool="${zfsbootfs%%/*}"
if ! zpool list -H "$pool" > /dev/null ; then
# pool wasn't imported automatically by the kernel module, so
# try it manually.
info "ZFS: Importing pool ${pool}..."
if ! zpool import -N ${ZPOOL_FORCE} "$pool" ; then
warn "ZFS: Unable to import pool ${pool}."
rootok=0
return 1
fi
fi
fi
# Above should have left our rpool imported and pool/dataset in $root.
# We need zfsutil for non-legacy mounts and not for legacy mounts.
mountpoint=`zfs get -H -o value mountpoint "$zfsbootfs"`
if [ "$mountpoint" = "legacy" ] ; then
mount -t zfs "$zfsbootfs" "$NEWROOT" && ROOTFS_MOUNTED=yes
else
mount -o zfsutil -t zfs "$zfsbootfs" "$NEWROOT" && ROOTFS_MOUNTED=yes
fi
need_shutdown
;;
esac