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