-#!/bin/sh
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
+#!/bin/bash
-if [[ -f /etc/kernel/cmdline ]]; then
- readarray -t BOOT_OPTIONS < /etc/kernel/cmdline
-fi
+COMMAND="$1"
+KERNEL_VERSION="$2"
+BOOT_DIR_ABS="$3"
+KERNEL_IMAGE="$4"
-if ! [[ "${BOOT_OPTIONS[@]}" ]]; then
- readarray -t BOOT_OPTIONS < /proc/cmdline
+# 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
-unset noimageifnotneeded
-
-for ((i=0; i < "${#BOOT_OPTIONS[@]}"; i++)); do
- if [[ ${BOOT_OPTIONS[$i]} == root\=PARTUUID\=* ]]; then
- noimageifnotneeded="yes"
- break
- fi
-done
+if [[ -d "$BOOT_DIR_ABS" ]]; then
+ INITRD="initrd"
+else
+ BOOT_DIR_ABS="/boot"
+ INITRD="initramfs-${KERNEL_VERSION}.img"
+fi
ret=0
-case "$1" in
+case "$COMMAND" in
add)
- dracut ${noimageifnotneeded+--noimageifnotneeded} "$3"/initrd "$2"
+ INITRD_IMAGE_PREGENERATED=${KERNEL_IMAGE%/*}/initrd
+ if [[ -f ${INITRD_IMAGE_PREGENERATED} ]]; then
+ # we found an initrd 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" \
+ && exit 0
+ fi
+
+ if [[ -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
+ fi
+
+ if ! [[ ${BOOT_OPTIONS[*]} ]]; then
+ read -r -d '' -a BOOT_OPTIONS < /proc/cmdline
+ fi
+
+ unset noimageifnotneeded
+
+ for ((i=0; i < "${#BOOT_OPTIONS[@]}"; i++)); do
+ if [[ ${BOOT_OPTIONS[$i]} == root\=PARTUUID\=* ]]; then
+ noimageifnotneeded="yes"
+ break
+ fi
+ done
+ dracut -f ${noimageifnotneeded:+--noimageifnotneeded} "$BOOT_DIR_ABS/$INITRD" "$KERNEL_VERSION"
ret=$?
;;
remove)
- rm -f -- "$3"/initrd
+ rm -f -- "$BOOT_DIR_ABS/$INITRD"
ret=$?
;;
esac