mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-27 11:29:36 +03:00
7b4536c710
Execute udevadm settle before trying to import pools. Otherwise the disk device nodes may not be ready before import time. This is analogous to the behavior of the init scripts and systemd units. Signed-off-by: Gordan Bobic <gordan@steel.shatteredsilicon.net> Signed-off-by: Pavel Snajdr <snajpa@snajpa.net> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #3213
83 lines
2.3 KiB
Bash
Executable File
83 lines
2.3 KiB
Bash
Executable File
#!/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
|