Episode ini membedah pembuatan image microVM: membangun rootfs minimal dengan Alpine/musl, mengonfigurasi kernel dengan driver seminimal mungkin, memilih boot params yang tepat, serta mengenal tooling seperti firectl, firecracker-containerd, NixOS microvm.nix, dan mkosi untuk automasi build.

Di episode 7 kita mengunci microVM dengan jailer. Sekarang pertanyaannya: isi apa? Episode 8 membahas bekal setiap microVM — image: rootfs dan kernel yang dibangun khusus untuk cepat boot, hemat memori, dan berisi hanya yang dibutuhkan.
Mengapa episode ini penting? Firecracker menjanjikan boot ~125 ms dan overhead < 5 MiB — tapi janji itu hanya terpenuhi jika image-nya bekerja sama. Rootfs yang gemuk, kernel yang memuat ratusan driver tak terpakai, dan init yang lambat akan membuat microVM boot berdetik-detik dan memakan memori berkali-kali lipat. Image adalah setengah dari performa.
Kernel dan rootfs di dunia microVM harus mengikuti prinsip yang berbeda dari distro server biasa:
Dengan prinsip ini, image microVM menjadi artefak yang bisa dibangun, diuji, dan direproduksi secara deterministik — bukan filesystem yang tumbuh seperti tanaman liar.
Alpine Linux adalah pilihan populer untuk microVM: kecil, memakai musl libc, dan mem-boot dari hampir tidak ada. Rencananya: buat filesystem ext4, bootstrap Alpine dengan apk, dan pasang hanya package yang dibutuhkan.
dd if=/dev/zero of=rootfs.ext4 bs=1M count=256
mkfs.ext4 rootfs.ext4
mkdir -p /mnt/fc-rootfs
sudo mount rootfs.ext4 /mnt/fc-rootfs
sudo mkdir -p /mnt/fc-rootfs/etc/apkTambahkan repository Alpine dan bootstrap:
sudo apk add --root /mnt/fc-rootfs --initdb --arch x86_64 alpine-basePasang hanya yang dibutuhkan — misalnya shell dan networking dasar:
sudo apk add --root /mnt/fc-rootfs --no-cache \
alpine-baselayout busybox muslJangan install linux-firmware, jangan install seluruh desktop — setiap package menambah waktu boot dan memori. Pada tahap akhir, konfigurasi /etc/inittab agar init berjalan dengan console=ttyS0, lalu unmount:
sudo umount /mnt/fc-rootfsTip
Gunakan --arch yang sesuai dengan host (x86_64 atau aarch64) dan pilih versi Alpine yang mendukung arsitektur itu. Jika memakai rootfs siap pakai dari repo Firecracker, pastikan isinya sesuai kebutuhan kalian — jangan asal copy tanpa audit.
Kernel microVM di-build dengan konfigurasi yang memotong semua hal yang tidak dibutuhkan. Prinsip utamanya:
Contoh arah konfigurasi (via make menuconfig atau config fragment):
CONFIG_VIRTIO=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO_FS=y
CONFIG_VIRTIO_RNG=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_EXT4_FS=y
CONFIG_NO_HZ_IDLE=yKemudian build:
make defconfig
make -j$(nproc) vmlinuxHasilnya vmlinux (ELF uncompressed) yang siap dipakai Firecracker. Ukuran akhir biasanya di bawah 10 MB.
Boot args menentukan bagaimana kernel menyapa hardware virtual:
{
"kernel_image_path": "/vmlinux.bin",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off iommu=off"
}console=ttyS0 — output ke serial, bisa dibaca operator.reboot=k — reboot via KVM (instan, bukan siklus daya).panic=1 — reboot 1 detik setelah kernel panic; microVM ephemeral tidak boleh menunggu manusia.pci=off — matikan scan PCI; mempercepat boot bila semua device dipakai via MMIO.iommu=off — untuk host tanpa IOMMU, menghindari waktu inisialisasi IOMMU.Boot params adalah instrumen tuning: tanpa pci=off, kernel menghabiskan waktu men-scan bus PCI; dengan console=ttyS0, operator bisa membaca crash. Pilih sesuai workload — jangan menyalin buta.
Build image dengan tangan berulang-ulang tidak produktif. Ekosistem menyediakan tooling:
firectl — CLI untuk launch Firecracker dari image OCI container; build sekali, jalankan banyak (episode 12).firecracker-containerd — runtime containerd yang membungkus image container menjadi microVM (episode 11).microvm.nix — mendeklarasikan seluruh image microVM (kernel, rootfs, init) sebagai konfigurasi Nix yang reproduktif dan bisa diuji.mkosi — membangun image OS lengkap (systemd-based) dari spec declarative, termasuk kernel dan rootfs untuk microVM.Pola umum tooling ini: declarative spec → image artefak. Kernel, rootfs, dan init ditentukan sekali di konfigurasi; hasilnya image immutable yang di-hash dan didistribusikan. Inilah fondasi dari "build image dari Dockerfile" yang kita lihat di AWS Lambda MicroVMs (episode 18).
Warning
Image yang ditangani tangan cepat basi: package berubah, kernel berubah, dan hasil build tidak bisa direproduksi. Sejak awal, biasakan image dibangun dari tooling declarative (mkosi, microvm.nix, atau Dockerfile + firecracker-containerd) agar versi dan isi image bisa di-audit.
vmlinuz tidak bisa dimuat; selalu pakai vmlinux ELF./sbin/init ada dan /etc/inittab benar.console= tidak diset: output boot hilang; debugging jadi buta.Inti yang harus dibawa pulang:
console=ttyS0, panic=1, pci=off adalah instrumen tuning nyata.Di episode 9 selanjutnya kita akan membuka kemampuan yang membuat Firecracker begitu disukai serverless: Snapshot & Restore — membekukan microVM berjalan dengan PUT /snapshot/create, menghidupkannya kembali dengan PUT /snapshot/load, memahami perbedaan memory dan diff snapshot, dan bagaimana pola ini mewujudkan cold start instan dan suspend/resume.