[elbe-devel] [PATCH] Add support for hybrid images (UEFI+Bios)

Martin Kaistra martin.kaistra at linutronix.de
Mon Mar 26 16:45:36 CEST 2018


This patch adds the possibility to create images which
can boot from UEFI as well as Bios.

How to use:
You need to add the packages grub-efi-amd64-bin and grub-pc
and a small (1MiB should be enough) partition with <biosgrub> in
addition to a standard UEFI image.

Signed-off-by: Martin Kaistra <martin.kaistra at linutronix.de>
---
 elbepack/elbeproject.py |  6 +++++-
 elbepack/hdimg.py       | 15 +++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/elbepack/elbeproject.py b/elbepack/elbeproject.py
index 047020bc..1cb22ef5 100644
--- a/elbepack/elbeproject.py
+++ b/elbepack/elbeproject.py
@@ -466,7 +466,11 @@ class ElbeProject (object):
         # jessie and wheezy grubs are 2.0 but differ in behaviour
         #
         # We might also want support for legacy grub
-        if self.get_rpcaptcache().is_installed('grub-pc'):
+        if (self.get_rpcaptcache().is_installed('grub-pc') and
+                self.get_rpcaptcache().is_installed('grub-efi-amd64-bin')):
+            grub_version = 202
+            grub_fw_type = "hybrid"
+        elif self.get_rpcaptcache().is_installed('grub-pc'):
             if self.codename == "wheezy":
                 grub_version = 199
             else:
diff --git a/elbepack/hdimg.py b/elbepack/hdimg.py
index f505208c..a84c0a5d 100644
--- a/elbepack/hdimg.py
+++ b/elbepack/hdimg.py
@@ -190,6 +190,7 @@ class grubinstaller_base(object):
         self.outf = outf
         self.root = None
         self.boot = None
+        self.fw_type = None
 
     def set_boot_entry(self, entry):
         print("setting boot entry")
@@ -289,6 +290,9 @@ class grubinstaller202(grubinstaller_base):
 
 class grubinstaller202efi(grubinstaller_base):
 
+    def set_fw_type(self, fw_type):
+        self.fw_type = fw_type
+
     def install(self, target):
         if not self.root:
             return
@@ -340,6 +344,13 @@ class grubinstaller202efi(grubinstaller_base):
                 "--removable --no-floppy /dev/poop0" %
                 (imagemnt))
 
+            # when we are in hybrid mode, install grub also into MBR
+            if self.fw_type == "hybrid":
+                self.outf.do(
+                    "chroot %s grub-install --target=i386-pc "
+                    "--no-floppy /dev/poop0" %
+                    (imagemnt))
+
         finally:
             os.unlink(os.path.join(imagemnt, "boot/grub/device.map"))
             self.outf.do(
@@ -589,6 +600,10 @@ def do_image_hd(outf, hd, fslabel, target, grub_version, grub_fw_type):
         grub = grubinstaller199(outf)
     elif grub_version == 202 and grub_fw_type == "efi":
         grub = grubinstaller202efi(outf)
+        grub.set_fw_type("efi")
+    elif grub_version == 202 and grub_fw_type == "hybrid":
+        grub = grubinstaller202efi(outf)
+        grub.set_fw_type("hybrid")
     elif grub_version == 202:
         grub = grubinstaller202(outf)
     else:
-- 
2.11.0




More information about the elbe-devel mailing list