]> git.ipfire.org Git - thirdparty/dracut-ng.git/commitdiff
fix(install.d): simplify and use what kernel-install gives us
authorAndrew Ammerlaan <andrewammerlaan@gentoo.org>
Fri, 5 Apr 2024 18:31:35 +0000 (20:31 +0200)
committerLaszlo Gombos <laszlo.gombos@gmail.com>
Wed, 17 Apr 2024 15:45:38 +0000 (11:45 -0400)
drops legacy fallback path, exit always if we are not chosen as initrd_
generator. Exit if we are already installing an UKI. Exit if an initrd
image is already specified by kernel-install.

Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org>
install.d/50-dracut.install
install.d/51-dracut-rescue.install

index 441414ac3259d7508651ca54e9ae02d46e7b67be..82fab8d5dbe9044fd20c2faa703ce91e6ce60c8f 100755 (executable)
@@ -2,12 +2,12 @@
 
 COMMAND="$1"
 KERNEL_VERSION="$2"
+#shellcheck disable=SC2034
 BOOT_DIR_ABS="$3"
 KERNEL_IMAGE="$4"
 
-# If KERNEL_INSTALL_MACHINE_ID is defined but empty, BOOT_DIR_ABS is a fake directory.
-# So, let's skip to create initrd.
-if ! [[ ${KERNEL_INSTALL_MACHINE_ID-x} ]]; then
+# If the initrd was provided on the kernel command line, we shouldn't generate our own.
+if [[ "$COMMAND" != "add" || "$#" -gt 4 ]]; then
     exit 0
 fi
 
@@ -16,102 +16,64 @@ 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
+if [[ "${KERNEL_INSTALL_INITRD_GENERATOR:-dracut}" = "dracut" ]]; then
+    # We are the initrd generator
+    IMAGE="initrd"
+    UEFI_OPTS="--no-uefi"
 else
-    # 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
+    exit 0
 fi
 
-ret=0
-
-case "$COMMAND" in
-    add)
-        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
-            [[ $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 [ -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
-        else
-            declare -a BOOT_OPTIONS
+if [[ "$KERNEL_INSTALL_UKI_GENERATOR" = "dracut" ]]; then
+    # We are chosen to generate the UKI as well as initrd
+    IMAGE="uki.efi"
+    UEFI_OPTS="--uefi"
+fi
 
-            read -r -d '' -a line < /proc/cmdline
-            for i in "${line[@]}"; do
-                [[ ${i#initrd=*} != "$i" ]] && continue
-                BOOT_OPTIONS+=("$i")
-            done
-        fi
+if [[ -f ${KERNEL_IMAGE%/*}/$IMAGE ]]; then
+    # we found an initrd or uki.efi at the same place as the kernel
+    # use this and don't generate a new one
+    [[ $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" "$KERNEL_INSTALL_STAGING_AREA/$IMAGE" \
+        && chown root:root "$KERNEL_INSTALL_STAGING_AREA/$IMAGE" \
+        && chmod 0600 "$KERNEL_INSTALL_STAGING_AREA/$IMAGE" \
+        && exit 0
+fi
 
-        unset noimageifnotneeded
+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
+else
+    declare -a BOOT_OPTIONS
 
-        for ((i = 0; i < "${#BOOT_OPTIONS[@]}"; i++)); do
-            # shellcheck disable=SC1001
-            if [[ ${BOOT_OPTIONS[$i]} == root\=PARTUUID\=* ]]; then
-                noimageifnotneeded="yes"
-                break
-            fi
-        done
+    read -r -d '' -a line < /proc/cmdline
+    for i in "${line[@]}"; do
+        [[ ${i#initrd=*} != "$i" ]] && continue
+        BOOT_OPTIONS+=("$i")
+    done
+fi
 
-        # shellcheck disable=SC2046
-        dracut -f \
-            ${noimageifnotneeded:+--noimageifnotneeded} \
-            $([[ $KERNEL_INSTALL_VERBOSE == 1 ]] && echo --verbose) \
-            $([[ -n $KERNEL_IMAGE ]] && echo --kernel-image "$KERNEL_IMAGE") \
-            "$UEFI_OPTS" \
-            --kver "$KERNEL_VERSION" \
-            "$BOOT_DIR_ABS/$IMAGE"
-        ret=$?
-        ;;
+unset noimageifnotneeded
 
-    remove)
-        rm -f -- "$BOOT_DIR_ABS/$IMAGE"
-        ret=$?
-        ;;
-esac
+for ((i = 0; i < "${#BOOT_OPTIONS[@]}"; i++)); do
+    # shellcheck disable=SC1001
+    if [[ ${BOOT_OPTIONS[$i]} == root\=PARTUUID\=* ]]; then
+        noimageifnotneeded="yes"
+        break
+    fi
+done
 
-exit $ret
+# shellcheck disable=SC2046
+dracut -f \
+    ${noimageifnotneeded:+--noimageifnotneeded} \
+    $([[ $KERNEL_INSTALL_VERBOSE == 1 ]] && echo --verbose) \
+    $([[ -n $KERNEL_IMAGE ]] && echo --kernel-image "$KERNEL_IMAGE") \
+    "$UEFI_OPTS" \
+    --kver "$KERNEL_VERSION" \
+    "$KERNEL_INSTALL_STAGING_AREA/$IMAGE" || exit 1
index aa0ccdc5e49b37a1d49227f2ca35e063d2a0c370..f473ad494bd706df56e6c06323cbab2e1af03f1a 100755 (executable)
@@ -7,6 +7,24 @@ KERNEL_VERSION="$2"
 BOOT_DIR_ABS="${3%/*}/0-rescue"
 KERNEL_IMAGE="$4"
 
+# If the initrd was provided on the kernel command line, we shouldn't generate our own.
+if [[ "$COMMAND" = "add" && "$#" -gt 4 ]]; then
+    exit 0
+fi
+
+# Do not attempt to create initramfs if the supplied image is already a UKI
+if [[ "$KERNEL_INSTALL_IMAGE_TYPE" = "uki" ]]; then
+    exit 0
+fi
+
+if [[ "$KERNEL_INSTALL_UKI_GENERATOR" = "dracut" ]]; then
+    # Rescue images currently not compatible with UKIs
+    exit 0
+elif [[ "${KERNEL_INSTALL_INITRD_GENERATOR:-dracut}" != "dracut" ]]; then
+    # We are not the initrd generator
+    exit 0
+fi
+
 dropindirs_sort() {
     suffix=$1
     shift