summaryrefslogtreecommitdiffstats
path: root/contrib/dracut/90zfs/parse-zfs.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/dracut/90zfs/parse-zfs.sh.in')
-rwxr-xr-xcontrib/dracut/90zfs/parse-zfs.sh.in59
1 files changed, 59 insertions, 0 deletions
diff --git a/contrib/dracut/90zfs/parse-zfs.sh.in b/contrib/dracut/90zfs/parse-zfs.sh.in
new file mode 100755
index 000000000..c305c7821
--- /dev/null
+++ b/contrib/dracut/90zfs/parse-zfs.sh.in
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+. /lib/dracut-lib.sh
+
+# Let the command line override our host id.
+spl_hostid=`getarg spl_hostid=`
+if [ -n "${spl_hostid}" ] ; then
+ info "ZFS: Using hostid from command line: ${spl_hostid}"
+ AA=`echo ${spl_hostid} | cut -b 1,2`
+ BB=`echo ${spl_hostid} | cut -b 3,4`
+ CC=`echo ${spl_hostid} | cut -b 5,6`
+ DD=`echo ${spl_hostid} | cut -b 7,8`
+ printf "\x${DD}\x${CC}\x${BB}\x${AA}" >/etc/hostid
+elif [ -f "/etc/hostid" ] ; then
+ info "ZFS: Using hostid from /etc/hostid: `hostid`"
+else
+ warn "ZFS: No hostid found on kernel command line or /etc/hostid."
+ warn "ZFS: Pools may not import correctly."
+fi
+
+wait_for_zfs=0
+case "${root}" in
+ ""|zfs|zfs:)
+ # We'll take root unset, root=zfs, or root=zfs:
+ # No root set, so we want to read the bootfs attribute. We
+ # can't do that until udev settles so we'll set dummy values
+ # and hope for the best later on.
+ root="zfs:AUTO"
+ rootok=1
+ wait_for_zfs=1
+
+ info "ZFS: Enabling autodetection of bootfs after udev settles."
+ ;;
+
+ ZFS\=*|zfs:*|zfs:FILESYSTEM\=*|FILESYSTEM\=*)
+ # root is explicit ZFS root. Parse it now. We can handle
+ # a root=... param in any of the following formats:
+ # root=ZFS=rpool/ROOT
+ # root=zfs:rpool/ROOT
+ # root=zfs:FILESYSTEM=rpool/ROOT
+ # root=FILESYSTEM=rpool/ROOT
+
+ # Strip down to just the pool/fs
+ root="${root#zfs:}"
+ root="${root#FILESYSTEM=}"
+ root="zfs:${root#ZFS=}"
+ rootok=1
+ wait_for_zfs=1
+
+ info "ZFS: Set ${root} as bootfs."
+ ;;
+esac
+
+# Make sure Dracut is happy that we have a root and will wait for ZFS
+# modules to settle before mounting.
+if [ ${wait_for_zfs} -eq 1 ]; then
+ ln -s /dev/null /dev/root 2>/dev/null
+ echo '[ -e /dev/zfs ]' > "${hookdir}/initqueue/finished/zfs.sh"
+fi