]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/dracut/90zfs/mount-zfs.sh.in
Vendor import of openzfs master @ 184df27eef0abdc7ab2105b21257f753834b936b
[FreeBSD/FreeBSD.git] / contrib / dracut / 90zfs / mount-zfs.sh.in
1 #!/bin/bash
2
3 . /lib/dracut-zfs-lib.sh
4
5 ZFS_DATASET=""
6 ZFS_POOL=""
7
8 case "${root}" in
9         zfs:*) ;;
10         *) return ;;
11 esac
12
13 GENERATOR_FILE=/run/systemd/generator/sysroot.mount
14 GENERATOR_EXTENSION=/run/systemd/generator/sysroot.mount.d/zfs-enhancement.conf
15
16 if [ -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
32 fi
33 info "ZFS: No sysroot.mount exists or zfs-generator did not extend it."
34 info "ZFS: Mounting root with the traditional mount-zfs.sh instead."
35
36 # Delay until all required block devices are present.
37 modprobe zfs 2>/dev/null
38 udevadm settle
39
40 if [ "${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."
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 $(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
84 fi
85
86 rootok=0