From a791710776bd21fc2bc64d647ee2af61e23c4585 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Mon, 20 Apr 2026 06:35:39 +0200 Subject: [PATCH] target for UEFI hard disk images --- targets/hddimage.mk | 152 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 targets/hddimage.mk diff --git a/targets/hddimage.mk b/targets/hddimage.mk new file mode 100644 index 0000000..c57d106 --- /dev/null +++ b/targets/hddimage.mk @@ -0,0 +1,152 @@ +fstype := ext4 + +# Partition Table (1M) + Boot Partition Root Partition + Slack Space (1M) +imagesize ?= 4096 +BOOT_MB := 127 +ROOT_MB := $(shell printf '%i\n' "$$(( ${imagesize} - ${BOOT_MB} - 2 ))") + +define PARTLAYOUT := +label: gpt +: start=1MiB, size=${BOOT_MB}MiB, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, attrs="LegacyBIOSBootable" +: size=${ROOT_MB}MiB, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 +endef + +define FSTAB := +LABEL=FSROOT / ${fstype} auto,nofail,rw 0 0 +LABEL=SYSTEM /boot/efi vfat auto,nofail,ro 0 0 +endef + +define GRUBCFG := +insmod normal +insmod linux +insmod all_video +set timeout=3 +default=${release} + +menuentry 'Debian ${release}' --id '${release}' { + linux '/vmlinuz' root=LABEL=FSROOT + initrd '/initrd.img' +} +endef + +define GRUBINIT := +search --no-floppy --label FSROOT --set root +set prefix=/boot/grub +configfile grub.cfg +endef + +VOLUME = ${image} +PBOOT = part_boot.img.temp +PROOT = part_root.img.temp +CFGROOT := img_mount + +PACKAGES += grub-efi-amd64 grub-efi-ia32-bin + +_sparse: ${PBOOT} ${PROOT} +_format: _sparse +_partition_gpt: _sparse +_partcopy: _format +_img_mount: _partcopy _partition_gpt +_copy: _img_mount +_bootloader_efi: _config +_umount: _config _bootloader_efi +_target: _umount +_clean: _hddimage_clean + +export VOLUME PBOOT PROOT PARTLAYOUT GRUBCFG GRUBINIT + +img_mount: + mkdir -p -m 755 "$@" + chmod 755 "$@" + +${VOLUME}: .FORCE + dd count=0 of="$${VOLUME}" # truncate + dd bs=1M count=0 seek=$$((2 + ${BOOT_MB} + ${ROOT_MB})) \ + of="$${VOLUME}" + chmod g+w "$${VOLUME}" + +${PBOOT}: .FORCE + dd count=0 of="$${PBOOT}" # truncate + dd bs=1M count=0 seek=${BOOT_MB} of="$${PBOOT}" + +${PROOT}: .FORCE + dd count=0 of="$${PROOT}" # truncate + dd bs=1M count=0 seek=${ROOT_MB} of="$${PROOT}" + +_partition_gpt: ${VOLUME} + printf '%s\n' "$${PARTLAYOUT}" | sfdisk "$${VOLUME}" + +_format_root: ${PROOT} + mkfs.${fstype} -L FSROOT "$${PROOT}" + +_format_boot: ${PBOOT} + mkfs.fat -F 32 -n SYSTEM "$${PBOOT}" + +_format: _format_root _format_boot + +_grub_mbr: ${VOLUME} + grub-mkimage -p / -O i386-pc ${fstype} \ + part_gpt normal linux all_video \ + | dd conv=notrunc of="$${VOLUME}" + +${CFGROOT}/boot/efi/EFI/BOOT/BOOTIA32.EFI: _mount_boot + mkdir -p "$(@D)" + printf '%s\n' "$${GRUBINIT}" >"${@F}.temp" + grub-mkimage -p / -O i386-efi -o "$@" \ + ext2 fat part_gpt configfile search_label search \ + -c "${@F}.temp" + rm -- "${@F}.temp" + +${CFGROOT}/boot/efi/EFI/BOOT/BOOTX64.EFI: _mount_boot + mkdir -p "$(@D)" + printf '%s\n' "$${GRUBINIT}" >"${@F}.temp" + grub-mkimage -p / -O x86_64-efi -o "$@" \ + ext2 fat part_gpt configfile search_label search \ + -c "${@F}.temp" + rm -- "${@F}.temp" + +${CFGROOT}/boot/grub/grub.cfg: _copy + mkdir -p "$(@D)" + cp -a "$${CFGROOT}"/usr/lib/grub/x86_64-efi/. "$(@D)/x86_64-efi" + -cp -a "$${CFGROOT}"/usr/lib/grub/i386-efi/. "$(@D)/i386-efi" + printf '%s\n' "$${GRUBCFG}" >"$@" + +_bootloader_efi: ${CFGROOT}/boot/efi/EFI/BOOT/BOOTIA32.EFI +_bootloader_efi: ${CFGROOT}/boot/efi/EFI/BOOT/BOOTX64.EFI +_bootloader_efi: ${CFGROOT}/boot/grub/grub.cfg + +_partcopy: ${VOLUME} ${PROOT} ${PBOOT} + dd conv=notrunc,sparse bs=1M seek=1 \ + if="$${PBOOT}" of="$${VOLUME}" + dd conv=notrunc,sparse bs=1M seek=$$((1 + ${BOOT_MB})) \ + if="$${PROOT}" of="$${VOLUME}" + rm -- "$${PBOOT}" "$${PROOT}" + +_mount_root: ${CFGROOT} + mountpoint "$${CFGROOT}" \ + || mount \ + -o rw,loop,offset="$$((${BOOT_MB} + 1))"M,sizelimit=${ROOT_MB}M \ + -t ${fstype} "$${VOLUME}" "$${CFGROOT}" + chmod 755 "$${CFGROOT}" + +_mount_boot: _mount_root + mkdir -p -m 755 "$${CFGROOT}/boot/efi" + mountpoint "$${CFGROOT}/boot/efi" \ + || mount -o loop,offset=1M,sizelimit=${BOOT_MB}M \ + -t vfat "$${VOLUME}" "$${CFGROOT}/boot/efi" + +_img_mount: _mount_boot _mount_root + +_umount_boot: _config + -umount "$${CFGROOT}/boot/efi" + +_umount_root: _umount_boot _config + -umount "$${CFGROOT}" + rmdir "$${CFGROOT}" + +_umount: _umount_boot _umount_root + +_hddimage_clean: _umount_boot _umount_root + -rm -- "$${PBOOT}" + -rm -- "$${PROOT}" + -rm -- "$${VOLUME}" -- 2.39.5