1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-31 00:39:46 +00:00

classes: Add gummiboot class

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".

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.

(From OE-Core rev: b457e40fc69cc6503dc566f16495f03606e5333b)

Signed-off-by: Stefan Stanacar <stefanx.stanacar@intel.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Stefan Stanacar
2014-03-06 19:59:07 +02:00
committed by Richard Purdie
parent 9d04183cf8
commit 5f05bdda0b
2 changed files with 148 additions and 15 deletions
+114
View File
@@ -0,0 +1,114 @@
# Copyright (C) 2014 Intel Corporation
#
# Released under the MIT license (see COPYING.MIT)
# gummiboot.bbclass - equivalent of grub-efi.bbclass
# Set EFI_PROVIDER = "gummiboot" to use gummiboot on your live images instead of grub-efi
# (images built by bootimage.bbclass or boot-directdisk.bbclass)
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"
efi_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
}
efi_iso_populate() {
iso_dir=$1
efi_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
}
efi_hddimg_populate() {
efi_populate $1
}
python build_efi_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()
}
@@ -104,6 +104,7 @@ parted /dev/${device} mklabel gpt
echo "Creating boot partition on $bootfs" echo "Creating boot partition on $bootfs"
parted /dev/${device} mkpart primary 0% $boot_size parted /dev/${device} mkpart primary 0% $boot_size
parted /dev/${device} set 1 boot on
echo "Creating rootfs partition on $rootfs" echo "Creating rootfs partition on $rootfs"
parted /dev/${device} mkpart primary $rootfs_start $rootfs_end parted /dev/${device} mkpart primary $rootfs_start $rootfs_end
@@ -149,23 +150,41 @@ mount $bootfs /ssd
EFIDIR="/ssd/EFI/BOOT" EFIDIR="/ssd/EFI/BOOT"
mkdir -p $EFIDIR mkdir -p $EFIDIR
GRUBCFG="$EFIDIR/grub.cfg"
cp /media/$1/vmlinuz /ssd cp /media/$1/vmlinuz /ssd
# Copy the efi loader and config (booti*.efi and grub.cfg) # Copy the efi loader
cp /media/$1/EFI/BOOT/* $EFIDIR cp /media/$1/EFI/BOOT/*.efi $EFIDIR
# Update grub config for the installed image if [ -f /media/$1/EFI/BOOT/grub.cfg ]; then
# Delete the install entry GRUBCFG="$EFIDIR/grub.cfg"
sed -i "/menuentry 'install'/,/^}/d" $GRUBCFG cp /media/$1/EFI/BOOT/grub.cfg $GRUBCFG
# Delete the initrd lines # Update grub config for the installed image
sed -i "/initrd /d" $GRUBCFG # Delete the install entry
# Delete any LABEL= strings sed -i "/menuentry 'install'/,/^}/d" $GRUBCFG
sed -i "s/ LABEL=[^ ]*/ /" $GRUBCFG # Delete the initrd lines
# Delete any root= strings sed -i "/initrd /d" $GRUBCFG
sed -i "s/ root=[^ ]*/ /" $GRUBCFG # Delete any LABEL= strings
# Add the root= and other standard boot options sed -i "s/ LABEL=[^ ]*/ /" $GRUBCFG
sed -i "s@linux /vmlinuz *@linux /vmlinuz root=$rootfs rw $rootwait quiet @" $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 umount /ssd
sync sync