On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
> On 3/6/14, 10:15, "Stefan Stanacar" <stefanx.stana...@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.stana...@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
> >
> >
>
>
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core