Op 11 mrt. 2014, om 22:38 heeft Darren Hart <dvh...@linux.intel.com> het volgende geschreven:
> On 3/7/14, 1:57, "Stanacar, StefanX" <stefanx.stana...@intel.com> wrote: > >> >> >> >> 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. > > 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.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 >>>> >>>> >>> >>> >> >> > > > -- > Darren Hart > Yocto Project - Linux Kernel > Intel Open Source Technology Center -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core