diff --git a/man/kernel-install.xml b/man/kernel-install.xml index 83255bb932..685617863e 100644 --- a/man/kernel-install.xml +++ b/man/kernel-install.xml @@ -171,11 +171,19 @@ KERNEL_INSTALL_BOOT_ROOT= is set for the plugins to the root directory (mount point, usually) of the hierarchy where boot-loader entries, kernel images, and associated resources should be placed. Can be overridden by setting BOOT_ROOT=. - KERNEL_INSTALL_LAYOUT=bls|other|... specifies the installation layout. + KERNEL_INSTALL_LAYOUT=bls|other|... is set for the plugins to specify the installation layout. Defaults to if $BOOT/MACHINE-ID exists, or otherwise. Additional layout names may be defined by convention. If a plugin uses a special layout, it's encouraged to declare its own layout name and configure layout= in install.conf upon initial installation. + KERNEL_INSTALL_INITRD_GENERATOR=... is set for plugins to select the initrd generator. + 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 e588e72bf9..3edefdefb4 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" @@ -38,6 +40,8 @@ fi case "$COMMAND" in remove) + [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \ + echo "Removing $BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION*.conf" exec rm -f \ "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf" \ "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+"*".conf" @@ -78,36 +82,33 @@ else fi if ! [ -d "$ENTRY_DIR_ABS" ]; then - if [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ]; then - echo "+mkdir -v -p $ENTRY_DIR_ABS" - mkdir -v -p "$ENTRY_DIR_ABS" - else - mkdir -p "$ENTRY_DIR_ABS" - fi + echo "Error: entry directory '$ENTRY_DIR_ABS' does not exist" >&2 + exit 1 fi install -g root -o root -m 0644 "$KERNEL_IMAGE" "$ENTRY_DIR_ABS/linux" || { - echo "Could not copy '$KERNEL_IMAGE' to '$ENTRY_DIR_ABS/linux'." >&2 + echo "Error: could not copy '$KERNEL_IMAGE' to '$ENTRY_DIR_ABS/linux'." >&2 exit 1 } 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 "Initrd '$initrd' not a file." >&2 + echo "Error: initrd '$initrd' not a file." >&2 exit 1 } initrd_basename="${initrd##*/}" [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "Installing $ENTRY_DIR_ABS/$initrd_basename" install -g root -o root -m 0644 "$initrd" "$ENTRY_DIR_ABS/$initrd_basename" || { - echo "Could not copy '$initrd' to '$ENTRY_DIR_ABS/$initrd_basename'." >&2 + echo "Error: could not copy '$initrd' to '$ENTRY_DIR_ABS/$initrd_basename'." >&2 exit 1 } done mkdir -p "${LOADER_ENTRY%/*}" || { - echo "Could not create loader entry directory '${LOADER_ENTRY%/*}'." >&2 + echo "Error: could not create loader entry directory '${LOADER_ENTRY%/*}'." >&2 exit 1 } @@ -118,14 +119,18 @@ 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 "Could not create loader entry '$LOADER_ENTRY'." >&2 + echo "Error: could not create loader entry '$LOADER_ENTRY'." >&2 exit 1 } exit 0 diff --git a/src/kernel-install/install.conf b/src/kernel-install/install.conf index e4802e6fae..43b6e7d792 100644 --- a/src/kernel-install/install.conf +++ b/src/kernel-install/install.conf @@ -8,3 +8,4 @@ # See kernel-install(8) for details. #layout=bls|other|... +#initrd_generator=dracut|... diff --git a/src/kernel-install/kernel-install b/src/kernel-install/kernel-install index e56483ef96..8cfef3208d 100755 --- a/src/kernel-install/kernel-install +++ b/src/kernel-install/kernel-install @@ -73,13 +73,16 @@ else fi if [ $# -lt 1 ]; then - echo "Not enough arguments" >&2 + echo "Error: not enough arguments" >&2 exit 1 fi KERNEL_VERSION="$1" shift +layout= +initrd_generator= + if [ -r "/etc/kernel/install.conf" ]; then . /etc/kernel/install.conf elif [ -r "/usr/lib/kernel/install.conf" ]; then @@ -123,12 +126,22 @@ if [ -z "$layout" ]; then fi 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=$? @@ -147,12 +160,12 @@ IFS=" case "$COMMAND" in add) if [ $# -lt 1 ]; then - echo "Command 'add' requires a kernel image" >&2 + echo "Error: command 'add' requires a kernel image" >&2 exit 1 fi if ! [ -f "$1" ]; then - echo "Kernel image argument $1 not a file" >&2 + echo "Error: kernel image argument $1 not a file" >&2 exit 1 fi @@ -162,9 +175,9 @@ case "$COMMAND" in # to serve as the indication to use or to not use the BLS if [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ]; then echo "+mkdir -v -p $ENTRY_DIR_ABS" - mkdir -v -p "$ENTRY_DIR_ABS" + mkdir -v -p "$ENTRY_DIR_ABS" || exit 1 else - mkdir -p "$ENTRY_DIR_ABS" + mkdir -p "$ENTRY_DIR_ABS" || exit 1 fi fi @@ -193,7 +206,7 @@ case "$COMMAND" in ;; *) - echo "Unknown command '$COMMAND'" >&2 + echo "Error: unknown command '$COMMAND'" >&2 exit 1 ;; esac