Last active
June 14, 2023 14:51
-
-
Save wenerme/97a2f088496bb3e6492ef7e8fe23da8a to your computer and use it in GitHub Desktop.
AlpineLinux Firecracker
This file contains 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