[OE-core] [PATCH 3/3] classes: Add gummiboot class
Koen Kooi
koen at dominion.thruhere.net
Wed Mar 12 06:18:50 UTC 2014
Op 11 mrt. 2014, om 22:38 heeft Darren Hart <dvhart at linux.intel.com> het volgende geschreven:
> 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 :-)
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.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