diff --git a/man/kernel-install.xml b/man/kernel-install.xml index bb76074d2e..685617863e 100644 --- a/man/kernel-install.xml +++ b/man/kernel-install.xml @@ -180,6 +180,10 @@ This should be configured as initrd_generator= in install.conf. + KERNEL_INSTALL_STAGING_AREA=... is set for plugins to a path to a directory. + Plugins may drop files in that directory, and they will be installed as part of the loader entry, based + on the file name and extension. + bls diff --git a/src/kernel-install/90-loaderentry.install b/src/kernel-install/90-loaderentry.install index 6a396910cb..0888c260e2 100644 --- a/src/kernel-install/90-loaderentry.install +++ b/src/kernel-install/90-loaderentry.install @@ -18,6 +18,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with systemd; If not, see . +shopt -s nullglob + COMMAND="$1" KERNEL_VERSION="$2" ENTRY_DIR_ABS="$3" @@ -88,7 +90,8 @@ install -g root -o root -m 0644 "$KERNEL_IMAGE" "$ENTRY_DIR_ABS/linux" || { } shift "$INITRD_OPTIONS_SHIFT" -for initrd; do +# All files listed as arguments, and staged files called "initrd*" are installed as initrds. +for initrd in "$@" "${KERNEL_INSTALL_STAGING_AREA}"/initrd*; do [ -f "$initrd" ] || { echo "Error: initrd '$initrd' not a file." >&2 exit 1 @@ -114,11 +117,15 @@ mkdir -p "${LOADER_ENTRY%/*}" || { echo "machine-id $MACHINE_ID" echo "options $BOOT_OPTIONS" echo "linux $ENTRY_DIR/linux" - for initrd; do + + have_initrd= + for initrd in "${@}" "${KERNEL_INSTALL_STAGING_AREA}"/initrd*; do echo "initrd $ENTRY_DIR/${initrd##*/}" + have_initrd=yes done + # Try "initrd", generated by dracut in its kernel-install hook, if no initrds were supplied - [ $# -eq 0 ] && [ -f "$ENTRY_DIR_ABS/initrd" ] && echo "initrd $ENTRY_DIR/initrd" + [ -z "$have_initrd" ] && [ -f "$ENTRY_DIR_ABS/initrd" ] && echo "initrd $ENTRY_DIR/initrd" : } >"$LOADER_ENTRY" || { echo "Error: could not create loader entry '$LOADER_ENTRY'." >&2 diff --git a/src/kernel-install/kernel-install b/src/kernel-install/kernel-install index a73a205d79..8cfef3208d 100755 --- a/src/kernel-install/kernel-install +++ b/src/kernel-install/kernel-install @@ -128,10 +128,20 @@ fi ENTRY_DIR_ABS="$BOOT_ROOT/$MACHINE_ID/$KERNEL_VERSION" +# Provide a directory where to store generated initrds +cleanup() { + [ -n "$KERNEL_INSTALL_STAGING_AREA" ] && rm -rf "$KERNEL_INSTALL_STAGING_AREA" +} + +trap cleanup EXIT + +KERNEL_INSTALL_STAGING_AREA="$(mktemp -d -t -p /tmp kernel-install.staging.XXXXXXX)" + export KERNEL_INSTALL_MACHINE_ID="$MACHINE_ID" export KERNEL_INSTALL_BOOT_ROOT="$BOOT_ROOT" export KERNEL_INSTALL_LAYOUT="$layout" export KERNEL_INSTALL_INITRD_GENERATOR="$initrd_generator" +export KERNEL_INSTALL_STAGING_AREA [ "$layout" = "bls" ] MAKE_ENTRY_DIR_ABS=$?