[OE-core] [PATCH 3/3] classes: Add gummiboot class

Darren Hart dvhart at linux.intel.com
Thu Mar 6 22:36:38 UTC 2014


On 3/6/14, 10:15, "Stefan Stanacar" <stefanx.stanacar at intel.com> wrote:

>Adds a gummiboot class similar to grub-efi class and makes the necessary
>changes so it can be used for live/hddimg images as well.
>
>One can set EFI_PROVIDER = "gummiboot" in local.conf to use gummiboot
>instead of grub-efi.
>Gummiboot requires some kernel options that are not enabled by default,
>so one has to build
>with KERNEL_FEATURES_append = " cfg/efi-ext".

cfg/efi is insufficient?

>
>The install scripts have been updated too, keeping the old behaviour
>around,
>but accounting for the new boot loader config files (if they exist).
>It can be argued that the installer and bootimg are a bit wierd and not
>necessarily correct,
>but I wanted to have the exact same behviour with gummiboot.
>With the default EFI_PROVIDER = "grub-efi" nothing changes, everthing
>should be just as before.
>
>I've tested live boot, install and normal boot on:
>    - FRI2
>    - genericx86-64 on NUC
>with:
>  EFI_PROVIDER = "gummiboot"
>  KERNEL_FEATURES_append = " cfg/efi-ext"
>in local.conf.
>
>Signed-off-by: Stefan Stanacar <stefanx.stanacar at intel.com>


Generally looks good. My only reservation is the same as for 2/3, should
we define an EFI interface rather than having to construct function names
in the consumers of this class?

--
Darren

>---
> meta/classes/gummiboot.bbclass                     | 112
>+++++++++++++++++++++
> .../initrdscripts/files/init-install-efi.sh        |  51 +++++++---
> 2 files changed, 147 insertions(+), 16 deletions(-)
> create mode 100644 meta/classes/gummiboot.bbclass
>
>diff --git a/meta/classes/gummiboot.bbclass
>b/meta/classes/gummiboot.bbclass
>new file mode 100644
>index 0000000..5c11286
>--- /dev/null
>+++ b/meta/classes/gummiboot.bbclass
>@@ -0,0 +1,112 @@
>+EFICLASS_FUNC_PREFIX = "gummiboot"
>+
>+do_bootimg[depends] += "gummiboot:do_deploy"
>+do_bootdirectdisk[depends] += "gummiboot:do_deploy"
>+
>+EFIDIR = "/EFI/BOOT"
>+
>+GUMMIBOOT_CFG ?= "${S}/loader.conf"
>+GUMMIBOOT_ENTRIES ?= ""
>+GUMMIBOOT_TIMEOUT ?= "10"
>+
>+gummiboot_populate() {
>+        DEST=$1
>+
>+        EFI_IMAGE="gummibootia32.efi"
>+        DEST_EFI_IMAGE="bootia32.efi"
>+        if [ "${TARGET_ARCH}" = "x86_64" ]; then
>+            EFI_IMAGE="gummibootx64.efi"
>+            DEST_EFI_IMAGE="bootx64.efi"
>+        fi
>+
>+        install -d ${DEST}${EFIDIR}
>+        # gummiboot requires these paths for configuration files
>+        # they are not customizable so no point in new vars
>+        install -d ${DEST}/loader
>+        install -d ${DEST}/loader/entries
>+        install -m 0644 ${DEPLOY_DIR_IMAGE}/${EFI_IMAGE}
>${DEST}${EFIDIR}/${DEST_EFI_IMAGE}
>+        install -m 0644 ${GUMMIBOOT_CFG} ${DEST}/loader/loader.conf
>+        for i in ${GUMMIBOOT_ENTRIES}; do
>+            install -m 0644 ${i} ${DEST}/loader/entries
>+        done
>+}
>+
>+gummiboot_iso_populate() {
>+        iso_dir=$1
>+        gummiboot_populate $iso_dir
>+        mkdir -p ${EFIIMGDIR}/${EFIDIR}
>+        cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
>+        cp $iso_dir/vmlinuz ${EFIIMGDIR}
>+        echo "${DEST_EFI_IMAGE}" > ${EFIIMGDIR}/startup.nsh
>+        if [ -f "$iso_dir/initrd" ] ; then
>+            cp $iso_dir/initrd ${EFIIMGDIR}
>+        fi
>+}
>+
>+gummiboot_hddimg_populate() {
>+        gummiboot_populate $1
>+}
>+
>+python build_gummiboot_cfg() {
>+    s = d.getVar("S", True)
>+    labels = d.getVar('LABELS', True)
>+    if not labels:
>+        bb.debug(1, "LABELS not defined, nothing to do")
>+        return
>+
>+    if labels == []:
>+        bb.debug(1, "No labels, nothing to do")
>+        return
>+
>+    cfile = d.getVar('GUMMIBOOT_CFG', True)
>+    try:
>+         cfgfile = open(cfile, 'w')
>+    except OSError:
>+        raise bb.build.funcFailed('Unable to open %s' % (cfile))
>+
>+    cfgfile.write('# Automatically created by OE\n')
>+    cfgfile.write('default %s\n' % (labels.split()[0]))
>+    timeout = d.getVar('GUMMIBOOT_TIMEOUT', True)
>+    if timeout:
>+        cfgfile.write('timeout %s\n' % timeout)
>+    else:
>+        cfgfile.write('timeout 10\n')
>+    cfgfile.close()
>+
>+    for label in labels.split():
>+        localdata = d.createCopy()
>+
>+        overrides = localdata.getVar('OVERRIDES', True)
>+        if not overrides:
>+            raise bb.build.FuncFailed('OVERRIDES not defined')
>+
>+        entryfile = "%s/%s.conf" % (s, label)
>+        d.appendVar("GUMMIBOOT_ENTRIES", " " + entryfile)
>+        try:
>+            entrycfg = open(entryfile, "w")
>+        except OSError:
>+            raise bb.build.funcFailed('Unable to open %s' % (entryfile))
>+        localdata.setVar('OVERRIDES', label + ':' + overrides)
>+        bb.data.update_data(localdata)
>+
>+        entrycfg.write('title %s\n' % label)
>+        entrycfg.write('linux /vmlinuz\n')
>+
>+        append = localdata.getVar('APPEND', True)
>+        initrd = localdata.getVar('INITRD', True)
>+
>+        if initrd:
>+            entrycfg.write('initrd /initrd\n')
>+        lb = label
>+        if label == "install":
>+            lb = "install-efi"
>+        entrycfg.write('options LABEL=%s ' % lb)
>+        if append:
>+            entrycfg.write('%s' % append)
>+        entrycfg.write('\n')
>+        entrycfg.close()
>+}
>+
>+python build_efi_cfg() {
>+    bb.build.exec_func("build_gummiboot_cfg", d)
>+}
>diff --git a/meta/recipes-core/initrdscripts/files/init-install-efi.sh
>b/meta/recipes-core/initrdscripts/files/init-install-efi.sh
>index 9846637..ed3221b 100644
>--- a/meta/recipes-core/initrdscripts/files/init-install-efi.sh
>+++ b/meta/recipes-core/initrdscripts/files/init-install-efi.sh
>@@ -104,6 +104,7 @@ parted /dev/${device} mklabel gpt
> 
> echo "Creating boot partition on $bootfs"
> parted /dev/${device} mkpart primary 0% $boot_size
>+parted /dev/${device} set 1 boot on
> 
> echo "Creating rootfs partition on $rootfs"
> parted /dev/${device} mkpart primary $rootfs_start $rootfs_end
>@@ -149,23 +150,41 @@ mount $bootfs /ssd
> 
> EFIDIR="/ssd/EFI/BOOT"
> mkdir -p $EFIDIR
>-GRUBCFG="$EFIDIR/grub.cfg"
>-
> cp /media/$1/vmlinuz /ssd
>-# Copy the efi loader and config (booti*.efi and grub.cfg)
>-cp /media/$1/EFI/BOOT/* $EFIDIR
>-
>-# Update grub config for the installed image
>-# Delete the install entry
>-sed -i "/menuentry 'install'/,/^}/d" $GRUBCFG
>-# Delete the initrd lines
>-sed -i "/initrd /d" $GRUBCFG
>-# Delete any LABEL= strings
>-sed -i "s/ LABEL=[^ ]*/ /" $GRUBCFG
>-# Delete any root= strings
>-sed -i "s/ root=[^ ]*/ /" $GRUBCFG
>-# Add the root= and other standard boot options
>-sed -i "s at linux /vmlinuz *@linux /vmlinuz root=$rootfs rw $rootwait
>quiet @" $GRUBCFG
>+# Copy the efi loader
>+cp /media/$1/EFI/BOOT/*.efi $EFIDIR
>+
>+if [ -f /media/$1/EFI/BOOT/grub.cfg ]; then
>+    GRUBCFG="$EFIDIR/grub.cfg"
>+    cp /media/$1/EFI/BOOT/grub.cfg $GRUBCFG
>+    # Update grub config for the installed image
>+    # Delete the install entry
>+    sed -i "/menuentry 'install'/,/^}/d" $GRUBCFG
>+    # Delete the initrd lines
>+    sed -i "/initrd /d" $GRUBCFG
>+    # Delete any LABEL= strings
>+    sed -i "s/ LABEL=[^ ]*/ /" $GRUBCFG
>+    # Delete any root= strings
>+    sed -i "s/ root=[^ ]*/ /" $GRUBCFG
>+    # Add the root= and other standard boot options
>+    sed -i "s at linux /vmlinuz *@linux /vmlinuz root=$rootfs rw $rootwait
>quiet @" $GRUBCFG
>+fi
>+
>+if [ -d /media/$1/loader ]; then
>+    GUMMIBOOT_CFGS="/ssd/loader/entries/*.conf"
>+    # copy config files for gummiboot
>+    cp -dr /media/$1/loader /ssd
>+    # delete the install entry
>+    rm -f /ssd/loader/entries/install.conf
>+    # delete the initrd lines
>+    sed -i "/initrd /d" $GUMMIBOOT_CFGS
>+    # delete any LABEL= strings
>+    sed -i "s/ LABEL=[^ ]*/ /" $GUMMIBOOT_CFGS
>+    # delete any root= strings
>+    sed -i "s/ root=[^ ]*/ /" $GUMMIBOOT_CFGS
>+    # add the root= and other standard boot options
>+    sed -i "s at options *@options root=$rootfs rw $rootwait quiet @"
>$GUMMIBOOT_CFGS
>+fi
> 
> umount /ssd
> sync
>-- 
>1.8.5.3
>
>


-- 
Darren Hart
Yocto Project - Linux Kernel
Intel Open Source Technology Center







More information about the Openembedded-core mailing list