Patchwork [3/3] classes: Add gummiboot class

login
register
mail settings
Submitter Stanacar, StefanX
Date March 6, 2014, 6:15 p.m.
Message ID <23d446488f4304516b483a2293bd34c86a23bdff.1394128875.git.stefanx.stanacar@intel.com>
Download mbox | patch
Permalink /patch/68171/
State New
Headers show

Comments

Stanacar, StefanX - March 6, 2014, 6:15 p.m.
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".

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@intel.com>
---
 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
Darren Hart - March 6, 2014, 10:36 p.m.
On 3/6/14, 10:15, "Stefan Stanacar" <stefanx.stanacar@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@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@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@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@options *@options root=$rootfs rw $rootwait quiet @"
>$GUMMIBOOT_CFGS
>+fi
> 
> umount /ssd
> sync
>-- 
>1.8.5.3
>
>
Stanacar, StefanX - March 7, 2014, 9:57 a.m.
On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
> On 3/6/14, 10:15, "Stefan Stanacar" <stefanx.stanacar@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?
> 

cfg/efi doesn't have CONFIG_EFI_STUB=y which is required by gummiboot.
cfg/efi-ext adds more than that, it's true.

It's also a good idea to enable CONFIG_EFIVARS_FS, which is the
newer/better interface than CONFIG_EFI_VARS that cfg/efi-ext enables.

> >
> >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@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?

I don't have a strong opinion here, it just seemed the simplest way atm,
then adding another interface.

Cheers,
Stefan

> 
> --
> 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@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@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@options *@options root=$rootfs rw $rootwait quiet @"
> >$GUMMIBOOT_CFGS
> >+fi
> > 
> > umount /ssd
> > sync
> >-- 
> >1.8.5.3
> >
> >
> 
>
Darren Hart - March 11, 2014, 9:38 p.m.
On 3/7/14, 1:57, "Stanacar, StefanX" <stefanx.stanacar@intel.com> wrote:

>
>
>
>On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
>> On 3/6/14, 10:15, "Stefan Stanacar" <stefanx.stanacar@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?
>> 
>
>cfg/efi doesn't have CONFIG_EFI_STUB=y which is required by gummiboot.
>cfg/efi-ext adds more than that, it's true.

Weird... Although the STUB should probably be in efi rather than efi-ext.
I'm surprised gummiboot requires STUB... Since STUB is there to allow the
kernel to be booted directly, no bootloader required. I guess gummiboot is
slightly less than a boot loader :-)

I'd Ack a patch to move STUB from efi-ext to efi.


>
>It's also a good idea to enable CONFIG_EFIVARS_FS, which is the
>newer/better interface than CONFIG_EFI_VARS that cfg/efi-ext enables.


Hrm... OK, perhaps time to revisit those fragments and update them for
current usage.


--
Darren

>> >
>> >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@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?
>
>I don't have a strong opinion here, it just seemed the simplest way atm,
>then adding another interface.
>
>Cheers,
>Stefan
>
>> 
>> --
>> 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@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@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@options *@options root=$rootfs rw $rootwait quiet @"
>> >$GUMMIBOOT_CFGS
>> >+fi
>> > 
>> > umount /ssd
>> > sync
>> >-- 
>> >1.8.5.3
>> >
>> >
>> 
>> 
>
>
Koen Kooi - March 12, 2014, 6:18 a.m.
Op 11 mrt. 2014, om 22:38 heeft Darren Hart <dvhart@linux.intel.com> het volgende geschreven:

> On 3/7/14, 1:57, "Stanacar, StefanX" <stefanx.stanacar@intel.com> wrote:
> 
>> 
>> 
>> 
>> On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
>>> On 3/6/14, 10:15, "Stefan Stanacar" <stefanx.stanacar@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?
>>> 
>> 
>> cfg/efi doesn't have CONFIG_EFI_STUB=y which is required by gummiboot.
>> cfg/efi-ext adds more than that, it's true.
> 
> Weird... Although the STUB should probably be in efi rather than efi-ext.
> I'm surprised gummiboot requires STUB... Since STUB is there to allow the
> kernel to be booted directly, no bootloader required. I guess gummiboot is
> slightly less than a boot loader :-)

The gummiboot docs still claim to support both 'linux' and 'efi', so it's supposed to work.

regards,

Koen

> 
> I'd Ack a patch to move STUB from efi-ext to efi.
> 
> 
>> 
>> It's also a good idea to enable CONFIG_EFIVARS_FS, which is the
>> newer/better interface than CONFIG_EFI_VARS that cfg/efi-ext enables.
> 
> 
> Hrm... OK, perhaps time to revisit those fragments and update them for
> current usage.
> 
> 
> --
> Darren
> 
>>>> 
>>>> 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@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?
>> 
>> I don't have a strong opinion here, it just seemed the simplest way atm,
>> then adding another interface.
>> 
>> Cheers,
>> Stefan
>> 
>>> 
>>> --
>>> 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@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@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@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
Matt Fleming - March 12, 2014, 9:39 a.m.
On Tue, 11 Mar, at 01:38:08PM, Darren Hart wrote:
> 
> I'm surprised gummiboot requires STUB... Since STUB is there to allow the
> kernel to be booted directly, no bootloader required. I guess gummiboot is
> slightly less than a boot loader :-)

Gummiboot is an EFI application loader.

Since CONFIG_EFI_STUB sticks a PE/COFF header at the front of the
bzImage, it appears as an EFI application which gummiboot knows how to
load and run. This is also the reason you can execute the bzImage from
the EFI shell (or Boot Manager).
Stanacar, StefanX - March 12, 2014, 10:04 a.m.
On Wed, 2014-03-12 at 07:18 +0100, Koen Kooi wrote:
> Op 11 mrt. 2014, om 22:38 heeft Darren Hart <dvhart@linux.intel.com> het volgende geschreven:
> 
> > On 3/7/14, 1:57, "Stanacar, StefanX" <stefanx.stanacar@intel.com> wrote:
> > 
> >> 
> >> 
> >> 
> >> On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
> >>> On 3/6/14, 10:15, "Stefan Stanacar" <stefanx.stanacar@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?
> >>> 
> >> 
> >> cfg/efi doesn't have CONFIG_EFI_STUB=y which is required by gummiboot.
> >> cfg/efi-ext adds more than that, it's true.
> > 
> > Weird... Although the STUB should probably be in efi rather than efi-ext.
> > I'm surprised gummiboot requires STUB... Since STUB is there to allow the
> > kernel to be booted directly, no bootloader required. I guess gummiboot is
> > slightly less than a boot loader :-)
> 
> The gummiboot docs still claim to support both 'linux' and 'efi', so it's supposed to work.

The site claims that Linux kernels need to be built with
CONFIG_EFI_STUB, and without that for me it wouldn't boot.

What you're saying is for the config file 
From the site:

efi	executable EFI image
options	options to pass to the EFI image / kernel command line
linux	linux kernel image (gummiboot still requires the kernel to have an
EFI stub)
initrd	initramfs image (gummiboot just adds this as option initrd=)

Cheers,
Stefan

> 
> regards,
> 
> Koen
> 
> > 
> > I'd Ack a patch to move STUB from efi-ext to efi.
> > 
> > 
> >> 
> >> It's also a good idea to enable CONFIG_EFIVARS_FS, which is the
> >> newer/better interface than CONFIG_EFI_VARS that cfg/efi-ext enables.
> > 
> > 
> > Hrm... OK, perhaps time to revisit those fragments and update them for
> > current usage.
> > 
> > 
> > --
> > Darren
> > 
> >>>> 
> >>>> 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@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?
> >> 
> >> I don't have a strong opinion here, it just seemed the simplest way atm,
> >> then adding another interface.
> >> 
> >> Cheers,
> >> Stefan
> >> 
> >>> 
> >>> --
> >>> 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@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@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@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
>

Patch

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@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@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@options *@options root=$rootfs rw $rootwait quiet @" $GUMMIBOOT_CFGS
+fi
 
 umount /ssd
 sync