feat: initial Phase 1 PoC scaffolding for KubeSolo OS
Complete Phase 1 implementation of KubeSolo OS — an immutable, bootable Linux distribution built on Tiny Core Linux for running KubeSolo single-node Kubernetes. Build system: - Makefile with fetch, rootfs, initramfs, iso, disk-image targets - Dockerfile.builder for reproducible builds - Scripts to download Tiny Core, extract rootfs, inject KubeSolo, pack initramfs, and create bootable ISO/disk images Init system (10 POSIX sh stages): - Early mount (proc/sys/dev/cgroup2), cmdline parsing, persistent mount with bind-mounts, kernel module loading, sysctl, DHCP networking, hostname, clock sync, containerd prep, KubeSolo exec Shared libraries: - functions.sh (device wait, IP lookup, config helpers) - network.sh (static IP, config persistence, interface detection) - health.sh (containerd, API server, node readiness checks) - Emergency shell for boot failure debugging Testing: - QEMU boot test with serial log marker detection - K8s readiness test with kubectl verification - Persistence test (reboot + verify state survives) - Workload deployment test (nginx pod) - Local storage test (PVC + local-path provisioner) - Network policy test - Reusable run-vm.sh launcher Developer tools: - dev-vm.sh (interactive QEMU with port forwarding) - rebuild-initramfs.sh (fast iteration) - inject-ssh.sh (dropbear SSH for debugging) - extract-kernel-config.sh + kernel-audit.sh Documentation: - Full design document with architecture research - Boot flow documentation covering all 10 init stages - Cloud-init examples (DHCP, static IP, Portainer Edge, air-gapped) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
176
Makefile
Normal file
176
Makefile
Normal file
@@ -0,0 +1,176 @@
|
||||
.PHONY: all fetch rootfs initramfs iso disk-image \
|
||||
test-boot test-k8s test-persistence test-deploy test-storage test-all \
|
||||
dev-vm dev-vm-shell quick docker-build shellcheck \
|
||||
kernel-audit clean distclean help
|
||||
|
||||
SHELL := /bin/bash
|
||||
VERSION := $(shell cat VERSION)
|
||||
BUILD_DIR := build
|
||||
CACHE_DIR := $(BUILD_DIR)/cache
|
||||
OUTPUT_DIR := output
|
||||
ROOTFS_DIR := $(BUILD_DIR)/rootfs-work
|
||||
|
||||
# Load component versions
|
||||
include $(BUILD_DIR)/config/versions.env
|
||||
|
||||
# Default target
|
||||
all: iso
|
||||
|
||||
# =============================================================================
|
||||
# Download external components
|
||||
# =============================================================================
|
||||
fetch:
|
||||
@echo "==> Fetching components..."
|
||||
@mkdir -p $(CACHE_DIR)
|
||||
$(BUILD_DIR)/scripts/fetch-components.sh
|
||||
|
||||
# =============================================================================
|
||||
# Build stages
|
||||
# =============================================================================
|
||||
rootfs: fetch
|
||||
@echo "==> Preparing rootfs..."
|
||||
$(BUILD_DIR)/scripts/extract-core.sh
|
||||
$(BUILD_DIR)/scripts/inject-kubesolo.sh
|
||||
|
||||
initramfs: rootfs
|
||||
@echo "==> Packing initramfs..."
|
||||
$(BUILD_DIR)/scripts/pack-initramfs.sh
|
||||
|
||||
iso: initramfs
|
||||
@echo "==> Creating bootable ISO..."
|
||||
$(BUILD_DIR)/scripts/create-iso.sh
|
||||
@echo "==> Built: $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso"
|
||||
|
||||
disk-image: initramfs
|
||||
@echo "==> Creating disk image..."
|
||||
$(BUILD_DIR)/scripts/create-disk-image.sh
|
||||
@echo "==> Built: $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).img"
|
||||
|
||||
# =============================================================================
|
||||
# Kernel validation
|
||||
# =============================================================================
|
||||
kernel-audit:
|
||||
@echo "==> Auditing kernel configuration..."
|
||||
$(BUILD_DIR)/config/kernel-audit.sh
|
||||
|
||||
# =============================================================================
|
||||
# Testing
|
||||
# =============================================================================
|
||||
test-boot: iso
|
||||
@echo "==> Testing boot in QEMU..."
|
||||
test/qemu/test-boot.sh $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso
|
||||
|
||||
test-k8s: iso
|
||||
@echo "==> Testing K8s readiness..."
|
||||
test/integration/test-k8s-ready.sh $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso
|
||||
|
||||
test-persistence: disk-image
|
||||
@echo "==> Testing persistence across reboot..."
|
||||
test/qemu/test-persistence.sh $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).img
|
||||
|
||||
test-deploy: iso
|
||||
@echo "==> Testing workload deployment..."
|
||||
test/integration/test-deploy-workload.sh $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso
|
||||
|
||||
test-storage: iso
|
||||
@echo "==> Testing local storage provisioning..."
|
||||
test/integration/test-local-storage.sh $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso
|
||||
|
||||
test-all: test-boot test-k8s test-persistence
|
||||
|
||||
# Full integration test suite (requires more time)
|
||||
test-integration: test-k8s test-deploy test-storage
|
||||
|
||||
# =============================================================================
|
||||
# Code quality
|
||||
# =============================================================================
|
||||
shellcheck:
|
||||
@echo "==> Running shellcheck on init scripts..."
|
||||
shellcheck -s sh init/init.sh init/lib/*.sh init/emergency-shell.sh
|
||||
@echo "==> Running shellcheck on build scripts..."
|
||||
shellcheck -s bash build/scripts/*.sh build/config/kernel-audit.sh
|
||||
@echo "==> Running shellcheck on test scripts..."
|
||||
shellcheck -s bash test/qemu/*.sh test/integration/*.sh test/kernel/*.sh
|
||||
@echo "==> Running shellcheck on hack scripts..."
|
||||
shellcheck -s bash hack/*.sh
|
||||
@echo "==> All shellcheck checks passed"
|
||||
|
||||
# =============================================================================
|
||||
# Development helpers
|
||||
# =============================================================================
|
||||
dev-vm: iso
|
||||
@echo "==> Launching dev VM..."
|
||||
hack/dev-vm.sh $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso
|
||||
|
||||
dev-vm-shell: iso
|
||||
@echo "==> Launching dev VM (emergency shell)..."
|
||||
hack/dev-vm.sh $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso --shell
|
||||
|
||||
dev-vm-debug: iso
|
||||
@echo "==> Launching dev VM (debug mode)..."
|
||||
hack/dev-vm.sh $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso --debug
|
||||
|
||||
# Fast rebuild: only repack initramfs + ISO (skip fetch/extract)
|
||||
quick:
|
||||
@echo "==> Quick rebuild (repack + ISO only)..."
|
||||
$(BUILD_DIR)/scripts/inject-kubesolo.sh
|
||||
$(BUILD_DIR)/scripts/pack-initramfs.sh
|
||||
$(BUILD_DIR)/scripts/create-iso.sh
|
||||
@echo "==> Quick rebuild complete: $(OUTPUT_DIR)/$(OS_NAME)-$(VERSION).iso"
|
||||
|
||||
# =============================================================================
|
||||
# Docker-based reproducible build
|
||||
# =============================================================================
|
||||
docker-build:
|
||||
@echo "==> Building in Docker..."
|
||||
docker build -t kubesolo-os-builder -f $(BUILD_DIR)/Dockerfile.builder .
|
||||
docker run --rm --privileged \
|
||||
-v $(PWD)/$(OUTPUT_DIR):/output \
|
||||
-v $(PWD)/$(CACHE_DIR):/cache \
|
||||
kubesolo-os-builder make iso OUTPUT_DIR=/output CACHE_DIR=/cache
|
||||
|
||||
# =============================================================================
|
||||
# Cleanup
|
||||
# =============================================================================
|
||||
clean:
|
||||
@echo "==> Cleaning build artifacts..."
|
||||
rm -rf $(ROOTFS_DIR) $(OUTPUT_DIR)
|
||||
@echo "==> Clean. (Cache preserved in $(CACHE_DIR); use 'make distclean' to remove)"
|
||||
|
||||
distclean: clean
|
||||
rm -rf $(CACHE_DIR)
|
||||
|
||||
# =============================================================================
|
||||
# Help
|
||||
# =============================================================================
|
||||
help:
|
||||
@echo "KubeSolo OS Build System (v$(VERSION))"
|
||||
@echo ""
|
||||
@echo "Build targets:"
|
||||
@echo " make fetch Download Tiny Core ISO, KubeSolo, dependencies"
|
||||
@echo " make rootfs Extract + prepare rootfs with KubeSolo"
|
||||
@echo " make initramfs Repack rootfs into kubesolo-os.gz"
|
||||
@echo " make iso Create bootable ISO (default target)"
|
||||
@echo " make disk-image Create raw disk image with boot + data partitions"
|
||||
@echo " make quick Fast rebuild (re-inject + repack + ISO only)"
|
||||
@echo " make docker-build Reproducible build inside Docker"
|
||||
@echo ""
|
||||
@echo "Test targets:"
|
||||
@echo " make test-boot Boot ISO in QEMU, verify boot success"
|
||||
@echo " make test-k8s Boot + verify K8s node reaches Ready"
|
||||
@echo " make test-persist Reboot disk image, verify state persists"
|
||||
@echo " make test-deploy Deploy nginx pod, verify Running"
|
||||
@echo " make test-storage Test PVC with local-path provisioner"
|
||||
@echo " make test-all Run core tests (boot + k8s + persistence)"
|
||||
@echo " make test-integ Run full integration suite"
|
||||
@echo ""
|
||||
@echo "Dev targets:"
|
||||
@echo " make dev-vm Launch interactive QEMU VM"
|
||||
@echo " make dev-vm-shell Launch QEMU VM -> emergency shell"
|
||||
@echo " make dev-vm-debug Launch QEMU VM with debug logging"
|
||||
@echo " make kernel-audit Check kernel config against requirements"
|
||||
@echo " make shellcheck Lint all shell scripts"
|
||||
@echo ""
|
||||
@echo "Cleanup:"
|
||||
@echo " make clean Remove build artifacts (preserve cache)"
|
||||
@echo " make distclean Remove everything including cache"
|
||||
Reference in New Issue
Block a user