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

Reply via email to