73 lines
2.5 KiB
Makefile
73 lines
2.5 KiB
Makefile
# 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
|