Gunosy Advent Calendar 2018、8日目の記事です。昨日の記事は キヴィタスポ(人工知能) (@Civitaspo) / Twitter さんの Digdag の Plugin をたくさん作ったので紹介するよ - Gunosy Tech Blog でした。
こんにちは、 今年のre:inventはTwitchライブで観戦した oota3 です。今年も新サービスがたくさん発表されましたね。 ちなみにそのあたりの記事は 鈴木 雄登 Yuto Suzuki (@mocyuto) / Twitter さんが書いてくださっています。
なかでも11月26日のMonday Night Liveで発表のあった、Firecrackerについて、Googleの中の人のTweetも含め、気になったので調べてみました。
Who developed Firecracker? Looks like there was an indirect collaboration between Google and Amazon that lead to a custom Virtual Machine Monitor (vmm) based on crosvm. https://t.co/Z8bDsCcni2 pic.twitter.com/VwKSWkfFsZ
— Kelsey Hightower (@kelseyhightower) 2018年11月27日
Firecrackerを開発したかって?crosvmをベースにしたカスタムvmmをGoogleとAmazonで間接的にコラボレーションしたようです。
crosvmとは?
ここhttps://chromium.googlesource.com/chromiumos/platform/crosvm からダウンロードして見ることができます。 コードを見た感じだとvmやホストOSとのやりとりに加えて、ChromeOSを安全に動かせる環境として作られているのか、GPUのレンダリングの扱いや、ディスプレイまわりの定義が入っています。この部分はFirecrackerにはないものです。
Firecrackerとは?
KVMを使用して、マイクロvmを起動できます。シングルコアのCPUと128MBのメモリで動作するとあります。(crosvmは256MBの1仮装CPUで動作するのでこのあたりは機能が最小限なのがわかります。)
サポートされている環境は EC2のUbuntu 18.04でi3.metal
なので動作させる場合には注意が必要です。
ざっくりと比較すると
firecrackerはAPI Endpointを持っています。
ほぼベースはcrosvmだが、最小限に留めている箇所もあります。sys_util(ファイルのフラグ、プロセス操作、ゲストアドレス、ゲストメモリ、UNIXシステムコール系、シグナルの定義など), vhost_backend(vhostベースのvirtioデバイスを設定するためのインタフェースの定義), virtio_gen(virtioまわりの設定, cで書かれたものをそのままバインド)などです。
jailの部分がcrosvmではminijailとして定義されており、firecrackerではjailerとして纏められています。
crosvmにはない、rate limitがあり、wake upイベントが現在100ミリ秒に制限 (Linux kernel's timerfdに基づいています。)
seccompはamazon独自でseccompフィルタリングのBPF命令よりも高いレベルのラッパーを実装しています。
loggingまわりがコンテナで使用することを想定して(?)crosvmと違い、書かれています。
fc_utilという、インスタンスIDのバリデートをかけるユーティリティがあります。
micro_http MMDS(型なしのjsonとして表されるMicrovmメタデータサービス)要求を解析のための最小限のhttpサービスの実装があります。
CPUをゲストに公開でき、AWSの場合はt2とc3のインスタンスであれば現状テンプレートが用意されています。
おわりに
筆者はあまり低レイヤーに詳しくないのですが、読んでみてカーネルとユーザ環境とのやりとりや構造に関してより理解できるようになったので時間があれば是非中身も読んでみると良いと思います。