1#!/bin/bash
2
3. /lib/dracut-zfs-lib.sh
4
5ZFS_DATASET=""
6ZFS_POOL=""
7
8case "${root}" in
9	zfs:*) ;;
10	*) return ;;
11esac
12
13GENERATOR_FILE=/run/systemd/generator/sysroot.mount
14GENERATOR_EXTENSION=/run/systemd/generator/sysroot.mount.d/zfs-enhancement.conf
15
16if [ -e "$GENERATOR_FILE" ] && [ -e "$GENERATOR_EXTENSION" ] ; then
17	# If the ZFS sysroot.mount flag exists, the initial RAM disk configured
18	# it to mount ZFS on root.  In that case, we bail early.  This flag
19	# file gets created by the zfs-generator program upon successful run.
20	info "ZFS: There is a sysroot.mount and zfs-generator has extended it."
21	info "ZFS: Delegating root mount to sysroot.mount."
22	# Let us tell the initrd to run on shutdown.
23	# We have a shutdown hook to run
24	# because we imported the pool.
25	# We now prevent Dracut from running this thing again.
26	for zfsmounthook in "$hookdir"/mount/*zfs* ; do
27		if [ -f "$zfsmounthook" ] ; then
28			rm -f "$zfsmounthook"
29		fi
30	done
31	return
32fi
33info "ZFS: No sysroot.mount exists or zfs-generator did not extend it."
34info "ZFS: Mounting root with the traditional mount-zfs.sh instead."
35
36# Delay until all required block devices are present.
37modprobe zfs 2>/dev/null
38udevadm settle
39
40if [ "${root}" = "zfs:AUTO" ] ; then
41	ZFS_DATASET="$(find_bootfs)"
42	if [ $? -ne 0 ] ; then
43		zpool import -N -a ${ZPOOL_IMPORT_OPTS}
44		ZFS_DATASET="$(find_bootfs)"
45		if [ $? -ne 0 ] ; then
46			warn "ZFS: No bootfs attribute found in importable pools."
47			export_all -F
48
49			rootok=0
50			return 1
51		fi
52	fi
53	info "ZFS: Using ${ZFS_DATASET} as root."
54fi
55
56ZFS_DATASET="${ZFS_DATASET:-${root#zfs:}}"
57ZFS_POOL="${ZFS_DATASET%%/*}"
58
59if import_pool "${ZFS_POOL}" ; then
60	# Load keys if we can or if we need to
61	if [ $(zpool list -H -o feature@encryption $(echo "${ZFS_POOL}" | awk -F\/ '{print $1}')) = 'active' ]; then
62		# if the root dataset has encryption enabled
63		ENCRYPTIONROOT="$(zfs get -H -o value encryptionroot "${ZFS_DATASET}")"
64		if ! [ "${ENCRYPTIONROOT}" = "-" ]; then
65			KEYSTATUS="$(zfs get -H -o value keystatus "${ENCRYPTIONROOT}")"
66			# if the key needs to be loaded
67			if [ "$KEYSTATUS" = "unavailable" ]; then
68				# decrypt them
69				ask_for_password \
70					--tries 5 \
71					--prompt "Encrypted ZFS password for ${ENCRYPTIONROOT}: " \
72					--cmd "zfs load-key '${ENCRYPTIONROOT}'"
73			fi
74		fi
75	fi
76	# Let us tell the initrd to run on shutdown.
77	# We have a shutdown hook to run
78	# because we imported the pool.
79	info "ZFS: Mounting dataset ${ZFS_DATASET}..."
80	if mount_dataset "${ZFS_DATASET}" ; then
81		ROOTFS_MOUNTED=yes
82		return 0
83	fi
84fi
85
86rootok=0
87