-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
133 lines (109 loc) · 4.63 KB
/
Makefile
File metadata and controls
133 lines (109 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
KERNEL_URL := https://s3.amazonaws.com/spec.ccfc.min/firecracker-ci/v1.10/x86_64/vmlinux-5.10.223
ROOTFS_URL := https://s3.amazonaws.com/spec.ccfc.min/firecracker-ci/v1.10/x86_64/ubuntu-22.04.ext4
FC_VERSION := v1.10.1
FC_URL := https://github.com/firecracker-microvm/firecracker/releases/download/$(FC_VERSION)/firecracker-$(FC_VERSION)-x86_64.tgz
FC_INSTALL_DIR := /usr/local/bin
KERNEL := vmlinux.bin
ROOTFS := rootfs.ext4
BINARY := onfire
CLIENT_BIN := onfirec/onfirec
AGENT_BIN := onfire-agent
CLOUD_INIT_ISO := cloud-init.iso
CLOUD_INIT_CONFIG := cloud-init-config.yaml
TAP_DEV := tap0
TAP_IP := 172.16.0.1
VM_IP := 172.16.0.2
VM_MASK := 255.255.255.0
VM_MAC := AA:FC:00:00:00:01
# Detect default host interface for NAT (first non-loopback default route)
HOST_IFACE := $(shell ip route get 8.8.8.8 2>/dev/null | awk '{for(i=1;i<=NF;i++) if($$i=="dev") print $$(i+1)}' | head -1)
KERNEL_ARGS := "console=ttyS0 reboot=k panic=1 pci=off ip=$(VM_IP)::$(TAP_IP):$(VM_MASK)::eth0:off:8.8.8.8"
# Multi-VM configuration
N ?= 3
.PHONY: build build-onfirec agent run assets net-up net-down clean cloud-init-iso update scenario server deps
deps:
@echo "==> Installing firecracker $(FC_VERSION)"
@TMPDIR=$$(mktemp -d) && \
curl -fsSL -o $$TMPDIR/fc.tgz $(FC_URL) && \
tar -xzf $$TMPDIR/fc.tgz -C $$TMPDIR && \
sudo install -m 0755 $$TMPDIR/release-$(FC_VERSION)-x86_64/firecracker-$(FC_VERSION)-x86_64 $(FC_INSTALL_DIR)/firecracker && \
rm -rf $$TMPDIR
@echo " ✓ firecracker installed: $$(firecracker --version | head -1)"
@echo "==> Installing system dependencies"
sudo apt-get install -y --no-install-recommends \
cloud-image-utils \
e2fsprogs \
iproute2 \
iptables
@echo " ✓ system dependencies installed"
build:
go build -o $(BINARY) .
go build -o $(AGENT_BIN) ./agent/
go build -o $(CLIENT_BIN) ./onfirec/
build-onfirec:
go build -o $(CLIENT_BIN) ./onfirec/
agent: $(AGENT_BIN)
$(AGENT_BIN):
go build -o $(AGENT_BIN) ./agent/
$(KERNEL):
@echo "==> Downloading kernel (Firecracker CI v1.10, 5.10.223)"
curl -fsSL -o $(KERNEL) $(KERNEL_URL)
$(ROOTFS): $(AGENT_BIN)
@echo "==> Downloading Ubuntu 22.04 rootfs (Firecracker CI v1.10)"
curl -fsSL -o $(ROOTFS) $(ROOTFS_URL)
@echo "==> Setting up rootfs (SSH, root password, agent)"
chmod +x setup-rootfs.sh
./setup-rootfs.sh $(ROOTFS) $(AGENT_BIN)
$(CLOUD_INIT_ISO): $(CLOUD_INIT_CONFIG)
@echo "==> Creating cloud-init ISO"
chmod +x make-cloud-init-iso.sh
./make-cloud-init-iso.sh $(CLOUD_INIT_ISO) $(CLOUD_INIT_CONFIG)
update:
@rm -f $(CLOUD_INIT_ISO)
@$(MAKE) $(CLOUD_INIT_ISO)
assets: $(KERNEL) $(ROOTFS) $(CLOUD_INIT_ISO)
net-up:
@echo "==> Setting up TAP networking ($(TAP_DEV), host=$(TAP_IP), vm=$(VM_IP))"
sudo ip tuntap add $(TAP_DEV) mode tap 2>/dev/null || true
sudo ip addr add $(TAP_IP)/24 dev $(TAP_DEV) 2>/dev/null || true
sudo ip link set $(TAP_DEV) up
sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
sudo iptables -t nat -C POSTROUTING -o $(HOST_IFACE) -j MASQUERADE 2>/dev/null || \
sudo iptables -t nat -A POSTROUTING -o $(HOST_IFACE) -j MASQUERADE
sudo iptables -C FORWARD -i $(TAP_DEV) -o $(HOST_IFACE) -j ACCEPT 2>/dev/null || \
sudo iptables -A FORWARD -i $(TAP_DEV) -o $(HOST_IFACE) -j ACCEPT
sudo iptables -C FORWARD -i $(HOST_IFACE) -o $(TAP_DEV) -m state --state RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || \
sudo iptables -A FORWARD -i $(HOST_IFACE) -o $(TAP_DEV) -m state --state RELATED,ESTABLISHED -j ACCEPT
net-down:
@echo "==> Tearing down TAP networking"
sudo ip link del $(TAP_DEV) 2>/dev/null || true
sudo iptables -t nat -D POSTROUTING -o $(HOST_IFACE) -j MASQUERADE 2>/dev/null || true
sudo iptables -D FORWARD -i $(TAP_DEV) -o $(HOST_IFACE) -j ACCEPT 2>/dev/null || true
sudo iptables -D FORWARD -i $(HOST_IFACE) -o $(TAP_DEV) -m state --state RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || true
run: assets net-up
sudo ./$(BINARY) run \
--kernel $(KERNEL) \
--rootfs $(ROOTFS) \
--mem 512 \
--tap $(TAP_DEV) \
--mac $(VM_MAC) \
--kernel-args $(KERNEL_ARGS) \
--cloud-init-iso $(CLOUD_INIT_ISO)
ROOTFS_SIZE ?= 1024
SCENARIO ?= scenarios/monolith/disk-full.yaml
scenario:
sudo ./$(BINARY) scenario run \
--kernel $(KERNEL) \
--rootfs $(ROOTFS) \
--cloud-init-iso $(CLOUD_INIT_ISO) \
$(SCENARIO)
server:
sudo ./$(BINARY) server \
--kernel $(KERNEL) \
--rootfs $(ROOTFS) \
--cloud-init-iso $(CLOUD_INIT_ISO) \
--port 8888
cleanup: net-down-multi
@echo "==> Network cleaned up"
clean: net-down
rm -f $(BINARY) $(CLIENT_BIN) $(AGENT_BIN) $(KERNEL) $(ROOTFS) $(CLOUD_INIT_ISO) cloud-init-*.iso vm-*.log vm-*.ext4 onfirec/onfirec