# Alpine VM Image Builder # ------------------------ # Builds a bootable Alpine Linux disk image for Cloud Hypervisor direct boot. # # Usage: # make build — generate GPG key + build qcow2 image # make build-raw — build raw image (for Cloud Hypervisor direct boot) # make extract-kernel — extract kernel + initramfs from image # make clean — remove build artifacts # # Configurable variables (override on command line): # IMAGE_SIZE Size of the disk image (default: 4G) # ALPINE_BRANCH Alpine release branch (default: latest-stable) # KERNEL_FLAVOR Kernel variant (default: virt) # ALPINE_MIRROR APK mirror (default: http://dl-cdn.alpinelinux.org/alpine) SHELL := /bin/sh # --- configurable ---------------------------------------------------- IMAGE_NAME = alpine-vm IMAGE_SIZE ?= 4G IMAGE_FORMAT = raw ALPINE_BRANCH ?= latest-stable KERNEL_FLAVOR ?= virt #INITFS_FEATURES ?= kms scsi virtio IMAGE_FILE = vm.$(IMAGE_FORMAT) SCRIPT_DIR = $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) OVERLAY_DIR = $(SCRIPT_DIR)/overlay CONFIGURE_SH = $(SCRIPT_DIR)/configure.sh build: @echo ">>> Building $(IMAGE_FILE) ..." @test -f $(OVERLAY_DIR)/root/gpg-key.asc || { \ echo "ERROR: GPG key not found. Generate key first" >&2; \ exit 1; \ } $(MAKE_VM_IMAGE) \ --branch $(ALPINE_BRANCH) \ --image-format $(IMAGE_FORMAT) \ --image-size $(IMAGE_SIZE) \ --kernel-flavor $(KERNEL_FLAVOR) \ --serial-console \ --fs-skel-dir $(OVERLAY_DIR) \ --fs-skel-chown root:root \ --script-chroot \ --packages "python3 py3-yaml py3-pydantic git curl gnupg docker docker-cli-buildx docker-cli-compose" \ $(IMAGE_FILE) \ $(CONFIGURE_SH) @echo ">>> Image built: $(IMAGE_FILE)" @ls -lh $(IMAGE_FILE) # Raw image (best for Cloud Hypervisor) build-raw: $(MAKE) build IMAGE_FORMAT=raw # --- kernel extraction ----------------------------------------------- extract-kernel: $(IMAGE_FILE) @echo ">>> Extracting kernel and initramfs from $(IMAGE_FILE) ..." @which guestmount >/dev/null 2>&1 || { \ echo "ERROR: guestmount (libguestfs) required. Install: apk add libguestfs" >&2; \ exit 1; \ } @mkdir -p $(IMAGE_NAME)-boot guestmount -a $(IMAGE_FILE) -m /dev/sda --ro $(IMAGE_NAME)-boot cp $(IMAGE_NAME)-boot/boot/vmlinuz-$(KERNEL_FLAVOR) vmlinuz cp $(IMAGE_NAME)-boot/boot/initramfs-$(KERNEL_FLAVOR) initramfs guestunmount $(IMAGE_NAME)-boot rmdir $(IMAGE_NAME)-boot .PHONY: build build-raw build-no-gpg extract-kernel gpg-key gpg-fingerprint