Combination of: - https://github.com/dracutdevs/dracut/pull/2405 - https://github.com/dracutdevs/dracut/pull/2495 - https://github.com/dracutdevs/dracut/pull/2521 Fixes installing manually configured kernel in uki layout and allows dropping workaround from dist-kernel-utils.eclass Provides compatibility with systemd-254's ukify plugin --- a/dracut.sh +++ b/dracut.sh @@ -2594,6 +2594,9 @@ freeze_ok_for_fstype() { zfs) return 1 ;; + tmpfs) + return 1 + ;; btrfs) freeze_ok_for_btrfs "$outfile" ;; --- a/install.d/50-dracut.install 2023-09-21 10:19:00.843827541 +0200 +++ b/install.d/50-dracut.install 2023-07-20 16:53:51.000000000 +0200 @@ -11,27 +11,69 @@ exit 0 fi -if [[ -d "$BOOT_DIR_ABS" ]]; then - INITRD="initrd" +# Do not attempt to create initramfs if the supplied image is already a UKI +if [[ "$KERNEL_INSTALL_IMAGE_TYPE" = "uki" ]]; then + exit 0 +fi + +# Mismatching the install layout and the --uefi/--no-uefi opts just creates a mess. +if [[ $KERNEL_INSTALL_LAYOUT == "uki" && -n $KERNEL_INSTALL_STAGING_AREA ]]; then + BOOT_DIR_ABS="$KERNEL_INSTALL_STAGING_AREA" + if [[ -z $KERNEL_INSTALL_UKI_GENERATOR || $KERNEL_INSTALL_UKI_GENERATOR == "dracut" ]]; then + # No uki generator preference set or we have been chosen + IMAGE="uki.efi" + UEFI_OPTS="--uefi" + elif [[ -z $KERNEL_INSTALL_INITRD_GENERATOR || $KERNEL_INSTALL_INITRD_GENERATOR == "dracut" ]]; then + # We aren't the uki generator, but we have been requested to make the initrd + IMAGE="initrd" + UEFI_OPTS="--no-uefi" + else + exit 0 + fi +elif [[ $KERNEL_INSTALL_LAYOUT == "bls" && -n $KERNEL_INSTALL_STAGING_AREA ]]; then + BOOT_DIR_ABS="$KERNEL_INSTALL_STAGING_AREA" + if [[ -z $KERNEL_INSTALL_INITRD_GENERATOR || $KERNEL_INSTALL_INITRD_GENERATOR == "dracut" ]]; then + IMAGE="initrd" + UEFI_OPTS="--no-uefi" + else + exit 0 + fi else - BOOT_DIR_ABS="/boot" - INITRD="initramfs-${KERNEL_VERSION}.img" + # No layout information, use users --uefi/--no-uefi preference + UEFI_OPTS="" + if [[ -d $BOOT_DIR_ABS ]]; then + IMAGE="initrd" + else + BOOT_DIR_ABS="/boot" + IMAGE="initramfs-${KERNEL_VERSION}.img" + fi fi ret=0 + case "$COMMAND" in add) - INITRD_IMAGE_PREGENERATED=${KERNEL_IMAGE%/*}/initrd - if [[ -f ${INITRD_IMAGE_PREGENERATED} ]]; then - # we found an initrd at the same place as the kernel + if [[ $IMAGE == "uki.efi" ]]; then + IMAGE_PREGENERATED=${KERNEL_IMAGE%/*}/uki.efi + else + IMAGE_PREGENERATED=${KERNEL_IMAGE%/*}/initrd + fi + if [[ -f ${IMAGE_PREGENERATED} ]]; then + # we found an initrd or uki.efi at the same place as the kernel # use this and don't generate a new one - cp --reflink=auto "$INITRD_IMAGE_PREGENERATED" "$BOOT_DIR_ABS/$INITRD" \ - && chown root:root "$BOOT_DIR_ABS/$INITRD" \ - && chmod 0600 "$BOOT_DIR_ABS/$INITRD" \ + [[ $KERNEL_INSTALL_VERBOSE == 1 ]] && echo \ + "There is an ${IMAGE} image at the same place as the kernel, skipping generating a new one" + cp --reflink=auto "$IMAGE_PREGENERATED" "$BOOT_DIR_ABS/$IMAGE" \ + && chown root:root "$BOOT_DIR_ABS/$IMAGE" \ + && chmod 0600 "$BOOT_DIR_ABS/$IMAGE" \ && exit 0 fi - if [[ -f /etc/kernel/cmdline ]]; then + if [ -n "$KERNEL_INSTALL_CONF_ROOT" ]; then + if [ -f "$KERNEL_INSTALL_CONF_ROOT/cmdline" ]; then + read -r -d '' -a BOOT_OPTIONS < "$KERNEL_INSTALL_CONF_ROOT/cmdline" + fi + elif [[ -f /etc/kernel/cmdline ]]; then read -r -d '' -a BOOT_OPTIONS < /etc/kernel/cmdline elif [[ -f /usr/lib/kernel/cmdline ]]; then read -r -d '' -a BOOT_OPTIONS < /usr/lib/kernel/cmdline @@ -40,14 +82,14 @@ read -r -d '' -a line < /proc/cmdline for i in "${line[@]}"; do - [[ "${i#initrd=*}" != "$i" ]] && continue + [[ ${i#initrd=*} != "$i" ]] && continue BOOT_OPTIONS+=("$i") done fi unset noimageifnotneeded - for ((i=0; i < "${#BOOT_OPTIONS[@]}"; i++)); do + for ((i = 0; i < "${#BOOT_OPTIONS[@]}"; i++)); do # shellcheck disable=SC1001 if [[ ${BOOT_OPTIONS[$i]} == root\=PARTUUID\=* ]]; then noimageifnotneeded="yes" @@ -55,16 +97,21 @@ fi done + # shellcheck disable=SC2046 dracut -f \ ${noimageifnotneeded:+--noimageifnotneeded} \ - $([[ "$KERNEL_INSTALL_VERBOSE" == 1 ]] && echo --verbose) \ - "$BOOT_DIR_ABS/$INITRD" \ - "$KERNEL_VERSION" + $([[ $KERNEL_INSTALL_VERBOSE == 1 ]] && echo --verbose) \ + $([[ -n $KERNEL_IMAGE ]] && echo --kernel-image "$KERNEL_IMAGE") \ + "$UEFI_OPTS" \ + --kver "$KERNEL_VERSION" \ + "$BOOT_DIR_ABS/$IMAGE" ret=$? - ;; + ;; + remove) - rm -f -- "$BOOT_DIR_ABS/$INITRD" + rm -f -- "$BOOT_DIR_ABS/$IMAGE" ret=$? - ;; + ;; esac + exit $ret