Firecrackerの実装を眺めた感想
はじめに
こんにちは。 id:ryotaway です。プログラマをしています。
この記事は Misoca+弥生+ALTOA Advent Calendar 2018 - Qiitaの20日目の記事です。 昨日は naoki_hayashi さんの「AWS ECS+EFSでwordpressサイト構築 - 弥生開発者ブログ」でした。
昨日の記事でもAWSが登場していますが、AWSのサービスって便利ですよね! 仕事でも大変お世話になっています。
この記事ではAWSで作られたFirecrackerについて書きます。
Firecrackerとはなにか
Firecrackerとは、2018/11/27に AWS re:Invent 2018で発表されたOSSで、LambdaやFargateの基盤として開発されたマイクロ仮想マシンだそうです。詳細については、 Firecracker や GitHub - firecracker-microvm/firecracker: Secure and fast microVMs for serverless computing. などをご覧ください。
Firecrackerとは爆竹という意味ですが、束になってるやつではなく爆竹1つをイメージしているのかなと思います。 仮想マシンの起動からユーザーコードの実行、仮想マシン終了までのライフサイクルを短時間でパッと実行するイメージを表しているのかなと思ったので、なるほどずいぶんと格好いい名前だなぁという印象を持ちました。
実装について
FirecrackerはRustで書かれてます。Rustは新しめなシステムプログラミング言語で、所有権や借用などの概念も盛り込んだプログラミング言語です。詳細は Rust programming language などをどうぞ。
Rustのコードや仮想マシンの実装に馴染みのない人がFirecrackerの実装を読むのは大変だとは思うのですが、せっかくOSSになっているのですから、プログラマはみんな読んだらいいんじゃないかなと思ってます。得るものがあるのではないかな。
この記事では仮装マシンの実装に慣れていない人のために、Firecrackerの実装を説明していきます。
と意気込んだものの
コード量はそれほど多くないのですが、説明をブログに書くとなるとかなり長く読みにくい記事になってしまい、「余白が足りない」といいたくなる気持ちが湧いてきます。なので、この記事ではざっくりとディレクトリごとにどんな機能が入っているのかをくらいの軽い説明にとどめようと思います。
すでにFirecrackerの実装を読んだ人や仮想マシンの実装に慣れた人には「ディレクトリやファイルの名前を見ればわかるよ!」程度のことしか書きませんが、ご了承くださいませ。
なお、調査対象は Firecracker release v0.12.0
のコードとしています。
(この記事を書いている時点での最新版です)
GitHub - firecracker-microvm/firecracker: Secure and fast microVMs for serverless computing.
以下から説明開始です。
- api_server
- firecrackerを使うときは、unix socketを使ってjson形式の設定を送信する必要があります
- 詳細は firecracker/getting-started.md at master · firecracker-microvm/firecracker · GitHub を参照すればわかります
- cpuid
- devices
- docs
- 資料が入っているディレクトリなので説明は省略します
- dumbo
- fc_util
- 時間関係のユーティリティが入ってます
- 実装がすごく小さいので説明は省略します
- 時間関係のユーティリティが入ってます
- jailer
- kernel
- firecrackerは起動後、ネットワークを介してvmlinux.binの場所やパラメータを指定します
- ここの実装では、受け取ったカーネルのイメージをメモリに展開したり、パラメータをvalidationしたりしているようです
- 実装をちょっと眺めただけで深掘りしていないので間違ってたらごめんなさい
- kvm
- kvm_gen
- 自動生成されている実装のようですが、生成器を見た方が良さそうなので読んでません
- logger
- みたまんまロガーなので説明は省略します
- memory_model
- 実装がすごい簡素なので読んだらわかります
- ゲストOSのアドレスをいじる実装が入ってます
- micro_http
- mmds
- コメントに
The Mmds is the Microvm Metadata Service represented as an untyped json.
って説明があります- ここに限らず、コメントが結構書かれているので理解の手助けになりますね
- 小さなデータストアです
- 実装自体は100行くらいの小さいものなので読めばわかります
- コメントに
- net_gen
- 自動生成されている実装のようなので生成器の側を読みたい
- なのでここは読んでません
- net_util
- macアドレスやtapを使って通信するための処理があります
- 小さいユーティリティで読みやすいかなと思います
- rate_limiter
- token bucketを使って処理をブロックしたり解除したりすることでリミッタをかけるんだそうです(コメント読んだだけ)
- へー、って感じです
- ファイルを眺めた感じだと、コメントに振る舞いがいっぱい書いてあるので読んで理解するのはそんなに大変じゃなさそうです
- コメントに
## limitation
ってあるのが面白いですね
- resources
- microvm-kernel-configというファイルがあります
- 単に自動生成されたコンフィグファイルですね
- seccomp
- システムコールを制限するためのフィルターを提供しています
- seccompはたくさん情報がインターネット上にあがっているので、理解するにはそれらを先に読むのがいいかなと思います
- src
- main.rsがあります
- ご存知?のとおり、一番上のレベルのメソッドなので、シーケンスを上から追いたい人はここから読むのがいいのかもしれません
- sys_util
- tests
- テスト
- tools
- devtoolとか入ってるところです
- devtoolはシェルスクリプトでした(最初はてっきりバイナリだと思ってました)
- vhost_backend
- なんですかね、これ
- vsockがらみっぽいので、vsockと通信するためにhost側に用意するもの?うーん
- vhost_gen
- 省略
- virtio_gen
- 省略
- vmm
- x86_64
- 仮装CPUのレジスタの保存・復元や、ページテーブルの設定・読み書きなど、CPU周りの処理が入ってます
- CPUの仕様を参照しながら読むのが良さそうです(けっして全ての仕様を理解してから実装を読もうとしないでください)
- 本当にツライので
だいぶ駆け足になりました。 説明を書こうとしたら感想文になってしまったのですが、別の機会にちゃんとした説明を書こうと思いますのでご容赦を。
おわりに
Firecrackerの実装のさわりの説明というか、さっと眺めた感想を書きました。 なんか、簡単そうだな、という印象を受けてもらえると嬉しいなと思ってますがいかがでしたでしょうか。
この記事は Misoca+弥生+ALTOA Advent Calendar 2018 - Qiitaの20日目の記事でした。 明日は ucho_yayoi さんが「UWSCでデスクトップアプリの自動テスト」について書くそうです。自動テストいいですね。楽しみです。
それでは。