[elbe-devel] [PATCH v2 2/4] Add support for UEFI boot with grub
Martin Kaistra
martin.kaistra at linutronix.de
Wed Mar 28 14:16:54 CEST 2018
If the package grub-efi-amd64 is installed and <grub-install/> is
used in the xml, try to install grub on the boot partition
to the default fallback location \EFI\boot\bootx64.efi
Use grub_fw_type to differentiate between "bios" and "efi", so we can
pass that to the grub installer function.
This is currently specific to amd64, but it shouldn't be too difficult
to expand it to other target platforms which support uefi.
Signed-off-by: Martin Kaistra <martin.kaistra at linutronix.de>
---
elbepack/efilesystem.py | 5 +++--
elbepack/elbeproject.py | 8 +++++++-
elbepack/hdimg.py | 37 +++++++++++++++++++++++++++++--------
3 files changed, 39 insertions(+), 11 deletions(-)
diff --git a/elbepack/efilesystem.py b/elbepack/efilesystem.py
index e1bab181..a2781b5f 100644
--- a/elbepack/efilesystem.py
+++ b/elbepack/efilesystem.py
@@ -309,7 +309,7 @@ class TargetFs(ChRootFilesystem):
f.write(fstab.get_str())
f.close()
- def part_target(self, targetdir, grub_version):
+ def part_target(self, targetdir, grub_version, grub_fw_type):
# create target images and copy the rfs into them
self.images = do_hdimg(
@@ -317,7 +317,8 @@ class TargetFs(ChRootFilesystem):
self.xml,
targetdir,
self,
- grub_version)
+ grub_version,
+ grub_fw_type)
if self.xml.has("target/package/tar"):
targz_name = self.xml.text("target/package/tar/name")
diff --git a/elbepack/elbeproject.py b/elbepack/elbeproject.py
index be2b25f5..047020bc 100644
--- a/elbepack/elbeproject.py
+++ b/elbepack/elbeproject.py
@@ -471,15 +471,21 @@ class ElbeProject (object):
grub_version = 199
else:
grub_version = 202
+ grub_fw_type = "bios"
+ elif self.get_rpcaptcache().is_installed('grub-efi-amd64'):
+ grub_version = 202
+ grub_fw_type = "efi"
elif self.get_rpcaptcache().is_installed('grub-legacy'):
self.log.printo("package grub-legacy is installed, "
"this is obsolete, skipping grub")
grub_version = 0
+ grub_fw_type = ""
else:
self.log.printo("package grub-pc is not installed, skipping grub")
# version 0 == skip_grub
grub_version = 0
- self.targetfs.part_target(self.builddir, grub_version)
+ grub_fw_type = ""
+ self.targetfs.part_target(self.builddir, grub_version, grub_fw_type)
# Build cdrom images
self.repo_images = []
diff --git a/elbepack/hdimg.py b/elbepack/hdimg.py
index e1dc2aae..ddc3138c 100644
--- a/elbepack/hdimg.py
+++ b/elbepack/hdimg.py
@@ -186,10 +186,11 @@ def size_to_int(size):
class grubinstaller_base(object):
- def __init__(self, outf):
+ def __init__(self, outf, fw_type="bios"):
self.outf = outf
self.root = None
self.boot = None
+ self.fw_type = fw_type
def set_boot_entry(self, entry):
print("setting boot entry")
@@ -249,9 +250,15 @@ class grubinstaller202(grubinstaller_base):
self.outf.do("chroot %s update-initramfs -u -k all" % imagemnt)
self.outf.do("chroot %s update-grub2" % imagemnt)
- self.outf.do(
- "chroot %s grub-install --no-floppy /dev/poop0" %
- (imagemnt))
+ if self.fw_type == "efi":
+ self.outf.do(
+ "chroot %s grub-install --target=x86_64-efi --removable "
+ "--efi-directory=/boot --no-floppy /dev/poop0" %
+ (imagemnt))
+ else:
+ self.outf.do(
+ "chroot %s grub-install --no-floppy /dev/poop0" %
+ (imagemnt))
finally:
os.unlink(os.path.join(imagemnt, "boot/grub/device.map"))
@@ -480,7 +487,7 @@ def create_logical_partitions(
current_sector += lpart.getLength()
-def do_image_hd(outf, hd, fslabel, target, grub_version):
+def do_image_hd(outf, hd, fslabel, target, grub_version, grub_fw_type):
sector_size = 512
s = size_to_int(hd.text("size"))
@@ -500,6 +507,8 @@ def do_image_hd(outf, hd, fslabel, target, grub_version):
if grub_version == 199:
grub = grubinstaller199(outf)
+ elif grub_version == 202 and grub_fw_type == "efi":
+ grub = grubinstaller202(outf, "efi")
elif grub_version == 202:
grub = grubinstaller202(outf)
else:
@@ -574,7 +583,7 @@ def add_binary_blob(outf, hd, target):
bs))
-def do_hdimg(outf, xml, target, rfs, grub_version):
+def do_hdimg(outf, xml, target, rfs, grub_version, grub_fw_type):
# list of created files
img_files = []
@@ -623,11 +632,23 @@ def do_hdimg(outf, xml, target, rfs, grub_version):
# Now iterate over all images and create filesystems and partitions
for i in xml.tgt.node("images"):
if i.tag == "msdoshd":
- img = do_image_hd(outf, i, fslabel, target, grub_version)
+ img = do_image_hd(
+ outf,
+ i,
+ fslabel,
+ target,
+ grub_version,
+ grub_fw_type)
img_files.append(img)
if i.tag == "gpthd":
- img = do_image_hd(outf, i, fslabel, target, grub_version)
+ img = do_image_hd(
+ outf,
+ i,
+ fslabel,
+ target,
+ grub_version,
+ grub_fw_type)
img_files.append(img)
if i.tag == "mtd":
--
2.11.0
More information about the elbe-devel
mailing list