aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/dracut/90zfs/mount-zfs.sh.in
blob: 6bb06a7ffe99b04cb80e4141444dcbb38b4f8e3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/sh
# shellcheck disable=SC2034,SC2154

. /lib/dracut-zfs-lib.sh

decode_root_args || return 0

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
	# We're under systemd and dracut-zfs-generator ran to completion.
	info "ZFS: Delegating root mount to sysroot.mount at al."

	# We now prevent Dracut from running this thing again.
	rm -f "$hookdir"/mount/*zfs*
	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

ZFS_DATASET=
ZFS_POOL=

if [ "${root}" = "zfs:AUTO" ] ; then
	if ! ZFS_DATASET="$(find_bootfs)" ; then
		# shellcheck disable=SC2086
		zpool import -N -a ${ZPOOL_IMPORT_OPTS}
		if ! ZFS_DATASET="$(find_bootfs)" ; then
			warn "ZFS: No bootfs attribute found in importable pools."
			zpool export -aF

			rootok=0
			return 1
		fi
	fi
	info "ZFS: Using ${ZFS_DATASET} as root."
fi

ZFS_DATASET="${ZFS_DATASET:-${root}}"
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 "${ZFS_POOL}")" = '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