Files
linuxkit/tools/mkimage-iso-efi/make-efi
Ian Campbell f16ee76f57 tools: Calculate EFI ESP FAT FS size based on contents.
This requires switching to the dosfstools from alpine:edge since neither the
busybox nor alpine:3.5 dosfstools supports the -C option (in fact alpine:3.5
only has mkfs.fat and not mkfs.vfat).

The 511k slack seems like a lot to me, but 256k was somehow not enough.

Fixes #1304.

Signed-off-by: Ian Campbell <ian.campbell@docker.com>
2017-03-15 13:30:20 +00:00

73 lines
2.7 KiB
Bash
Executable File

#!/bin/sh
set -e
mkdir -p /tmp/efi
cd /tmp/efi
# input is a tarball of vmlinuz64 and initrd.img on stdin
# output is an iso on stdout
# extract. BSD tar auto recognises compression, unlike GNU tar
# only if stdin is a tty, if so need files volume mounted...
[ -t 0 ] || bsdtar xzf -
INITRD="$(find . -name '*.img')"
KERNEL="$(find . -name vmlinuz64 -or -name bzImage)"
CMDLINE="$*"
[ "$KERNEL" = "vmlinuz64" ] || mv "$KERNEL" vmlinuz64
[ "$INITRD" = "initrd.img" ] || mv "$INITRD" initrd.img
# clean up subdirectories
find . -mindepth 1 -maxdepth 1 -type d | xargs rm -rf
# Create a EFI boot file with kernel and initrd. From:
# https://github.com/haraldh/mkrescue-uefi/blob/master/mkrescue-uefi.sh
cp /usr/lib/gummiboot/linuxx64.efi.stub .
echo "${CMDLINE} rootdelay=300 noautodetect" > cmdline.txt
objcopy \
--add-section .osrel=/etc/os-release --change-section-vma .osrel=0x20000 \
--add-section .cmdline=./cmdline.txt --change-section-vma .cmdline=0x30000 \
--add-section .linux=./vmlinuz64 --change-section-vma .linux=0x40000 \
--add-section .initrd=initrd.img --change-section-vma .initrd=0x3000000 \
./linuxx64.efi.stub \
mobylinux.efi
# create a ISO with a EFI boot partition
mkdir -p iso
# Stuff it into a FAT filesystem, making it as small as possible. 511KiB
# headroom seems to be enough; (x+31)/32*32 rounds up to multiple of 32.
mkfs.vfat -v -C iso/efi.raw \
$(( ($(stat -c %s "mobylinux.efi") / 1024 + 511) \
/ 32 * 32 ))
echo "mtools_skip_check=1" >> /etc/mtools.conf && \
mmd -i iso/efi.raw ::/EFI
mmd -i iso/efi.raw ::/EFI/BOOT
mcopy -i iso/efi.raw mobylinux.efi ::/EFI/BOOT/BOOTX64.EFI
xorriso -as mkisofs \
-R -f -e efi.raw -no-emul-boot -o mobylinux-efi.iso iso
cat mobylinux-efi.iso
# How to build a VHDX. Commented out because we are currently not using it
# Don't delete: It took too long to figure out how to do this...
# # create a disk image (150MB)
# # This is a little odd, as we run this as part of the default command.
# # Can't run this during the build step as it requires privilege.
# # The Magic numbers in losetup are startsector (2048) times 512 and
# # (endsector - startsector) * 512
# CMD cd /tmp/efi && \
# dd if=/dev/zero of=disk.raw bs=1024 count=51200 && \
# sgdisk -N 1 -t 1:ef00 disk.raw && \
# losetup -o 1048576 --sizelimit 51362816 /dev/loop/1 disk.raw && \
# mkfs.vfat /dev/loop/1 && \
# echo "drive c: file=\"/dev/loop/1\" mtools_skip_check=1" > /etc/mtools.conf && \
# mmd c:/EFI && \
# mmd c:/EFI/BOOT && \
# mcopy mobylinux.efi c:/EFI/BOOT/BOOTX64.EFI && \
# losetup -d /dev/loop/1 && \
# qemu-img convert -O vhdx disk.raw mobylinux-boot.vhdx && \
# cp /tmp/efi/mobylinux.efi /tmp/efi/mobylinuxefi.iso /tmp/efi/mobylinux-boot.vhdx /mnt/