Commit bb45dcb
committed
feat: add systemd mode for EC2-like VMs
Replace shell-based init script with Go binary that supports two modes:
## Exec Mode (existing behavior)
- Go init runs as PID 1
- Starts guest-agent in background
- Runs container entrypoint as child process
- Used for standard Docker images (nginx, python, etc.)
## Systemd Mode (new)
- Auto-detected when image CMD is /sbin/init or /lib/systemd/systemd
- Go init sets up rootfs, then chroots and execs systemd
- Systemd becomes PID 1 and manages the full system
- guest-agent runs as a systemd service (hypeman-agent.service)
- Enables EC2-like experience: ssh, systemctl, journalctl all work
## Key changes:
- lib/system/init/: New Go-based init binary with modular boot phases
- lib/images/systemd.go: IsSystemdImage() auto-detection from CMD
- lib/instances/configdisk.go: Passes INIT_MODE to guest
- lib/system/init/init.sh: Shell wrapper to mount /proc /sys /dev
before Go runtime (Go requires these during initialization)
- integration/systemd_test.go: Full E2E test verifying:
- systemd is PID 1
- hypeman-agent.service is active
- journalctl works for viewing logs
## Boot flow:
1. Kernel loads initrd with busybox + Go init + guest-agent
2. init.sh mounts /proc, /sys, /dev (Go runtime needs these)
3. init.sh execs Go init binary
4. Go init mounts overlay rootfs, configures network, copies agent
5. Based on INIT_MODE: exec mode (run entrypoint) or systemd mode (chroot + exec /sbin/init)1 parent d09b2d8 commit bb45dcb
File tree
26 files changed
+1739
-697
lines changed- .cursor/plans
- integration
- lib
- guest
- images
- instances
- system
- init
26 files changed
+1739
-697
lines changedLines changed: 0 additions & 219 deletions
This file was deleted.
0 commit comments