LinuxMintでFirecrackerでmicroVMを試してみた

1.概要

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

2.詳細

(1) ネット情報で基礎知識を取得

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

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の権限設定は既定値で設定済みでした。

(a) 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

(b) 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

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

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

(d) Firecracker起動

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

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

ここからは別の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"
    }'

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

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
    }'

(g) 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"
     }'

(h) login

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

(i) 停止

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

(j) 複数起動

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 } }

(2) Firecracker-v1.15.0にupgradeして動作確認しました

前回のFirecraker動作検証はWebサイトの記述に沿って実施しました。Firecraker-v0.11.0で、GoogleAIからVersionUpが必要と指摘を受けて、Firecracker-v1.15.0にupgradeしました。このVersionでは、config.jsonを利用することでcurlの処理を簡素化できます。その内容を記述します。

Firecrakerの最新版を下記URLからDownloadします。
https://github.com/firecracker-microvm/firecracker/releases
firecracker-v1.15.0-x86_64.tgz 
上記ファイルを選択して、firecracker-v1.15.0-x86_64を取り出します。

次に、config-fileをconfig.jsonの名前で作成します。
記述内容は前回のcurlコマンドをベースにしました。

{
  "boot-source": {
    "kernel_image_path": "hello-vmlinux.bin",
    "boot_args": "console=ttyS0 reboot=k panic=1 pci=off root=/dev/vda1 rw"
  },
  "drives": [
     {
     "drive_id": "rootfs",
     "path_on_host": "hello-rootfs.ext4",
     "is_root_device": true,
     "is_read_only": false
     }
  ],
  "machine-config": {
     "vcpu_count": 1,
     "mem_size_mib": 256,
     "smt": false
  }
}

まず、作成した/tmp/firecracker.sockを削除します。
$ rm -f /tmp/firecracker.sock

実行します。
$ ./firecracker-v1.15.0-x86_64 --config-file config.json --api-sock /tmp/firecracker.sock

Terminalは1台で実行でき、microVMへloginできます。

(3) Slackware64-15.0を仮想環境と物理環境に導入してみた

Firecrackerを利用してmicroVMを学び、独自microVMを作成できないかと思いました。早速、GoogleAIに尋ねるとSlackwareのboot-disk,root-diskの考え方を利用するとのこと。boot-diskはkernelで、root-diskが必要なfile systemです。そこで、まず、Slackware64-15.0を導入してみました。その内容を記述します。

Slackwareは最初に利用したLinux Distributionで使い勝手はわかっているつもりでした。現在利用しているmbm039のmulti-boot環境に導入することは簡単でないと直感したので、最初に、KVM環境の仮想マシンとしてSlackware64-15.0の導入をしました。

導入後、再起動ををすると仮想マシンのCPUは100%ですが、起動しません。Slackwrae-15.0(32bit版)でも試してみましたが、同じ状況です。

LILOのboot-loaderをExpertで設定したことで、何か問題ある設定をしたのだと思います。ネットを検索して、参考資料を見つけました。LILO設定をSimpleでSlackware64-15.0導入して、起動できました。

※Expertで過去に何度も実施しているので、何か変わったのかもしれません。LILO起動画面がGUI表示になっていたのでチョット驚きでした。

更にネットを検索して、grubをboot-loaderに変更する参考資料を見つけました。systemrescueで起動して、/dev/vdaのboot-loaderをLILOからgrubに変えます。仮想ディスクなのでMBR領域にGrubを導入します。

仮想環境で学習した内容を物理環境に適用します。同じやり方でMBRディスクのパーティション(/dev/sdc2)にSlackware64-15.0を導入。導入時にLILOの導入をスキップして、installを終了します。この状態では起動できません。

次に、systemrescueで起動して、boot-loaderを設定します。こちらはgrubを/dev/sdc2のPBRに導入します。これで、mbm039のmulti-boot環境にSlackware64-15.0を参加させました。

IPを設定して、slackpkgを利用してupdate,upgrade-allまで実行。rebootすると起動できません。kernelが変わったので設定変更が必要です。もう一度、grubを/dev/sdc2のPBRに再度導入して、mbm039からmulti-bootできました。

(4) Firecrakerで自作Slackware microVM動作に挑戦

自作microVMをSlackwareで構築できないかを検討しています。作成したmicroVMはFirecrackerで動かすことを考えています。microVMを作成するには、boot-diskとroot-diskが必要です。今回はSlackware64-15.0を利用してminimal root diskを作る手段を検討してみました。

ネットを調べて簡単に実現できそうなroot-disk部分を試してみました。

(a)Slackware-Minimal Install

最初に見つけた資料です。SlackwareのVersion記述が曖昧ですが、
文面にあるSlackware64-13.37で試しました。

dfコマンドでディスク使用量を確認すると527MB
起動時のmemory使用量は90MB
kernel-2.6です。

なお、同じ選択でSlackware64-14.2, Slackware64-15.0は起動しますが、loginできません。

(b)sagredo-dev/Slackware-minimal

次に見つけた資料です。
選択項目のリストを見て、前述内容よりも大きくなると思えたので、
Slackware64-15.0でPKG_LIST-all-minimal-a-ap-d-l-nを試しました

dfコマンドでディスク使用量を確認すると8GB
起動時のmemory使用量は109MB
kernel-5.15です

(c)Slackware64-15.0を(a)に極限に近づけてみました

(a)にaのREQUIREなどを追加、kernel-firmawareを削除

dfコマンドでディスク使用量を確認すると645MB
起動時のmemory使用量は96MB
kernel-5.15です

3.所見

aws ECS fargateの基盤を理解できたと思います。Firecrackerを利用して、自分で構築したmicroVMを起動させる準備の勉強はできたと思います。

参考

コメント

過去30日間に良く読まれた記事

miniPCのBMAXでWindows11のsecure boot設定漏れでトラブル発生

Windows95/98のPCゲームをUbuntu/LinuxMintの最新PCで楽しむ方法 ( KVM / Wine / dosbox-x / midi )

LinuxMint/ubuntuにWine 11導入を試しました ( LinuxMint 21.3 / 22.3 ubuntu 22.04 / 26.04 Wine 11.0 / 11.6 / 11.8 / 11.13 )