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を起動させる準備の勉強はできたと思います。
参考
[本ブログ内参照]
・Ubuntu/LinuxMintをJSTからUTCへtimezone変更する手順
・Ubuntu/LinuxMintをJSTからUTCへtimezone変更する手順
コメント
コメントを投稿