EFI: Make installer EFI aware
v2 cover EFI: Make installer EFI aware
V2: Add missing initramfs-live-install-efi_1.0.bb file.
The following changes since commit 2bd0aaf98c5d586638d82f5f22c1c24122a889a3:
toolchain-scripts: Sync the SDK/ADT values to the build system (2012-07-17 18:02:10 +0100)
are available in the git repository at:
git://git.yoctoproject.org/user-contrib/dvhart/oe-core installer
http://git.yoctoproject.org/cgit.cgi/user-contrib/dvhart/oe-core/log/?h=installer
Darren Hart (1):
EFI: Make installer EFI aware
meta/classes/grub-efi.bbclass | 2 + .../images/core-image-minimal-initramfs.bb | 2 +- .../initrdscripts/files/init-install-efi.sh | 188 ++++++++++++++++++++ meta/recipes-core/initrdscripts/files/init-live.sh | 6 +- .../initramfs-live-install-efi_1.0.bb | 22 +++ 5 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 meta/recipes-core/initrdscripts/files/init-install-efi.sh create mode 100644 meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb
Signature · 1 line
1.7.5.4
PATCH v2 1/1 EFI: Make installer EFI aware
[YOCTO #1919]
Create a basic EFI installer script modeled after the existing installer and add it to a new initramfs-live-install-efi recipe. Update the init-live.sh script to distinguish between LABEL=install and LABEL=install-efi and select the appropriate script. Add the efi installer to core-image-minimal-initramfs.
Update grub-efi.bbclass to use "LABEL=install-efi" when it detects a label of "install". This is clearly not ideal, but a proper fix would involve decoupling the LABELS assignment from the image-live.bbclass usage of SYSLINUX_LABELS. We should be able to address that in a follow-on clean-up series.
--- meta/classes/grub-efi.bbclass | 2 + .../images/core-image-minimal-initramfs.bb | 2 +- .../initrdscripts/files/init-install-efi.sh | 188 ++++++++++++++++++++ meta/recipes-core/initrdscripts/files/init-live.sh | 6 +- .../initramfs-live-install-efi_1.0.bb | 22 +++ 5 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 meta/recipes-core/initrdscripts/files/init-install-efi.sh create mode 100644 meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb
meta/classes/grub-efi.bbclass +2 -0
@@ -99,6 +99,8 @@ python build_grub_cfg() { bb.data.update_data(localdata) cfgfile.write('\nmenuentry \'%s\'{\n' % (label)) + if label == "install": + label = "install-efi" cfgfile.write('linux /vmlinuz LABEL=%s' % (label)) append = localdata.getVar('APPEND', True)
meta/recipes-core/images/core-image-minimal-initramfs.bb +1 -1
@@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. The kernel includes \ the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \ first “init” program more efficiently." -IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install busybox udev base-passwd" +IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi busybox udev base-passwd" # Do not pollute the initrd image with rootfs features IMAGE_FEATURES = ""
meta/recipes-core/initrdscripts/files/init-install-efi.sh new file +188 -0
188 lines not on this page · raw message
meta/recipes-core/initrdscripts/files/init-live.sh +3 -3
@@ -110,11 +110,11 @@ case $label in fi fi ;; - install) + install|install-efi) if [ -f /media/$i/$ISOLINUX/$ROOT_IMAGE ] ; then - ./install.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode + ./$label.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode else - fatal "Could not find install script" + fatal "Could not find $label script" fi # If we're getting here, we failed...
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +22 -0
@@ -0,0 +1,22 @@ +DESCRIPTION = "A live image init script for grub-efi" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +SRC_URI = "file://init-install-efi.sh" + +PR = "r7" + +RDEPENDS_${PN} = "parted e2fsprogs-mke2fs dosfstools" + +do_install() { + install -m 0755 ${WORKDIR}/init-install-efi.sh ${D}/install-efi.sh +} + +# While this package maybe an allarch due to it being a +# simple script, reality is that it is Host specific based +# on the COMPATIBLE_HOST below, which needs to take precedence +#inherit allarch +INHIBIT_DEFAULT_DEPS = "1" + +FILES_${PN} = " /install-efi.sh " + +COMPATIBLE_HOST = "(i.86|x86_64).*-linux"
Signature · 1 line
1.7.5.4
Quoted 43 lines · Darren Hart
[YOCTO #1919]
Create a basic EFI installer script modeled after the existing installer and add it to a new initramfs-live-install-efi recipe. Update the
init-live.shscript to distinguish between LABEL=install and LABEL=install-efi and select the appropriate script. Add the efi installer to core-image-minimal-initramfs.Update grub-efi.bbclass to use "LABEL=install-efi" when it detects a label of "install". This is clearly not ideal, but a proper fix would involve decoupling the LABELS assignment from the image-live.bbclass usage of
SYSLINUX_LABELS. We should be able to address that in a follow-on clean-up series.Signed-off-by Darren Hart <[email protected]>--- meta/classes/grub-efi.bbclass | 2 + .../images/core-image-minimal-initramfs.bb | 2 +- .../initrdscripts/files/init-install-efi.sh | 188 ++++++++++++++++++++ meta/recipes-core/initrdscripts/files/init-live.sh | 6 +- .../initramfs-live-install-efi_1.0.bb | 22 +++ 5 files changed, 216 insertions(+), 4 deletions(-)create mode 100644
meta/recipes-core/initrdscripts/files/init-install-efi.shcreate mode 100644 meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bbmeta/classes/grub-efi.bbclass +2
-0@@ -99,6 +99,8 @@ python build_grub_cfg() { bb.data.update_data(localdata) cfgfile.write('\nmenuentry \'%s\'{\n' % (label)) + if label == "install": + label = "install-efi" cfgfile.write('linux /vmlinuz LABEL=%s' % (label)) append = localdata.getVar('APPEND', True)meta/recipes-core/images/core-image-minimal-initramfs.bb +0
-0
meta/recipes-core/images/core-image-minimal-initramfs.bb DESCRIPTION = "Small image capable of booting a device. The kernel includes \ · line 9
Quoted 8 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb +1
-1@@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. The kernel includes \ the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \ first “init” program more efficiently." -IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install busybox udev base-passwd" +IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi busybox udev base-passwd" # Do not pollute the initrd image with rootfs features IMAGE_FEATURES = ""
Does this now need a PR bump also?
Quoted 219 lines
meta/recipes-core/initrdscripts/files/init-install-efi.sh new file +188
-0@@ -0,0 +1,188 @@ +#!/bin/sh -e +# +# Copyright (c) 2012, Intel Corporation. +# All rights reserved. +# +# install.sh [device_name] [rootfs_name] [video_mode] [vga_mode] +# + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +# We need 20 Mb for the boot partition +boot_size=20 + +# 5% for the swap +swap_ratio=5 + +found="no" + +echo "Searching for a hard drive..." +for device in 'hda' 'hdb' 'sda' 'sdb' 'mmcblk0' 'mmcblk1' +do + if [ -e /sys/block/${device}/removable ]; then + if [ "$(cat /sys/block/${device}/removable)" = "0" ]; then + found="yes" + + while true; do + # Try sleeping here to avoid getting kernel messages + # obscuring/confusing user + sleep 5 + echo "Found drive at /dev/${device}. Do you want to install this image there ? [y/n]" + read answer + if [ "$answer" = "y" ] ; then + break + fi + + if [ "$answer" = "n" ] ; then + found=no + break + fi + + echo "Please answer y or n" + done + fi + fi + + if [ "$found" = "yes" ]; then + break; + fi + +done + +if [ "$found" = "no" ]; then + exit 1 +fi + +echo "Installing image on /dev/${device}" + +# +# The udev automounter can cause pain here, kill it +# +rm -f /etc/udev/scripts/mount* + +# +# Unmount anything the automounter had mounted +# +umount /dev/${device}* 2> /dev/null || /bin/true + +# We always build with devtmpfs, this is not necessary +#if [ ! -b /dev/sda ] ; then +# mknod /dev/sda b 8 0 +#fi +# +#if [ ! -b /dev/sdb ] ; then +# mknod /dev/sdb b 8 16 +#fi +# +#if [ ! -b /dev/loop0 ] ; then +# mknod /dev/loop0 b 7 0 +#fi + +mkdir -p /tmp +cat /proc/mounts > /etc/mtab + +disk_size=$(parted /dev/${device} unit mb print | grep Disk | cut -d" " -f 3 | sed -e "s/MB//") + +swap_size=$((disk_size*swap_ratio/100)) +rootfs_size=$((disk_size-boot_size-swap_size)) + +rootfs_start=$((boot_size)) +rootfs_end=$((rootfs_start+rootfs_size)) +swap_start=$((rootfs_end)) + +# MMC devices are special in a couple of ways +# 1) they use a partition prefix character 'p' +# 2) they are detected asynchronously (need rootwait) +rootwait="" +part_prefix="" +if [ ! "${device#mmcblk}" = "${device}" ]; then + part_prefix="p" + rootwait="rootwait" +fi +bootfs=/dev/${device}${part_prefix}1 +rootfs=/dev/${device}${part_prefix}2 +swap=/dev/${device}${part_prefix}3 + +echo "*****************" +echo "Boot partition size: $boot_size MB ($bootfs)" +echo "Rootfs partition size: $rootfs_size MB ($rootfs)" +echo "Swap partition size: $swap_size MB ($swap)" +echo "*****************" +echo "Deleting partition table on /dev/${device} ..." +dd if=/dev/zero of=/dev/${device} bs=512 count=2 + +echo "Creating new partition table on /dev/${device} ..." +parted /dev/${device} mklabel gpt + +echo "Creating boot partition on $bootfs" +parted /dev/${device} mkpart primary 0% $boot_size + +echo "Creating rootfs partition on $rootfs" +parted /dev/${device} mkpart primary $rootfs_start $rootfs_end + +echo "Creating swap partition on $swap" +parted /dev/${device} mkpart primary $swap_start 100% + +parted /dev/${device} print + +echo "Formatting $bootfs to vfat..." +mkfs.vfat $bootfs + +echo "Formatting $rootfs to ext3..." +mkfs.ext3 $rootfs + +echo "Formatting swap partition...($swap)" +mkswap $swap + +mkdir /ssd +mkdir /rootmnt +mkdir /bootmnt + +mount $rootfs /ssd +mount -o rw,loop,noatime,nodiratime /media/$1/$2 /rootmnt + +echo "Copying rootfs files..." +cp -a /rootmnt/* /ssd + +if [ -d /ssd/etc/ ] ; then + echo "$swap swap swap defaults 0 0" >> /ssd/etc/fstab + + # We dont want udev to mount our root device while we're booting... + if [ -d /ssd/etc/udev/ ] ; then + echo "/dev/${device}" >> /ssd/etc/udev/mount.blacklist + fi +fi + +umount /ssd +umount /rootmnt + +echo "Preparing boot partition..." +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 +# Replace the ramdisk root with the install device and include other options +sed -i "s@ root=[^ ]*@ root=$rootfs rw $rootwait quiet@" $GRUBCFG + +umount /ssd +sync + +echo "Remove your installation media, and press ENTER" + +read enter + +echo "Rebooting..." +reboot -fmeta/recipes-core/initrdscripts/files/init-live.sh +3
-3@@ -110,11 +110,11 @@ case $label in fi fi ;; - install) + install|install-efi) if [ -f /media/$i/$ISOLINUX/$ROOT_IMAGE ] ; then - ./install.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode + ./$label.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode else - fatal "Could not find install script" + fatal "Could not find $label script" fi # If we're getting here, we failed...meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +0
-0
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb line 7
Quoted 7 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +7
-0@@ -0,0 +1,22 @@ +DESCRIPTION = "A live image init script for grub-efi" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +SRC_URI = "file://init-install-efi.sh" + +PR = "r7" +
Why PR = r7 for a new recipe, there should be no PR as it defaults to r0?
Sau!
Quoted 16 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +15
-0+RDEPENDS_${PN} = "parted e2fsprogs-mke2fs dosfstools" + +do_install() { + install -m 0755 ${WORKDIR}/init-install-efi.sh ${D}/install-efi.sh +} + +# While this package maybe an allarch due to it being a +# simple script, reality is that it is Host specific based +# on the COMPATIBLE_HOST below, which needs to take precedence +#inherit allarch +INHIBIT_DEFAULT_DEPS = "1" + +FILES_${PN} = " /install-efi.sh " + +COMPATIBLE_HOST = "(i.86|x86_64).*-linux"
Quoted 8 lines · Saul Wold
Quoted 6 lines · Darren Hart
meta/recipes-core/images/core-image-minimal-initramfs.bb +0
-0@@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. The kernel includes \ the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \ first “init” program more efficiently."
Quoted 7 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb DESCRIPTION = "Small image capable of booting a device. The kernel includes \ · line 9
Quoted 5 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb +1
-1-IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install busybox udev base-passwd" +IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi busybox udev base-passwd" # Do not pollute the initrd image with rootfs features IMAGE_FEATURES = ""Does this now need a PR bump also?
I didn't think so as this recipe is rebuilt for every image anyway. There is no PR in this recipe.
Quoted 6 lines
Quoted 6 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +0
-0@@ -0,0 +1,22 @@
Quoted 8 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb line 7
Quoted 7 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +7
-0+DESCRIPTION = "A live image init script for grub-efi" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +SRC_URI = "file://init-install-efi.sh" + +PR = "r7" +Why PR = r7 for a new recipe, there should be no PR as it defaults to r0?
Good catch, just my forcing rebuilds during development, or perhaps a left-over copy from the initramfs-live-install_1.0.bb I based it on. Updated as r0 in the branch.
Thanks,
Signature · 3 lines
Darren Hart Intel Open Source Technology Center Yocto Project - Linux Kernel
Quoted 36 lines · Darren Hart
Quoted 8 lines · Saul Wold
Quoted 6 lines · Darren Hart
meta/recipes-core/images/core-image-minimal-initramfs.bb +0
-0@@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. The kernel includes \ the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \ first “init” program more efficiently."Quoted 7 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb DESCRIPTION = "Small image capable of booting a device. The kernel includes \ · line 9
Quoted 5 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb +1
-1-IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install busybox udev base-passwd" +IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi busybox udev base-passwd" # Do not pollute the initrd image with rootfs features IMAGE_FEATURES = ""Does this now need a PR bump also?
I didn't think so as this recipe is rebuilt for every image anyway. There is no PR in this recipe.
Quoted 6 lines
Quoted 6 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +0
-0@@ -0,0 +1,22 @@Quoted 8 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb line 7
Quoted 7 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +7
-0+DESCRIPTION = "A live image init script for grub-efi" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +SRC_URI = "file://init-install-efi.sh" + +PR = "r7" +Why PR = r7 for a new recipe, there should be no PR as it defaults to r0?
Quoted 3 lines
Good catch, just my forcing rebuilds during development, or perhaps a left-over copy from the initramfs-live-install_1.0.bb I based it on. Updated as r0 in the branch.
Could I ask you to update this on top of Radu's fix please?
Cheers,
Richard
Quoted 37 lines · Richard Purdie
Quoted 36 lines · Darren Hart
Quoted 8 lines · Saul Wold
Quoted 6 lines · Darren Hart
meta/recipes-core/images/core-image-minimal-initramfs.bb +0
-0@@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. The kernel includes \ the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \ first “init” program more efficiently."Quoted 7 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb DESCRIPTION = "Small image capable of booting a device. The kernel includes \ · line 9
Quoted 5 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb +1
-1-IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install busybox udev base-passwd" +IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi busybox udev base-passwd" # Do not pollute the initrd image with rootfs features IMAGE_FEATURES = ""Does this now need a PR bump also?
I didn't think so as this recipe is rebuilt for every image anyway. There is no PR in this recipe.
Quoted 14 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb line 7
Quoted 13 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +7
-0@@ -0,0 +1,22 @@ +DESCRIPTION = "A live image init script for grub-efi" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +SRC_URI = "file://init-install-efi.sh" + +PR = "r7" +Why PR = r7 for a new recipe, there should be no PR as it defaults to r0?
Quoted 5 lines
Quoted 3 lines
Good catch, just my forcing rebuilds during development, or perhaps a left-over copy from the initramfs-live-install_1.0.bb I based it on. Updated as r0 in the branch.
Could I ask you to update this on top of Radu's fix please?
Will do.
Signature · 3 lines
Darren Hart Intel Open Source Technology Center Yocto Project - Linux Kernel
Quoted 39 lines · Darren Hart
Quoted 37 lines · Richard Purdie
Quoted 36 lines · Darren Hart
Quoted 8 lines · Saul Wold
Quoted 6 lines · Darren Hart
meta/recipes-core/images/core-image-minimal-initramfs.bb +0
-0@@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. The kernel includes \ the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \ first “init” program more efficiently."Quoted 7 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb DESCRIPTION = "Small image capable of booting a device. The kernel includes \ · line 9
Quoted 5 lines
meta/recipes-core/images/core-image-minimal-initramfs.bb +1
-1-IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install busybox udev base-passwd" +IMAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi busybox udev base-passwd" # Do not pollute the initrd image with rootfs features IMAGE_FEATURES = ""Does this now need a PR bump also?
I didn't think so as this recipe is rebuilt for every image anyway. There is no PR in this recipe.
Quoted 14 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb line 7
Quoted 13 lines
meta/recipes-core/initrdscripts/initramfs-live-install-efi_1.0.bb new file +7
-0@@ -0,0 +1,22 @@ +DESCRIPTION = "A live image init script for grub-efi" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +SRC_URI = "file://init-install-efi.sh" + +PR = "r7" +Why PR = r7 for a new recipe, there should be no PR as it defaults to r0?
Quoted 7 lines
Quoted 5 lines
Quoted 3 lines
Good catch, just my forcing rebuilds during development, or perhaps a left-over copy from the initramfs-live-install_1.0.bb I based it on. Updated as r0 in the branch.
Could I ask you to update this on top of Radu's fix please?
Will do.
Thanks, merged to master.
Richard