]> code.ossystems Code Review - openembedded-core.git/commitdiff
bootimg: Use the same OS files for each boot method
authorDarren Hart <dvhart@linux.intel.com>
Thu, 2 Feb 2012 00:15:04 +0000 (16:15 -0800)
committerSaul Wold <sgw@linux.intel.com>
Tue, 7 Feb 2012 22:37:12 +0000 (14:37 -0800)
Fixes [YOCTO #1951]

The do_bootimg code can generate hybrid efi+pcbios images (syslinux and
grub-efi) to boot on platforms with both EFI and legacy BIOS options. The
current implementation copies the kernel, initrd, and rootfs twice,
unnecessarily bloating the image size. This is an especially egregious bug
on -sato images.

Update the classes to use a common install of the kernel, initrd, and rootfs to
the root of the boot media. Grub-efi, syslinux, and isolinux can all reference
this location explicitly with a leading slash.

Tested with an EFI+PCBIOS image in both EFI and PCBIOS boot modes on two
platforms. No ISO image testing was performed.

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
meta/classes/bootimg.bbclass
meta/classes/grub-efi.bbclass
meta/classes/syslinux.bbclass

index a717600cf98844012f3c8856cdfd1725b51471b5..1d1a3d04af7eb1cbd4b382192edd0cbeff965aad 100644 (file)
@@ -8,13 +8,13 @@
 # End result is two things:
 #
 # 1. A .hddimg file which is an msdos filesystem containing syslinux, a kernel,
-# an initrd and a rootfs image. These can be written to harddisks directly and 
+# an initrd and a rootfs image. These can be written to harddisks directly and
 # also booted on USB flash disks (write them there with dd).
 #
 # 2. A CD .iso image
 
-# Boot process is that the initrd will boot and process which label was selected 
-# in syslinux. Actions based on the label are then performed (e.g. installing to 
+# Boot process is that the initrd will boot and process which label was selected
+# in syslinux. Actions based on the label are then performed (e.g. installing to
 # an hdd)
 
 # External variables (also used by syslinux.bbclass)
@@ -29,8 +29,8 @@ do_bootimg[depends] += "dosfstools-native:do_populate_sysroot \
 PACKAGES = " "
 EXCLUDE_FROM_WORLD = "1"
 
-HDDDIR = "${S}/hdd/boot"
-ISODIR = "${S}/cd"
+HDDDIR = "${S}/hddimg"
+ISODIR = "${S}/iso"
 
 BOOTIMG_VOLUME_ID   ?= "boot"
 BOOTIMG_EXTRA_SPACE ?= "512"
@@ -58,6 +58,22 @@ PCBIOS_CLASS = ${@pcbios_class(d)}
 inherit ${PCBIOS_CLASS}
 inherit ${EFI_CLASS}
 
+populate() {
+       DEST=$1
+       install -d ${DEST}
+
+       # Install bzImage, initrd, and rootfs.img in DEST for all loaders to use.
+       install -m 0644 ${STAGING_DIR_HOST}/kernel/bzImage ${DEST}/vmlinuz
+
+       if [ -n "${INITRD}" ] && [ -s "${INITRD}" ]; then
+               install -m 0644 ${INITRD} ${DEST}/initrd
+       fi
+
+       if [ -n "${ROOTFS}" ] && [ -s "${ROOTFS}" ]; then
+               install -m 0644 ${ROOTFS} ${DEST}/rootfs.img
+       fi
+
+}
 
 build_iso() {
        # Only create an ISO if we have an INITRD and NOISO was not set
@@ -66,7 +82,7 @@ build_iso() {
                return
        fi
 
-       install -d ${ISODIR}
+       populate ${ISODIR}
 
        if [ "${PCBIOS}" = "1" ]; then
                syslinux_iso_populate
@@ -95,7 +111,8 @@ build_iso() {
 build_hddimg() {
        # Create an HDD image
        if [ "${NOHDD}" != "1" ] ; then
-               install -d ${HDDDIR}
+               populate ${HDDDIR}
+
                if [ "${PCBIOS}" = "1" ]; then
                        syslinux_hddimg_populate
                fi
index 762322b28ecf565497f52d49142e833695323fa9..1efb43b805d9e320c2246b9471297eee06fdfff4 100644 (file)
@@ -22,39 +22,29 @@ GRUB_TIMEOUT ?= "10"
 GRUB_OPTS ?= "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"
 
 EFIDIR = "/EFI/BOOT"
-GRUB_HDDDIR = "${HDDDIR}${EFIDIR}"
-GRUB_ISODIR = "${ISODIR}${EFIDIR}"
 
 grubefi_populate() {
+       # DEST must be the root of the image so that EFIDIR is not
+       # nested under a top level directory.
        DEST=$1
 
-       install -d ${DEST}
-
-       install -m 0644 ${STAGING_DIR_HOST}/kernel/bzImage ${DEST}/vmlinuz
-
-       if [ -n "${INITRD}" ] && [ -s "${INITRD}" ]; then 
-               install -m 0644 ${INITRD} ${DEST}/initrd
-       fi
-
-       if [ -n "${ROOTFS}" ] && [ -s "${ROOTFS}" ]; then 
-               install -m 0644 ${ROOTFS} ${DEST}/rootfs.img
-       fi
+       install -d ${DEST}${EFIDIR}
 
        GRUB_IMAGE="bootia32.efi"
        if [ "${TARGET_ARCH}" = "x86_64" ]; then
                GRUB_IMAGE="bootx64.efi"
        fi
-       install -m 0644 ${DEPLOY_DIR_IMAGE}/${GRUB_IMAGE} ${DEST}
+       install -m 0644 ${DEPLOY_DIR_IMAGE}/${GRUB_IMAGE} ${DEST}${EFIDIR}
 
-       install -m 0644 ${GRUBCFG} ${DEST}
+       install -m 0644 ${GRUBCFG} ${DEST}${EFIDIR}
 }
 
 grubefi_iso_populate() {
-       grubefi_populate ${GRUB_ISODIR}
+       grubefi_populate ${ISODIR}
 }
 
 grubefi_hddimg_populate() {
-       grubefi_populate ${GRUB_HDDDIR}
+       grubefi_populate ${HDDDIR}
 }
 
 python build_grub_cfg() {
@@ -109,7 +99,7 @@ python build_grub_cfg() {
         bb.data.update_data(localdata)
 
         cfgfile.write('\nmenuentry \'%s\'{\n' % (label))
-        cfgfile.write('linux ${EFIDIR}/vmlinuz LABEL=%s' % (label))
+        cfgfile.write('linux /vmlinuz LABEL=%s' % (label))
 
         append = localdata.getVar('APPEND', True)
         initrd = localdata.getVar('INITRD', True)
@@ -119,7 +109,7 @@ python build_grub_cfg() {
         cfgfile.write('\n')
    
         if initrd:
-            cfgfile.write('initrd ${EFIDIR}/initrd')
+            cfgfile.write('initrd /initrd')
         cfgfile.write('\n}\n')
 
     cfgfile.close()
index 91c4275747dfc4ede63094940d2c6c3107bba264..1569074b21135971b85a1be51882d52a0f431d95 100644 (file)
@@ -18,42 +18,34 @@ do_bootimg[depends] += "syslinux:do_populate_sysroot \
 SYSLINUXCFG  = "${S}/syslinux.cfg"
 SYSLINUXMENU = "${S}/menu"
 
-SYSLINUX_ISODIR = "${ISODIR}/isolinux"
-SYSLINUX_HDDDIR = "${HDDDIR}"
+ISOLINUXDIR = "/isolinux"
+SYSLINUXDIR = "/"
 ISO_BOOTIMG = "isolinux/isolinux.bin"
 ISO_BOOTCAT = "isolinux/boot.cat"
 MKISOFS_OPTIONS = "-no-emul-boot -boot-load-size 4 -boot-info-table"
 
 syslinux_populate() {
        DEST=$1
-       CFGNAME=$2
+       BOOTDIR=$2
+       CFGNAME=$3
 
-       install -d ${DEST}
-
-       # Install the kernel, initrd, and rootfs
-       install -m 0644 ${STAGING_DIR_HOST}/kernel/bzImage ${DEST}/vmlinuz
-       if [ -n "${INITRD}" ] && [ -s "${INITRD}" ]; then
-               install -m 0644 ${INITRD} ${DEST}/initrd
-       fi
-       if [ -n "${ROOTFS}" ] && [ -s "${ROOTFS}" ]; then
-               install -m 0644 ${ROOTFS} ${DEST}/rootfs.img
-       fi
+       install -d ${DEST}${BOOTDIR}
 
        # Install the config files
-       install -m 0644 ${SYSLINUXCFG} ${DEST}/${CFGNAME}
+       install -m 0644 ${SYSLINUXCFG} ${DEST}${BOOTDIR}/${CFGNAME}
        if [ -f ${SYSLINUXMENU} ]; then
-               install -m 0644 ${SYSLINUXMENU} ${DEST}
+               install -m 0644 ${SYSLINUXMENU} ${DEST}${BOOTDIR}
        fi
 }
 
 syslinux_iso_populate() {
-       syslinux_populate ${SYSLINUX_ISODIR} isolinux.cfg
-       install -m 0644 ${STAGING_LIBDIR}/syslinux/isolinux.bin ${SYSLINUX_ISODIR}
+       syslinux_populate ${ISODIR} ${ISOLINUXDIR} isolinux.cfg
+       install -m 0644 ${STAGING_LIBDIR}/syslinux/isolinux.bin ${ISODIR}${ISOLINUXDIR}
 }
 
 syslinux_hddimg_populate() {
-       syslinux_populate ${SYSLINUX_HDDDIR} syslinux.cfg
-       install -m 0444 ${STAGING_LIBDIR}/syslinux/ldlinux.sys ${SYSLINUX_HDDDIR}/ldlinux.sys
+       syslinux_populate ${HDDDIR} ${SYSLINUXDIR} syslinux.cfg
+       install -m 0444 ${STAGING_LIBDIR}/syslinux/ldlinux.sys ${HDDDIR}${SYSLINUXDIR}/ldlinux.sys
 }
 
 syslinux_hddimg_install() {
@@ -187,7 +179,7 @@ python build_syslinux_cfg () {
                localdata.setVar('OVERRIDES', label + ':' + overrides)
                bb.data.update_data(localdata)
        
-               cfgfile.write('LABEL %s\nKERNEL vmlinuz\n' % (label))
+               cfgfile.write('LABEL %s\nKERNEL /vmlinuz\n' % (label))
 
                append = localdata.getVar('APPEND', 1)
                initrd = localdata.getVar('INITRD', 1)
@@ -196,7 +188,7 @@ python build_syslinux_cfg () {
                        cfgfile.write('APPEND ')
 
                        if initrd:
-                               cfgfile.write('initrd=initrd ')
+                               cfgfile.write('initrd=/initrd ')
 
                        cfgfile.write('LABEL=%s '% (label))