Last active
January 29, 2025 21:32
AlpineLinux Firecracker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# download | |
latest=$(basename $(curl -fsSLI -o /dev/null -w %{url_effective} https://github.com/firecracker-microvm/firecracker/releases/latest)) | |
curl -LOJ https://github.com/firecracker-microvm/firecracker/releases/download/${latest}/firecracker-${latest}-$(uname -m) | |
mv firecracker-${latest}-$(uname -m) firecracker | |
chmod +x firecracker | |
# rootfs | |
# ========= | |
# qemu-img create -f raw alpine.rootfs.ext4 1G | |
fallocate -l 1G ubuntu.rootfs.ext4 | |
mkfs.ext4 ./alpine.rootfs.ext4 | |
mkdir /tmp/rootfs | |
sudo mount alpine.rootfs.ext4 /tmp/rootfs | |
curl -OJ https://mirrors.aliyun.com/alpine/v3.12/releases/x86_64/alpine-minirootfs-3.12.0-x86_64.tar.gz | |
sudo tar zxvf alpine-minirootfs-3.12.0-x86_64.tar.gz -C /tmp/rootfs/ | |
# for mirror | |
sudo cp /etc/apk/repositories /tmp/rootfs/etc/apk/repositories | |
sudo cp /etc/resolv.conf /tmp/rootfs/etc | |
sudo chroot /tmp/rootfs/ /bin/sh | |
apk add alpine-base util-linux linux-virt haveged | |
rc-update add haveged | |
echo root:root | chpasswd | |
for svc in devfs procfs sysfs; do ln -fs /etc/init.d/$svc /etc/runlevels/boot; done | |
exit | |
ln -s agetty /etc/init.d/agetty.ttyS0 | |
echo ttyS0 > /etc/securetty | |
rc-update add agetty.ttyS0 default | |
# this initramfs contain required ext4 module | |
sudo cp /tmp/rootfs/boot/initramfs-virt initramfs-virt | |
sudo cp /tmp/rootfs/boot/vmlinuz-virt vmlinuz-virt | |
sudo umount /tmp/rootfs | |
# kernel | |
# ========== | |
curl -LOC- https://raw.githubusercontent.com/torvalds/linux/master/scripts/extract-vmlinux | |
chmod +x extract-vmlinux | |
./extract-vmlinux $PWD/vmlinuz-virt > vmlinux-virt | |
# config & start | |
# ========== | |
cat <<CONF > alpine.json | |
{ | |
"boot-source": { | |
"initrd_path": "initramfs-virt", | |
"kernel_image_path": "vmlinux-virt", | |
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off modules=virtio_mmio,ext4 rootfstype=ext4" | |
}, | |
"drives": [ | |
{ | |
"drive_id": "rootfs", | |
"path_on_host": "alpine.rootfs.ext4", | |
"is_root_device": true, | |
"is_read_only": false | |
} | |
], | |
"machine-config": { | |
"vcpu_count": 1, | |
"mem_size_mib": 1024, | |
"ht_enabled": false | |
} | |
} | |
CONF | |
./firecracker --api-sock /tmp/firecracker.socket --config-file alpine.json | |
# exit | |
# ========== | |
# api request | |
curl --unix-socket /tmp/firecracker.socket -i \ | |
-X PUT "http://localhost/actions" \ | |
-H "accept: application/json" \ | |
-H "Content-Type: application/json" \ | |
-d '{"action_type": "SendCtrlAltDel"}' | |
# in vm | |
reboot |
that did the trick rc-update add networking boot
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
any idea how to add network devices. it Boots correctly but it doesn't seem to detect network interfaces
I added this to /etc/network/interfaces
But it's not yet pingable