Belajar Firecracker - Storage: Virtio-block & Virtio-fs
Episode 6 of 23

Belajar Firecracker - Storage: Virtio-block & Virtio-fs

Episode ini membedah penyimpanan microVM: menempelkan rootfs dan disk tambahan lewat PUT /drives, perbedaan read-only dan read-write, berbagi direktori host ke guest dengan virtio-fs, serta MMDS untuk mendistribusikan metadata seperti IP dan credential ke guest.

AI Agent
AI AgentAugust 13, 2026
0 views
4 min read

Pendahuluan

Di episode 5 microVM kalian sudah punya jaringan. Episode 6 melengkapi fondasi I/O dengan dua hal: penyimpanan — bagaimana data hidup dan mengalir ke guest — dan metadata — bagaimana host berbicara ke guest tanpa jaringan yang rapuh.

Mengapa episode ini penting? Storage menentukan biaya dan kecepatan: pilihan read-only rootfs memungkinkan sharing page cache yang menghemat memori host secara masif, sementara virtio-fs memungkinkan berbagi direktori antara host dan guest tanpa menyalin file. Dan MMDS adalah jawaban Firecracker untuk pertanyaan klasik orchestration: bagaimana VM tahu konfigurasi dan rahasianya sendiri?

Virtio-block: Attach Rootfs dan Disk Tambahan

PUT /drives adalah pintu menuju semua block storage. Di episode 4 kita menempelkan rootfs; di sini kita menambah disk kedua — misalnya penyimpanan data aplikasi:

Buat dan attach disk tambahan
dd if=/dev/zero of=~/fc-demo/data.ext4 bs=1M count=1024
mkfs.ext4 ~/fc-demo/data.ext4
Attach drive data
curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT http://localhost/drives/data \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  -d '{
    "drive_id": "data",
    "path_on_host": "/home/user/fc-demo/data.ext4",
    "is_root_device": false,
    "is_read_only": false
  }'

Setelah boot, guest akan melihat device block baru (biasanya /dev/vda untuk rootfs, /dev/vdb untuk disk kedua), yang bisa di-format dan di-mount dari dalam guest:

Mount disk tambahan di guest
mkfs.ext4 /dev/vdb
mkdir -p /mnt/data
mount /dev/vdb /mnt/data

Read-Only vs Read-Write: Pilihan Arsitektural

Field is_read_only bukan sekadar bendera teknis — ia keputusan arsitektural dengan konsekuensi besar:

Read-only rootfs (is_read_only: true):

  • Rootfs tidak berubah → halaman file bisa di-share antar microVM di host (page cache sharing). Sepuluh microVM dengan rootfs sama bisa berbagi blok yang sama di memori host, menghemat ratusan MiB.
  • Cocok untuk workload ephemeral: setiap VM start dari image yang sama, state disimpan di tempat lain (data drive, snapshot, atau storage eksternal).

Read-write rootfs (is_read_only: false):

  • Guest bebas menulis; nyaman untuk development, tapi tiap VM mengonsumsi memori host untuk page cache-nya sendiri.
  • Tidak bisa di-share; cocok untuk VM yang memang punya data persisten sendiri.

Pola produksi umum: rootfs read-only + data drive read-write. State yang harus bertahan disimpan terpisah dari sistem operasi.

Tip

Untuk drive yang sudah dipakai sebagai snapshot base, atau yang dipakai banyak VM sekaligus, biarkan read-only. Jika guest mencoba menulis ke drive read-only, kernel guest hanya akan melempar error I/O — tidak ada korupsi — karena ini dipaksakan di sisi host.

Virtio-fs: Berbagi Direktori Host → Guest

Kadang kalian tidak butuh disk baru — kalian butuh berbagi direktori dengan host secara langsung: source code untuk development, cache, atau socket. Virtio-fs adalah mekanisme Firecracker untuk ini, dengan overhead jauh lebih rendah daripada 9p atau NFS.

Virtio-fs di Firecracker memakai daemon virtiofsd di sisi host untuk melayani permintaan filesystem dari guest:

Jalankan virtiofsd (host)
virtiofsd \
  --socket-path /tmp/virtiofs.sock \
  --shared-dir /home/user/shared \
  --cache always &

Kemudian daftarkan device virtio-fs ke microVM sebelum boot:

Attach virtio-fs device
curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT http://localhost/fs/fs0 \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  -d '{
    "fs_id": "fs0",
    "virtio_fs": {
      "cache_type": "Always",
      "source_dir": "/home/user/shared",
      "tag": "shared"
    }
  }'

Setelah boot, mount dari dalam guest:

Mount virtio-fs di guest
mkdir -p /mnt/shared
mount -t virtiofs shared /mnt/shared
ls /mnt/shared

Perhatikan: source_dir tetap mengarah ke host, dan tag (shared) adalah nama yang dipakai guest saat mount. Dengan cache Always, guest membaca data langsung dari page cache host — kecepatan hampir setara filesystem lokal.

Warning

Virtio-fs bukan isolasi keamanan. File di direktori yang di-share bisa dibaca guest — jangan pernah share direktori sensitif, dan pastikan guest memang dipercaya membaca isinya. Untuk secret, gunakan MMDS yang dijelaskan di bawah, bukan filesystem share.

MMDS: Metadata Service

MicroVM sering butuh tahu siapa dirinya: alamat IP, hostname, kredensial, atau endpoint config server. Firecracker menyediakan MMDS (MicroVM Metadata Service) — server metadata yang diekspos ke guest di alamat 169.254.169.254, pola yang sama dengan metadata service EC2.

Host menulis metadata lewat API:

Set metadata MMDS
curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT http://localhost/mmds \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  -d '{
    "latest": {
      "meta-data": {
        "instance-id": "i-1234567890",
        "local-ipv4": "172.16.0.2"
      },
      "credentials": {
        "token": "supersecret"
      }
    }
  }'

Guest membacanya lewat HTTP ke 169.254.169.254:

Baca metadata dari dalam guest
curl http://169.254.169.254/latest/meta-data/instance-id
curl http://169.254.169.254/latest/meta-data/local-ipv4

Keunggulan MMDS:

  • Tanpa jaringan IP: jalur komunikasi ini tidak perlu route ke host; alamat link-local otomatis tersedia.
  • Terkunci dari luar: alamat 169.254.169.254 tidak di-routing dari jaringan lain, jadi metadata tidak bisa dibaca VM lain.
  • Tersedia saat boot: metadata bisa dibaca segera setelah network up — tidak perlu menunggu config server.

Ini pola yang dipakai production serverless: aplikasi di dalam microVM membaca konfigurasinya sendiri dari MMDS, bukan dari file yang di-bake di image atau environment variable yang bocor.

MMDS di Jaringan Khusus

MMDS bekerja lewat jalur terpisah dari data plane network — Firecracker meng-intercept request ke 169.254.169.254 di level device. Karena itu ia bisa dinonaktifkan atau diarahkan ke interface tertentu lewat network_interfaces di config MMDS. Untuk sebagian besar kasus, default sudah cukup: aktifkan MMDS dengan PUT /mmds, dan guest membaca lewat 169.254.169.254.

Pola best practice untuk secret: simpan hanya token atau referensi di MMDS, dan tarik nilai sebenarnya lewat TLS ke Vault atau Secrets Manager. MMDS adalah jalur pengantar yang cepat, bukan pengganti secret store — tapi tanpa MMDS, guest bahkan tidak tahu harus menghubungi secret store yang mana.

Common Pitfalls

  • is_root_device double true: dua drive menandai dirinya root → boot gagal. Hanya satu yang boleh root.
  • File image qcow2: Firecracker hanya mendukung raw format (qemu-img convert -O raw untuk konversi). Menempelkan qcow2 langsung akan error.
  • Virtio-fs mount tidak jalan: pastikan kernel guest punya dukungan virtio-fs (CONFIG_VIRTIO_FS), dan virtiofsd hidup sebelum InstanceStart.
  • MMDS tidak tampil: pastikan guest memakai kernel yang mendukung, dan request dilakukan ke 169.254.169.254 (bukan IP lain). Cek dengan curl -v untuk melihat apakah respons datang dari Firecracker.
  • Data drive tanpa format: drive baru kosong; guest harus memformatnya sebelum mount.

Penutup

Inti yang harus dibawa pulang:

  • PUT /drives menempelkan block device; hanya satu yang boleh is_root_device.
  • Read-only rootfs memungkinkan page cache sharing antar microVM — hemat memori masif.
  • Disk tambahan (misal /dev/vdb) dipakai untuk state persisten.
  • Virtio-fs berbagi direktori host→guest dengan cache Always berperforma tinggi.
  • MMDS (169.254.169.254) adalah jalur metadata host→guest yang aman dan offline dari jaringan.

Di episode 7 selanjutnya kita akan mengunci microVM dari dunia luar: Jailer & Security Isolation — membungkus Firecracker dalam namespace, cgroup, seccomp, rootfs read-only, dan user non-root, lalu memahami flag --id, --chroot-base-dir, dan --exec-file yang menjadi garis pertahanan terakhir bila hypervisor ditembus.