]> git.proxmox.com Git - mirror_zfs.git/blob - contrib/dracut/90zfs/mount-zfs.sh.in
68e3f0e0d60bf847aea20b25ef5a35671ab282a8
[mirror_zfs.git] / contrib / dracut / 90zfs / mount-zfs.sh.in
1 #!/bin/sh
2 # shellcheck disable=SC2034,SC2154
3
4 . /lib/dracut-zfs-lib.sh
5
6 ZFS_DATASET=""
7 ZFS_POOL=""
8
9 case "${root}" in
10 zfs:*) ;;
11 *) return ;;
12 esac
13
14 GENERATOR_FILE=/run/systemd/generator/sysroot.mount
15 GENERATOR_EXTENSION=/run/systemd/generator/sysroot.mount.d/zfs-enhancement.conf
16
17 if [ -e "$GENERATOR_FILE" ] && [ -e "$GENERATOR_EXTENSION" ] ; then
18 # If the ZFS sysroot.mount flag exists, the initial RAM disk configured
19 # it to mount ZFS on root. In that case, we bail early. This flag
20 # file gets created by the zfs-generator program upon successful run.
21 info "ZFS: There is a sysroot.mount and zfs-generator has extended it."
22 info "ZFS: Delegating root mount to sysroot.mount."
23 # Let us tell the initrd to run on shutdown.
24 # We have a shutdown hook to run
25 # because we imported the pool.
26 # We now prevent Dracut from running this thing again.
27 for zfsmounthook in "$hookdir"/mount/*zfs* ; do
28 if [ -f "$zfsmounthook" ] ; then
29 rm -f "$zfsmounthook"
30 fi
31 done
32 return
33 fi
34 info "ZFS: No sysroot.mount exists or zfs-generator did not extend it."
35 info "ZFS: Mounting root with the traditional mount-zfs.sh instead."
36
37 # Delay until all required block devices are present.
38 modprobe zfs 2>/dev/null
39 udevadm settle
40
41 if [ "${root}" = "zfs:AUTO" ] ; then
42 if ! ZFS_DATASET="$(find_bootfs)" ; then
43 # shellcheck disable=SC2086
44 zpool import -N -a ${ZPOOL_IMPORT_OPTS}
45 if ! ZFS_DATASET="$(find_bootfs)" ; 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."
54 fi
55
56 ZFS_DATASET="${ZFS_DATASET:-${root#zfs:}}"
57 ZFS_POOL="${ZFS_DATASET%%/*}"
58
59 if import_pool "${ZFS_POOL}" ; then
60 # Load keys if we can or if we need to
61 if [ "$(zpool list -H -o feature@encryption "${ZFS_POOL}")" = '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
84 fi
85
86 rootok=0