]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
kernel-install: handle uki installs automatically 26119/head
authorGerd Hoffmann <kraxel@redhat.com>
Fri, 20 Jan 2023 08:05:18 +0000 (09:05 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Tue, 7 Mar 2023 07:14:46 +0000 (08:14 +0100)
Detect image type using "bootctl kernel-identify $kernel",
store result in KERNEL_INSTALL_IMAGE_TYPE.

Extend layout autodetection to check the kernel image type
and pick layout=uki for UKIs.

Resolves: #25822

man/kernel-install.xml
src/kernel-install/kernel-install.in

index f27036ea3934df7c2d223d2f8d98e730c3456eab..a57e3e37596d46fc0d49280f6255d0fa94a2ca2a 100644 (file)
       (EFI System Partition) are mounted, and also conceptually referred to as <varname>$BOOT</varname>. Can
       be overridden by setting <varname>$BOOT_ROOT</varname> (see below).</para>
 
-      <para><varname>$KERNEL_INSTALL_LAYOUT=bls|uki|other|...</varname> is set for the plugins to specify the
-      installation layout. Defaults to <option>bls</option> if
-      <filename>$BOOT/<replaceable>ENTRY-TOKEN</replaceable></filename> exists, or <option>other</option>
-      otherwise. Additional layout names may be defined by convention. If a plugin uses a special layout,
+      <para><varname>$KERNEL_INSTALL_LAYOUT=auto|bls|uki|other|...</varname> is set for the plugins to specify the
+      installation 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. The following values are currently
       understood:</para>
             <para>Some other layout not understood natively by <command>kernel-install</command>.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term>auto</term>
+          <listitem>
+            <para>Pick the layout automatically. If the kernel is a UKI set layout to
+            <option>uki</option>. If not default to <option>bls</option> if
+            <filename>$BOOT/loader/entries.srel</filename> with content <literal>type1</literal> or
+            <filename>$BOOT/<replaceable>ENTRY-TOKEN</replaceable></filename> exists, or
+            <option>other</option> otherwise.</para>
+            <para>Leaving layout blank has the same effect. This is the default.</para>
+          </listitem>
+        </varlistentry>
       </variablelist>
 
       <para><varname>$KERNEL_INSTALL_INITRD_GENERATOR</varname> is set for plugins to select the initrd
index fa2c0d5276aca016ea9478a7a6ed7481bbb209e9..25884fc0e234b8321782dd3686a2dfb0aa79d5f8 100755 (executable)
@@ -250,10 +250,18 @@ if [ -z "$ENTRY_TOKEN" ]; then
         echo "No entry-token candidate matched, using \"$ENTRY_TOKEN\" from machine-id"
 fi
 
-if [ -z "$layout" ]; then
+export KERNEL_INSTALL_IMAGE_TYPE=""
+if [ -f "$1" ]; then
+    KERNEL_INSTALL_IMAGE_TYPE="$(bootctl kernel-identify "$1" 2>/dev/null || echo "unknown")"
+fi
+
+if [ "$layout" = "auto" ] || [ -z "$layout" ]; then
     # No layout configured by the administrator. Let's try to figure it out
     # automatically from metadata already contained in $BOOT_ROOT.
-    if [ -e "$BOOT_ROOT/loader/entries.srel" ]; then
+    if [ "$KERNEL_INSTALL_IMAGE_TYPE" = "uki" ]; then
+        layout="uki"
+        log_verbose "Kernel image is UKI, using layout=$layout"
+    elif [ -e "$BOOT_ROOT/loader/entries.srel" ]; then
         read -r ENTRIES_SREL <"$BOOT_ROOT/loader/entries.srel"
         if [ "$ENTRIES_SREL" = "type1" ]; then
             # The loader/entries.srel file clearly indicates that the installed