Firecracker 0.11でmicroVMを試してみた

 1.概要

microVMのFirecrackerを試しました。AWS Fargateで利用されている技術です。
loginできないDocker Container環境だと認識していましたが、
正しい内容とその仕組みを知る機会となりました。この内容を記述します。

2.詳細

下記資料がすべてを示しています。

Firecracker
https://firecracker-microvm.github.io/

KVM環境の上に、microVMを複数動作させ、そこでContainerを動かす仕組みのようです。
実際にmicroVMを起動すると100MB程度のメモリで動作しています。

試験環境はIntel i3, Memory 16GB, SSD 256GB, LinuxMint 22.3を利用しました。

手順は上記URLの下の方の下記部分にあります。
Announcing the Firecracker Open Source Technology
手順の記述内容に一部誤り(curl -L => curl -L -Oなど)があり、
下記参考資料を参照して実行します。
私はhome dicrectoryにfirecracker directryを作成して作業しました

Firecrackerをさわって大量のmicroVMを立ち上げてみた
https://dev.classmethod.jp/articles/reinvent2018-try-firecracker/

また、LinuxMint 22.3は/dev/kvmの権限設定は既定値で設定済みでした。

(1) firecrackerのdownload

curl -L -O https://github.com/firecracker-microvm/firecracker/releases/download/v0.11.0/firecracker-v0.11.0
chmod +x firecracker-v0.11.0

(2) Linux kernelとroot filesystemのdownload

curl -fsSL -o hello-vmlinux.bin https://s3.amazonaws.com/spec.ccfc.min/img/hello/kernel/hello-vmlinux.bin
curl -fsSL -o hello-rootfs.ext4 https://s3.amazonaws.com/spec.ccfc.min/img/hello/fsfiles/hello-rootfs.ext4

(3) LinuxMint 22.3は/dev/kvmの権限設定は既定値で設定済みで、OKになります

[ -r /dev/kvm ] && [ -w /dev/kvm ] && echo "OK" || echo "FAIL"

(4) Firecracker起動

./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock

(5) ゲストカーネルのセッティング

ここからは別のterminalで作業です

curl --unix-socket /tmp/firecracker.sock -i \
    -X PUT 'http://localhost/boot-source'   \
    -H 'Accept: application/json'           \
    -H 'Content-Type: application/json'     \
    -d '{
        "kernel_image_path": "./hello-vmlinux.bin",
        "boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
    }'

(6) ルートファイルシステムをセッティング

curl --unix-socket /tmp/firecracker.sock -i \
    -X PUT 'http://localhost/drives/rootfs' \
    -H 'Accept: application/json'           \
    -H 'Content-Type: application/json'     \
    -d '{
        "drive_id": "rootfs",
        "path_on_host": "./hello-rootfs.ext4",
        "is_root_device": true,
        "is_read_only": false
    }'

(7) InstanceStartアクション

curl --unix-socket /tmp/firecracker.sock -i \
    -X PUT 'http://localhost/actions'       \
    -H  'Accept: application/json'          \
    -H  'Content-Type: application/json'    \
    -d '{
        "action_type": "InstanceStart"
     }'

(8) login

最初のterminalでmicroVMが起動され、loginできます。
User/Passwordはroot/rootです

(9) 停止

login状態でrebootコマンドを入力すると終了します

(10)複数起動

MAX=1000
echo "$MAX"
for NUM in $(seq 1 ${MAX})
do
echo "$NUM"
./firecracker-v0.11.0 --api-sock /tmp/firecracker-${NUM}.sock &
done

不安だったので、10, 100, 1000と順番にチャレンジしました。
1000個起動しても何も問題起きません。
Memoryも大量消費することなく、単にプロセスが定義されただけの状態のようです。
しかし、一度プロセス起動をすると、rebootしないと次の試験はできません。

限界挑戦で10000を指定すると、9806でPanic occurredで終了
9805
9806
[:ERROR:src/main.rs:50] Panic occurred: PanicInfo { payload: Any, message: Some(VMM thread spawn failed.: Os { code: 11, kind: WouldBlock, message: "Resource temporarily unavailable" }), location: Location { file: "libcore/result.rs", line: 1009, col: 5 } }

参考

AWS Fargateについて深掘りしてみた
https://qiita.com/miyar2306/items/4ef892cd0dfc7927a88a

Firecrackerをさわって大量のmicroVMを立ち上げてみた
https://dev.classmethod.jp/articles/reinvent2018-try-firecracker/

コメント

このブログの人気の投稿

LinuxMint 22.3にdosbox-xを導入してWindows95/98のGameを動かしました

ubuntu 26.04 LTSのリリース発表があり、Daily Build版を導入しました

ubuntu desktop 26.04 LTSをKVM環境にDaily Build版を導入しました