aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/contrib/dracut/90zfs/mount-zfs.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/openzfs/contrib/dracut/90zfs/mount-zfs.sh.in')
-rwxr-xr-xsys/contrib/openzfs/contrib/dracut/90zfs/mount-zfs.sh.in86
1 files changed, 86 insertions, 0 deletions
diff --git a/sys/contrib/openzfs/contrib/dracut/90zfs/mount-zfs.sh.in b/sys/contrib/openzfs/contrib/dracut/90zfs/mount-zfs.sh.in
new file mode 100755
index 000000000000..f5b3d9056c17
--- /dev/null
+++ b/sys/contrib/openzfs/contrib/dracut/90zfs/mount-zfs.sh.in
@@ -0,0 +1,86 @@
+#!/bin/bash
+
+. /lib/dracut-zfs-lib.sh
+
+ZFS_DATASET=""
+ZFS_POOL=""
+
+case "${root}" in
+ zfs:*) ;;
+ *) return ;;
+esac
+
+GENERATOR_FILE=/run/systemd/generator/sysroot.mount
+GENERATOR_EXTENSION=/run/systemd/generator/sysroot.mount.d/zfs-enhancement.conf
+
+if [ -e "$GENERATOR_FILE" ] && [ -e "$GENERATOR_EXTENSION" ] ; then
+ # If the ZFS sysroot.mount flag exists, the initial RAM disk configured
+ # it to mount ZFS on root. In that case, we bail early. This flag
+ # file gets created by the zfs-generator program upon successful run.
+ info "ZFS: There is a sysroot.mount and zfs-generator has extended it."
+ info "ZFS: Delegating root mount to sysroot.mount."
+ # Let us tell the initrd to run on shutdown.
+ # We have a shutdown hook to run
+ # because we imported the pool.
+ # We now prevent Dracut from running this thing again.
+ for zfsmounthook in "$hookdir"/mount/*zfs* ; do
+ if [ -f "$zfsmounthook" ] ; then
+ rm -f "$zfsmounthook"
+ fi
+ done
+ return
+fi
+info "ZFS: No sysroot.mount exists or zfs-generator did not extend it."
+info "ZFS: Mounting root with the traditional mount-zfs.sh instead."
+
+# Delay until all required block devices are present.
+modprobe zfs 2>/dev/null
+udevadm settle
+
+if [ "${root}" = "zfs:AUTO" ] ; then
+ ZFS_DATASET="$(find_bootfs)"
+ if [ $? -ne 0 ] ; then
+ zpool import -N -a ${ZPOOL_IMPORT_OPTS}
+ ZFS_DATASET="$(find_bootfs)"
+ if [ $? -ne 0 ] ; then
+ warn "ZFS: No bootfs attribute found in importable pools."
+ export_all -F
+
+ rootok=0
+ return 1
+ fi
+ fi
+ info "ZFS: Using ${ZFS_DATASET} as root."
+fi
+
+ZFS_DATASET="${ZFS_DATASET:-${root#zfs:}}"
+ZFS_POOL="${ZFS_DATASET%%/*}"
+
+if import_pool "${ZFS_POOL}" ; then
+ # Load keys if we can or if we need to
+ if [ $(zpool list -H -o feature@encryption $(echo "${ZFS_POOL}" | awk -F\/ '{print $1}')) = 'active' ]; then
+ # if the root dataset has encryption enabled
+ ENCRYPTIONROOT="$(zfs get -H -o value encryptionroot "${ZFS_DATASET}")"
+ if ! [ "${ENCRYPTIONROOT}" = "-" ]; then
+ KEYSTATUS="$(zfs get -H -o value keystatus "${ENCRYPTIONROOT}")"
+ # if the key needs to be loaded
+ if [ "$KEYSTATUS" = "unavailable" ]; then
+ # decrypt them
+ ask_for_password \
+ --tries 5 \
+ --prompt "Encrypted ZFS password for ${ENCRYPTIONROOT}: " \
+ --cmd "zfs load-key '${ENCRYPTIONROOT}'"
+ fi
+ fi
+ fi
+ # Let us tell the initrd to run on shutdown.
+ # We have a shutdown hook to run
+ # because we imported the pool.
+ info "ZFS: Mounting dataset ${ZFS_DATASET}..."
+ if mount_dataset "${ZFS_DATASET}" ; then
+ ROOTFS_MOUNTED=yes
+ return 0
+ fi
+fi
+
+rootok=0