[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