diff --git a/Makefile b/Makefile index e0e4a90f4f..7e43dd3824 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,9 @@ release: image: ./scripts/image mkimage +image-efi: + ./scripts/image mkimage efi + noobs: ./scripts/image noobs diff --git a/scripts/image b/scripts/image index a013a5236b..2c10669ab8 100755 --- a/scripts/image +++ b/scripts/image @@ -278,6 +278,9 @@ IMAGE_NAME="$DISTRONAME-$TARGET_VERSION" # create image files if requested if [ "$1" = "mkimage" -a -n "$BOOTLOADER" ]; then + if [ "$2" == "efi" ] ; then + UEFI=yes + fi # variables used in image script must be passed sudo env \ PATH="$PATH" \ @@ -289,6 +292,7 @@ IMAGE_NAME="$DISTRONAME-$TARGET_VERSION" RELEASE_DIR="$RELEASE_DIR" \ UUID_SYSTEM="$(uuidgen)" \ UUID_STORAGE="$(uuidgen)" \ + UEFI="$UEFI" \ $SCRIPTS/mkimage fi diff --git a/scripts/mkimage b/scripts/mkimage index c46430bed7..7bd405ecd3 100755 --- a/scripts/mkimage +++ b/scripts/mkimage @@ -49,6 +49,14 @@ trap cleanup SIGINT +# generate volume id for fat partition +if [ "$UEFI" = "yes" ] ; then + UUID_1=$(date '+%d%m') + UUID_2=$(date '+%M%S') + FAT_VOL_ID="${UUID_1}${UUID_2}" + UUID_SYSTEM="${UUID_1}-${UUID_2}" +fi + # ensure loopX not in use umount "$OE_TMP" &>/dev/null || : umount "$LOOP" &>/dev/null >/dev/null || : @@ -62,29 +70,46 @@ trap cleanup SIGINT # write a disklabel echo "image: creating partition table on $DISK..." losetup "$LOOP" "$DISK" - parted -s "$LOOP" mklabel msdos + if [ "$UEFI" = "yes" ] ; then + parted -s "$LOOP" mklabel gpt + else + parted -s "$LOOP" mklabel msdos + fi sync # create part1 echo "image: creating part1 on $DISK..." SYSTEM_PART_END=$(( $SYSTEM_SIZE * 1024 * 1024 / 512 + 2048 )) if [ "$BOOTLOADER" = "syslinux" ]; then - parted -s "$LOOP" -a min unit s mkpart primary ext4 2048 $SYSTEM_PART_END + if [ "$UEFI" = "yes" ] ; then + parted -s "$LOOP" -a min unit s mkpart primary fat32 2048 $SYSTEM_PART_END + else + parted -s "$LOOP" -a min unit s mkpart primary ext4 2048 $SYSTEM_PART_END + fi elif [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then parted -s "$LOOP" -a min unit s mkpart primary fat32 2048 $SYSTEM_PART_END fi - parted -s "$LOOP" set 1 boot on + if [ "$UEFI" = "yes" ] ; then + parted -s "$LOOP" set 1 legacy_boot on + else + parted -s "$LOOP" set 1 boot on + fi # create part2 echo "image: creating part2 on $DISK..." STORAGE_PART_START=$(( $SYSTEM_PART_END + 2048 )) - parted -s "$LOOP" -a min unit s mkpart primary ext4 $STORAGE_PART_START 100% + STORAGE_PART_END=$(( $STORAGE_PART_START + (( $STORAGE_SIZE * 1024 * 1024 / 512 )) )) + parted -s "$LOOP" -a min unit s mkpart primary ext4 $STORAGE_PART_START $STORAGE_PART_END sync if [ "$BOOTLOADER" = "syslinux" ]; then # write mbr echo "image: writing mbr..." - MBR="$ROOT/$TOOLCHAIN/share/syslinux/mbr.bin" + if [ "$UEFI" = "yes" ] ; then + MBR="$ROOT/$TOOLCHAIN/share/syslinux/gptmbr.bin" + else + MBR="$ROOT/$TOOLCHAIN/share/syslinux/mbr.bin" + fi if [ -n "$MBR" ]; then dd bs=440 count=1 conv=notrunc if="$MBR" of="$LOOP" fi @@ -98,9 +123,13 @@ fi SIZELIMIT=$(( $SYSTEM_SIZE * 1024 * 1024 )) losetup -o $OFFSET --sizelimit $SIZELIMIT "$LOOP" "$DISK" if [ "$BOOTLOADER" = "syslinux" ]; then - mke2fs -q -t ext4 -m 0 "$LOOP" - tune2fs -U $UUID_SYSTEM "$LOOP" - e2fsck -n "$LOOP" + if [ "$UEFI" = "yes" ] ; then + mkfs.vfat -i "$FAT_VOL_ID" "$LOOP" + else + mke2fs -q -t ext4 -m 0 "$LOOP" + tune2fs -U $UUID_SYSTEM "$LOOP" + e2fsck -n "$LOOP" + fi elif [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then mkfs.vfat "$LOOP" fi @@ -156,7 +185,11 @@ EOF # install extlinux echo "image: installing extlinux to part1..." - extlinux --heads=4 --sector=32 -i "$OE_TMP" + if [ "$UEFI" = "yes" ] ; then + syslinux --heads=4 --sector=32 -i "$LOOP" + else + extlinux --heads=4 --sector=32 -i "$OE_TMP" + fi # copy files echo "image: copying files to part1..." @@ -166,7 +199,26 @@ EOF cp $ROOT/$TOOLCHAIN/share/syslinux/vesamenu.c32 "$OE_TMP" cp $ROOT/$TOOLCHAIN/share/syslinux/libcom32.c32 "$OE_TMP" cp $ROOT/$TOOLCHAIN/share/syslinux/libutil.c32 "$OE_TMP" + if [ "$UEFI" = "yes" ] ; then + mkdir -p "$OE_TMP/EFI/BOOT" + cp $RELEASE_DIR/splash.png "$OE_TMP/EFI/BOOT" + cp $ROOT/$TOOLCHAIN/share/syslinux/vesamenu.c32 "$OE_TMP/EFI/BOOT" + cp $ROOT/$TOOLCHAIN/share/syslinux/libcom32.c32 "$OE_TMP/EFI/BOOT" + cp $ROOT/$TOOLCHAIN/share/syslinux/libutil.c32 "$OE_TMP/EFI/BOOT" + cp $ROOT/$TOOLCHAIN/share/syslinux/syslinux.efi "$OE_TMP/EFI/BOOT/bootx64.efi" + cp $ROOT/$TOOLCHAIN/share/syslinux/ldlinux.e64 "$OE_TMP/EFI/BOOT" + cat << EOF > "$OE_TMP"/EFI/BOOT/syslinux.cfg +DEFAULT live +LABEL installer + KERNEL /KERNEL + APPEND boot=UUID=$UUID_SYSTEM installer quiet tty vga=current + +LABEL live + KERNEL /KERNEL + APPEND boot=UUID=$UUID_SYSTEM disk=UUID=$UUID_STORAGE quiet vga=current +EOF + fi elif [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then # create bootloader configuration echo "image: creating bootloader configuration..." @@ -204,8 +256,10 @@ fi # bootloader mount "$LOOP" "$OE_TMP" # add resize mark - touch "$OE_TMP/.please_resize_me" - sync + if [ "$UEFI" != "yes" ] ; then + touch "$OE_TMP/.please_resize_me" + sync + fi # unmount part2 echo "image: unmounting part2..."