// fc-orchestrator — Poor man's Firecracker snapshot orchestrator in Go. // // Creates a golden VM, snapshots it, then spawns N clones that share the // base memory file via Firecracker's MAP_PRIVATE (kernel-level COW). // Rootfs gets a filesystem-level COW copy (reflink where supported). // // Usage: // // go build -o fc-orch . // sudo ./fc-orch init // sudo ./fc-orch golden // sudo ./fc-orch spawn 10 // sudo ./fc-orch status // sudo ./fc-orch kill // sudo ./fc-orch cleanup package main import ( "fmt" "os" "github.com/kacerr/fc-orchestrator/orchestrator" ) func main() { // figure out if we are running as root if os.Geteuid() == 0 { fmt.Println("Running with root/sudo privileges!") } else { fmt.Println("Running as a normal user.") } if len(os.Args) < 2 { usage() os.Exit(1) } orch := orchestrator.New(orchestrator.DefaultConfig()) switch os.Args[1] { case "init": fatal(orch.Init()) case "golden": fatal(orch.Golden()) case "spawn": n := 1 if len(os.Args) > 2 { fmt.Sscanf(os.Args[2], "%d", &n) } fatal(orch.Spawn(n)) case "status": orch.Status() case "kill": fatal(orch.Kill()) case "cleanup": fatal(orch.Cleanup()) default: usage() os.Exit(1) } } func usage() { fmt.Fprintf(os.Stderr, `Usage: %s [args] Commands: init Download kernel + create Alpine rootfs golden Boot golden VM → pause → snapshot spawn [N] Restore N clones from golden snapshot (default: 1) status Show running clones kill Kill all running VMs cleanup Kill VMs + remove all state Environment: FC_BIN firecracker binary path (default: firecracker) FC_BASE_DIR working directory (default: /tmp/fc-orch) FC_KERNEL vmlinux path FC_KERNEL_URL vmlinux download URL (default: pinned Firecracker CI build) FC_ROOTFS rootfs.ext4 path FC_VCPUS vCPUs per VM (default: 1) FC_MEM_MIB MiB per VM (default: 128) FC_BRIDGE bridge name or "none" (default: fcbr0) `, os.Args[0]) } func fatal(err error) { if err != nil { fmt.Fprintf(os.Stderr, "fatal: %v\n", err) os.Exit(1) } }