[v2,08/11] wic: Add hybrid-boot bootloader source plugin

Message ID 74c8eb194dee34263799e64e96bcd1dfff45a105.1705239574.git.jan.kiszka@siemens.com
State Accepted, archived
Headers show
Series Add support for BeaglePlay | expand

Commit Message

Jan Kiszka Jan. 14, 2024, 1:39 p.m. UTC
From: Jan Kiszka <jan.kiszka@siemens.com>

Creates a hybrid partition table of both GPT and DOS, only adding the
first active partition to the DOS table. This addresses use cases where
the (firmware-)bootable partition is not the EFI partition while EFI
should be used later on. The bootimg-biosplusefi does not suite here.

Usage in a wks file:

part /bootable-partition --active ...
part / ...
bootloader --source hybrid-boot ...

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 .../lib/wic/plugins/source/hybrid-boot.py     | 38 +++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 meta/scripts/lib/wic/plugins/source/hybrid-boot.py

Patch

diff --git a/meta/scripts/lib/wic/plugins/source/hybrid-boot.py b/meta/scripts/lib/wic/plugins/source/hybrid-boot.py
new file mode 100644
index 00000000..c73e89e6
--- /dev/null
+++ b/meta/scripts/lib/wic/plugins/source/hybrid-boot.py
@@ -0,0 +1,38 @@ 
+#
+# Copyright (c) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+#
+# DESCRIPTION
+# This creates a hybrid DOS partition table for a GPT disk, adding the
+# partition marked as bootable to that table. This is useful if the boot
+# partition is different from the EFI partition so that bootimg-biosplusefi
+# cannot be used. Implemented as bootloader source plugin.
+
+import logging
+
+from wic import WicError
+from wic.pluginbase import SourcePlugin
+from wic.misc import exec_native_cmd
+
+logger = logging.getLogger('wic')
+
+class HybridBoot(SourcePlugin):
+    """
+    Create hybrid partition table with a single bootable partition.
+    """
+
+    name = 'hybrid-boot'
+
+    @classmethod
+    def do_install_disk(cls, disk, disk_name, creator, workdir, oe_builddir,
+                        bootimg_dir, kernel_dir, native_sysroot):
+        for part in creator.parts:
+            if part.active:
+                break
+        else:
+            raise WicError("No active partition found")
+
+        logger.info("Creating hybrid partition table, using partition %d as bootable DOS partition" % part.realnum)
+        exec_native_cmd("sgdisk %s --hybrid %d:EE" % (disk.path, part.realnum), native_sysroot)
+        exec_native_cmd("sfdisk --label-nested dos -A %s %d" % (disk.path, part.realnum), native_sysroot)