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