Skip to content

Commit

Permalink
fix(install.d): simplify and use what kernel-install gives us
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nowa-Ammerlaan authored and LaszloGombos committed Apr 17, 2024
1 parent d93bac0 commit d401553
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 93 deletions.
148 changes: 55 additions & 93 deletions install.d/50-dracut.install
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
18 changes: 18 additions & 0 deletions install.d/51-dracut-rescue.install
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit d401553

Please sign in to comment.