diff options
Diffstat (limited to '')
-rwxr-xr-x | install.d/50-dracut.install | 117 | ||||
-rwxr-xr-x | install.d/51-dracut-rescue.install | 152 |
2 files changed, 269 insertions, 0 deletions
diff --git a/install.d/50-dracut.install b/install.d/50-dracut.install new file mode 100755 index 0000000..441414a --- /dev/null +++ b/install.d/50-dracut.install @@ -0,0 +1,117 @@ +#!/bin/bash + +COMMAND="$1" +KERNEL_VERSION="$2" +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 + 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 + +# 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 + # 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) + 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 + + read -r -d '' -a line < /proc/cmdline + for i in "${line[@]}"; do + [[ ${i#initrd=*} != "$i" ]] && continue + BOOT_OPTIONS+=("$i") + done + fi + + unset noimageifnotneeded + + for ((i = 0; i < "${#BOOT_OPTIONS[@]}"; i++)); do + # shellcheck disable=SC1001 + if [[ ${BOOT_OPTIONS[$i]} == root\=PARTUUID\=* ]]; then + noimageifnotneeded="yes" + break + fi + done + + # 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=$? + ;; + + remove) + rm -f -- "$BOOT_DIR_ABS/$IMAGE" + ret=$? + ;; +esac + +exit $ret diff --git a/install.d/51-dracut-rescue.install b/install.d/51-dracut-rescue.install new file mode 100755 index 0000000..aa0ccdc --- /dev/null +++ b/install.d/51-dracut-rescue.install @@ -0,0 +1,152 @@ +#!/bin/bash + +export LANG=C + +COMMAND="$1" +KERNEL_VERSION="$2" +BOOT_DIR_ABS="${3%/*}/0-rescue" +KERNEL_IMAGE="$4" + +dropindirs_sort() { + suffix=$1 + shift + args=("$@") + files=$( + while (($# > 0)); do + for i in "${1}"/*"${suffix}"; do + [[ -f $i ]] && echo "${i##*/}" + done + shift + done | sort -Vu + ) + + for f in $files; do + for d in "${args[@]}"; do + if [[ -f "$d/$f" ]]; then + echo "$d/$f" + continue 2 + fi + done + done +} + +if [[ -f /etc/os-release ]]; then + . /etc/os-release +elif [[ -f /usr/lib/os-release ]]; then + . /usr/lib/os-release +fi + +[[ -n $PRETTY_NAME ]] || PRETTY_NAME="Linux $KERNEL_VERSION" + +if [[ ${KERNEL_INSTALL_MACHINE_ID+x} ]]; then + MACHINE_ID=$KERNEL_INSTALL_MACHINE_ID +elif [[ -f /etc/machine-id ]]; then + read -r MACHINE_ID < /etc/machine-id +fi + +if ! [[ $MACHINE_ID ]]; then + 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 + + read -r -d '' -a line < /proc/cmdline + for i in "${line[@]}"; do + [[ ${i#initrd=*} != "$i" ]] && continue + BOOT_OPTIONS+=("$i") + done +fi + +if [[ -d ${BOOT_DIR_ABS%/*} ]]; then + BOOT_DIR="/${MACHINE_ID}/0-rescue" + BOOT_ROOT=${BOOT_DIR_ABS%"$BOOT_DIR"} + LOADER_ENTRY="$BOOT_ROOT/loader/entries/${MACHINE_ID}-0-rescue.conf" + KERNEL="linux" + INITRD="initrd" +else + BLS_DIR="/boot/loader/entries" + BOOT_DIR_ABS="/boot" + LOADER_ENTRY="$BLS_DIR/${MACHINE_ID}-0-rescue.conf" + KERNEL="vmlinuz-0-rescue-${MACHINE_ID}" + INITRD="initramfs-0-rescue-${MACHINE_ID}.img" +fi + +ret=0 + +case "$COMMAND" in + add) + if [[ -f $LOADER_ENTRY ]] && [[ -f "$BOOT_DIR_ABS/$KERNEL" ]] \ + && [[ -f "$BOOT_DIR_ABS/$INITRD" ]]; then + [[ $KERNEL_INSTALL_VERBOSE == 1 ]] \ + && echo "Skipping, there is already a rescue image generated with the same input parameters" + exit 0 + fi + + # source our config dir + for f in $(dropindirs_sort ".conf" "/etc/dracut.conf.d" "/usr/lib/dracut/dracut.conf.d"); do + if [[ -e $f ]]; then + # shellcheck disable=SC1090 + . "$f" + fi + done + + if [[ $dracut_rescue_image != "yes" ]]; then + [[ $KERNEL_INSTALL_VERBOSE == 1 ]] \ + && echo "Skipping, 'dracut_rescue_image' not set to 'yes' in any dracut configuration file" + exit 0 + fi + + [[ -d $BOOT_DIR_ABS ]] || mkdir -p "$BOOT_DIR_ABS" + + if ! cp --reflink=auto "$KERNEL_IMAGE" "$BOOT_DIR_ABS/$KERNEL"; then + echo "Can't copy '$KERNEL_IMAGE to '$BOOT_DIR_ABS/$KERNEL'!" >&2 + fi + + if [[ ! -f "$BOOT_DIR_ABS/$INITRD" ]]; then + # shellcheck disable=SC2046 + dracut -f --no-hostonly --no-uefi \ + -a "rescue" \ + $([[ $KERNEL_INSTALL_VERBOSE == 1 ]] && echo --verbose) \ + --kver "$KERNEL_VERSION" \ + "$BOOT_DIR_ABS/$INITRD" + ((ret += $?)) + fi + + [[ $KERNEL_INSTALL_VERBOSE == 1 ]] && echo "Creating $LOADER_ENTRY" + if [[ ${BOOT_DIR_ABS} != "/boot" ]]; then + { + echo "title $PRETTY_NAME - Rescue Image" + echo "version $KERNEL_VERSION" + echo "machine-id $MACHINE_ID" + echo "options ${BOOT_OPTIONS[*]} rd.auto=1" + echo "linux $BOOT_DIR/linux" + echo "initrd $BOOT_DIR/initrd" + } > "$LOADER_ENTRY" + else + if [[ -e "${BLS_DIR}/${MACHINE_ID}-${KERNEL_VERSION}.conf" ]]; then + cp -aT "${BLS_DIR}/${MACHINE_ID}-${KERNEL_VERSION}.conf" "$LOADER_ENTRY" + else + cp -aT "${KERNEL_IMAGE%/*}/bls.conf" "$LOADER_ENTRY" + fi + sed -i "s/${KERNEL_VERSION}/0-rescue-${MACHINE_ID}/" "$LOADER_ENTRY" + fi + + ((ret += $?)) + ;; + + remove) + exit 0 + ;; + +esac + +exit $ret |