]> git.plutz.net Git - blast/commitdiff
target for UEFI hard disk images
authorPaul Hänsch <paul@plutz.net>
Mon, 20 Apr 2026 04:35:39 +0000 (06:35 +0200)
committerPaul Hänsch <paul@plutz.net>
Mon, 20 Apr 2026 04:35:39 +0000 (06:35 +0200)
targets/hddimage.mk [new file with mode: 0644]

diff --git a/targets/hddimage.mk b/targets/hddimage.mk
new file mode 100644 (file)
index 0000000..c57d106
--- /dev/null
@@ -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}"