1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-03-08 20:58:20 +03:00

Merge pull request #22175 from keszybz/kernel-install-mkosi-initrd

kernel-install: add support for KERNEL_INSTALL_INITRD_GENERATOR and KERNEL_INSTALL_STAGING_AREA
This commit is contained in:
Luca Boccassi 2022-01-31 23:09:46 +00:00 committed by GitHub
commit 9d67fb0e33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 49 additions and 22 deletions

View File

@ -171,11 +171,19 @@
<para><varname>KERNEL_INSTALL_BOOT_ROOT=</varname> is set for the plugins to the root directory (mount point, usually) of the hierarchy <para><varname>KERNEL_INSTALL_BOOT_ROOT=</varname> 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 <varname>BOOT_ROOT=</varname>.</para> where boot-loader entries, kernel images, and associated resources should be placed. Can be overridden by setting <varname>BOOT_ROOT=</varname>.</para>
<para><varname>KERNEL_INSTALL_LAYOUT=bls|other|...</varname> specifies the installation layout. <para><varname>KERNEL_INSTALL_LAYOUT=bls|other|...</varname> is set for the plugins to specify the installation layout.
Defaults to <option>bls</option> if <filename>$BOOT/<replaceable>MACHINE-ID</replaceable></filename> exists, or <option>other</option> otherwise. Defaults to <option>bls</option> if <filename>$BOOT/<replaceable>MACHINE-ID</replaceable></filename> exists, or <option>other</option> otherwise.
Additional layout names may be defined by convention. If a plugin uses a special layout, 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 <varname>layout=</varname> in <filename>install.conf</filename> upon initial installation.</para> it's encouraged to declare its own layout name and configure <varname>layout=</varname> in <filename>install.conf</filename> upon initial installation.</para>
<para><varname>KERNEL_INSTALL_INITRD_GENERATOR=...</varname> is set for plugins to select the initrd generator.
This should be configured as <varname>initrd_generator=</varname> in <filename>install.conf</filename>.
</para>
<para><varname>KERNEL_INSTALL_STAGING_AREA=...</varname> 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.</para>
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term>bls</term> <term>bls</term>

View File

@ -18,6 +18,8 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>. # along with systemd; If not, see <http://www.gnu.org/licenses/>.
shopt -s nullglob
COMMAND="$1" COMMAND="$1"
KERNEL_VERSION="$2" KERNEL_VERSION="$2"
ENTRY_DIR_ABS="$3" ENTRY_DIR_ABS="$3"
@ -38,6 +40,8 @@ fi
case "$COMMAND" in case "$COMMAND" in
remove) remove)
[ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \
echo "Removing $BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION*.conf"
exec rm -f \ exec rm -f \
"$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf" \ "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf" \
"$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+"*".conf" "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+"*".conf"
@ -78,36 +82,33 @@ else
fi fi
if ! [ -d "$ENTRY_DIR_ABS" ]; then if ! [ -d "$ENTRY_DIR_ABS" ]; then
if [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ]; then echo "Error: entry directory '$ENTRY_DIR_ABS' does not exist" >&2
echo "+mkdir -v -p $ENTRY_DIR_ABS" exit 1
mkdir -v -p "$ENTRY_DIR_ABS"
else
mkdir -p "$ENTRY_DIR_ABS"
fi
fi fi
install -g root -o root -m 0644 "$KERNEL_IMAGE" "$ENTRY_DIR_ABS/linux" || { 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 exit 1
} }
shift "$INITRD_OPTIONS_SHIFT" 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" ] || { [ -f "$initrd" ] || {
echo "Initrd '$initrd' not a file." >&2 echo "Error: initrd '$initrd' not a file." >&2
exit 1 exit 1
} }
initrd_basename="${initrd##*/}" initrd_basename="${initrd##*/}"
[ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "Installing $ENTRY_DIR_ABS/$initrd_basename" [ "$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" || { 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 exit 1
} }
done done
mkdir -p "${LOADER_ENTRY%/*}" || { 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 exit 1
} }
@ -118,14 +119,18 @@ mkdir -p "${LOADER_ENTRY%/*}" || {
echo "machine-id $MACHINE_ID" echo "machine-id $MACHINE_ID"
echo "options $BOOT_OPTIONS" echo "options $BOOT_OPTIONS"
echo "linux $ENTRY_DIR/linux" echo "linux $ENTRY_DIR/linux"
for initrd; do
have_initrd=
for initrd in "${@}" "${KERNEL_INSTALL_STAGING_AREA}"/initrd*; do
echo "initrd $ENTRY_DIR/${initrd##*/}" echo "initrd $ENTRY_DIR/${initrd##*/}"
have_initrd=yes
done done
# Try "initrd", generated by dracut in its kernel-install hook, if no initrds were supplied # 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" || { } >"$LOADER_ENTRY" || {
echo "Could not create loader entry '$LOADER_ENTRY'." >&2 echo "Error: could not create loader entry '$LOADER_ENTRY'." >&2
exit 1 exit 1
} }
exit 0 exit 0

View File

@ -8,3 +8,4 @@
# See kernel-install(8) for details. # See kernel-install(8) for details.
#layout=bls|other|... #layout=bls|other|...
#initrd_generator=dracut|...

View File

@ -73,13 +73,16 @@ else
fi fi
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
echo "Not enough arguments" >&2 echo "Error: not enough arguments" >&2
exit 1 exit 1
fi fi
KERNEL_VERSION="$1" KERNEL_VERSION="$1"
shift shift
layout=
initrd_generator=
if [ -r "/etc/kernel/install.conf" ]; then if [ -r "/etc/kernel/install.conf" ]; then
. /etc/kernel/install.conf . /etc/kernel/install.conf
elif [ -r "/usr/lib/kernel/install.conf" ]; then elif [ -r "/usr/lib/kernel/install.conf" ]; then
@ -123,12 +126,22 @@ if [ -z "$layout" ]; then
fi fi
fi fi
ENTRY_DIR_ABS="$BOOT_ROOT/$MACHINE_ID/$KERNEL_VERSION" 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_MACHINE_ID="$MACHINE_ID"
export KERNEL_INSTALL_BOOT_ROOT="$BOOT_ROOT" export KERNEL_INSTALL_BOOT_ROOT="$BOOT_ROOT"
export KERNEL_INSTALL_LAYOUT="$layout" export KERNEL_INSTALL_LAYOUT="$layout"
export KERNEL_INSTALL_INITRD_GENERATOR="$initrd_generator"
export KERNEL_INSTALL_STAGING_AREA
[ "$layout" = "bls" ] [ "$layout" = "bls" ]
MAKE_ENTRY_DIR_ABS=$? MAKE_ENTRY_DIR_ABS=$?
@ -147,12 +160,12 @@ IFS="
case "$COMMAND" in case "$COMMAND" in
add) add)
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
echo "Command 'add' requires a kernel image" >&2 echo "Error: command 'add' requires a kernel image" >&2
exit 1 exit 1
fi fi
if ! [ -f "$1" ]; then 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 exit 1
fi fi
@ -162,9 +175,9 @@ case "$COMMAND" in
# to serve as the indication to use or to not use the BLS # to serve as the indication to use or to not use the BLS
if [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ]; then if [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ]; then
echo "+mkdir -v -p $ENTRY_DIR_ABS" echo "+mkdir -v -p $ENTRY_DIR_ABS"
mkdir -v -p "$ENTRY_DIR_ABS" mkdir -v -p "$ENTRY_DIR_ABS" || exit 1
else else
mkdir -p "$ENTRY_DIR_ABS" mkdir -p "$ENTRY_DIR_ABS" || exit 1
fi fi
fi fi
@ -193,7 +206,7 @@ case "$COMMAND" in
;; ;;
*) *)
echo "Unknown command '$COMMAND'" >&2 echo "Error: unknown command '$COMMAND'" >&2
exit 1 exit 1
;; ;;
esac esac