mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-02-07 07:43:21 +03:00
fb7307b892
Systemd binaries necessary for mounting an encrypted root dataset weren't copied to initramfs generated by dracut. This patch fixes this and copies these binaries unconditionally, that is regardless of whether native ZFS encryption is used for the root dataset. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Diamantopoulos <georgediam@gmail.com> Closes #7607 Closes #7719
104 lines
3.2 KiB
Bash
Executable File
104 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
check() {
|
|
# We depend on udev-rules being loaded
|
|
[ "${1}" = "-d" ] && return 0
|
|
|
|
# Verify the zfs tool chain
|
|
for tool in "@sbindir@/zpool" "@sbindir@/zfs" "@mounthelperdir@/mount.zfs" ; do
|
|
test -x "$tool" || return 1
|
|
done
|
|
# Verify grep exists
|
|
which grep >/dev/null 2>&1 || return 1
|
|
|
|
return 0
|
|
}
|
|
|
|
depends() {
|
|
echo udev-rules
|
|
return 0
|
|
}
|
|
|
|
installkernel() {
|
|
instmods zfs
|
|
instmods zcommon
|
|
instmods znvpair
|
|
instmods zavl
|
|
instmods zunicode
|
|
instmods zlua
|
|
instmods icp
|
|
instmods spl
|
|
instmods zlib_deflate
|
|
instmods zlib_inflate
|
|
}
|
|
|
|
install() {
|
|
inst_rules @udevruledir@/90-zfs.rules
|
|
inst_rules @udevruledir@/69-vdev.rules
|
|
inst_rules @udevruledir@/60-zvol.rules
|
|
dracut_install hostid
|
|
dracut_install grep
|
|
dracut_install @sbindir@/zfs
|
|
dracut_install @sbindir@/zpool
|
|
# Workaround for zfsonlinux/zfs#4749 by ensuring libgcc_s.so(.1) is included
|
|
if [[ -n "$(ldd @sbindir@/zpool | grep -F 'libgcc_s.so')" ]]; then
|
|
# Dracut will have already tracked and included it
|
|
:;
|
|
elif command -v gcc-config 2>&1 1>/dev/null; then
|
|
# On systems with gcc-config (Gentoo, Funtoo, etc.):
|
|
# Use the current profile to resolve the appropriate path
|
|
dracut_install "/usr/lib/gcc/$(s=$(gcc-config -c); echo ${s%-*}/${s##*-})/libgcc_s.so.1"
|
|
elif [[ -n "$(ls /usr/lib/libgcc_s.so* 2>/dev/null)" ]]; then
|
|
# Try a simple path first
|
|
dracut_install /usr/lib/libgcc_s.so*
|
|
else
|
|
# Fallback: Guess the path and include all matches
|
|
dracut_install /usr/lib/gcc/*/*/libgcc_s.so*
|
|
fi
|
|
dracut_install @mounthelperdir@/mount.zfs
|
|
dracut_install @udevdir@/vdev_id
|
|
dracut_install awk
|
|
dracut_install basename
|
|
dracut_install head
|
|
dracut_install @udevdir@/zvol_id
|
|
inst_hook cmdline 95 "${moddir}/parse-zfs.sh"
|
|
if [ -n "$systemdutildir" ] ; then
|
|
inst_script "${moddir}/zfs-generator.sh" "$systemdutildir"/system-generators/dracut-zfs-generator
|
|
fi
|
|
inst_hook pre-mount 90 "${moddir}/zfs-load-key.sh"
|
|
inst_hook mount 98 "${moddir}/mount-zfs.sh"
|
|
inst_hook cleanup 99 "${moddir}/zfs-needshutdown.sh"
|
|
inst_hook shutdown 20 "${moddir}/export-zfs.sh"
|
|
|
|
inst_simple "${moddir}/zfs-lib.sh" "/lib/dracut-zfs-lib.sh"
|
|
if [ -e @sysconfdir@/zfs/zpool.cache ]; then
|
|
inst @sysconfdir@/zfs/zpool.cache
|
|
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/zfs/zpool.cache
|
|
fi
|
|
|
|
if [ -e @sysconfdir@/zfs/vdev_id.conf ]; then
|
|
inst @sysconfdir@/zfs/vdev_id.conf
|
|
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/zfs/vdev_id.conf
|
|
fi
|
|
|
|
# Synchronize initramfs and system hostid
|
|
AA=`hostid | cut -b 1,2`
|
|
BB=`hostid | cut -b 3,4`
|
|
CC=`hostid | cut -b 5,6`
|
|
DD=`hostid | cut -b 7,8`
|
|
printf "\x${DD}\x${CC}\x${BB}\x${AA}" > "${initdir}/etc/hostid"
|
|
|
|
if dracut_module_included "systemd"; then
|
|
mkdir -p "${initdir}/$systemdsystemunitdir/initrd.target.wants"
|
|
for _item in scan cache ; do
|
|
dracut_install @systemdunitdir@/zfs-import-$_item.service
|
|
if ! [ -L "${initdir}/$systemdsystemunitdir/initrd.target.wants"/zfs-import-$_item.service ]; then
|
|
ln -s ../zfs-import-$_item.service "${initdir}/$systemdsystemunitdir/initrd.target.wants"/zfs-import-$_item.service
|
|
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @systemdunitdir@/zfs-import-$_item.service
|
|
fi
|
|
done
|
|
dracut_install systemd-ask-password
|
|
dracut_install systemd-tty-ask-password-agent
|
|
fi
|
|
}
|