[OE-core] [PATCH 3/3] classes: Add gummiboot class
Darren Hart
dvhart at linux.intel.com
Tue Mar 11 21:38:08 UTC 2014
On 3/7/14, 1:57, "Stanacar, StefanX" <stefanx.stanacar at 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 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?
>>
>
>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 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?
>
>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 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