HN 日本語サマリー

← 一覧へ戻る
プログラミング

ゼロからVMMを構築する、#0: BoxLiteがlibkrunを置き換える理由

Building a VMM from scratch, #0: Why BoxLite is replacing libkrun (blog.boxlite.ai)

4 pointsby dorianzheng0 コメント

要約

BoxLiteはAIエージェント向けのコンピューティング基盤であり、現在micro-VMの実行にlibkrunを使用しています。しかし、libkrunの機能制限(VMの終了ステータスが得られない、カーネルローディングの不安定さ、デバイス制限など)から、自社でVMMを開発することにしました。このシリーズでは、その開発プロセスを段階的に公開していきます。

全文翻訳

BoxLiteの各ボックスは独自のmicro-VM内で実行されており、現在そのVMはlibkrunによって管理されています。私たちはこれを、自社で開発するVMMに置き換えることにしました。このシリーズでは、その開発プロセスを公開していきます。 1. BoxLiteとは BoxLiteはAIエージェントのためのコンピューティング基盤です。ラップトップに組み込めるほど軽量でありながら、エージェントクラウドを支えるのに十分な弾力性を持っています。各ボックスはハードウェアで隔離されたmicro-VMであり、任意のOCIイメージを実行し、ターン間で状態を保持します。 図1. 1つのエンジンが2つの場所に: 組み込みのBoxLiteランタイムは、あなたのマシン上またはクラウドランナー上で、ボックスごとに1つのmicro-VMを起動します。そのmicro-VMを実行する部分がVMM、すなわち仮想マシンモニターです。このシリーズで扱うのはその部分です。 2. なぜlibkrunから始めたのか libkrunは「KVM(Linux)およびHVF(Apple Silicon上のmacOS)上で、プログラムが部分的に隔離された環境でプロセスを簡単に実行できるようにするダイナミックライブラリ」と説明されており、「シンプルなC API」の背後にあります。これはBoxLiteに適していました。デーモンではなくライブラリ: BoxLiteはルート権限やバックグラウンドサービスなしで、アプリケーションに組み込まれます。Linux上のKVMとmacOS上のHypervisor.frameworkのための単一APIです。ゲストカーネルは(libkrunfwとして)virtio-fs、virtio-blk、vsockと共に提供されます。libkrunは現在、BoxLiteがmacOSとLinux上でボックスを実行する方法です。 3. なぜ置き換えるのか libkrunは、自身が何でないかについて明確です。そのREADMEには、「汎用VMMになること」や「あらゆる種類のワークロードとの互換性を持つこと」は目標外であることがリストアップされています。BoxLiteのニーズはこれらの目標を超えました。 VMの実行結果。libkrunはプロセス自体を終了させるため、呼び出し元は終了ステータスを得られず、すべての起動失敗は-EINVALとして返されます。 共有ライブラリとしてのカーネル。libkrunfwはdlopenでロードされますが、これは一部のホストで壊れ続け、#1512にはその問題が6件リストアップされています。 デバイス。各ディレクトリボリュームは独自のデバイスを取得しますが、3つのデバイスでボックスがIrqsExhausted(#935)により起動に失敗します。 次に何が来るか。ホットプラグマウント、ライブリサイズ、AutoPause(#1003)のためのメモリ スナップショット、およびGPUはすべて、私たちが制御するVMMを必要とします。 私たちがしないことlibkrunのフォークまたはパッチ適用。新しいVMMがデフォルトになるまで変更されずに提供され、フォールバックとして1つのリリースにとどまり、その後削除されます。 汎用VMMの構築。BoxLiteのデバイスのみを使用して、プロセスごとに1つのVMを実行します。機密コンピューティング、ライブマイグレーション、Intel Macはスコープ外です。 コスト新しいVMMはmacOS 15以降が必要です。これはHypervisor.frameworkのカーネル内割り込みコントローラーのためです。macOS 12–14はカットオーバーまでlibkrunを維持します。 長い道のり: 最初のブート(M1)、次に実際のボックス(M2)、ボリューム(M3)、強化(M4)、そしてカットオーバー(M5)。 4. VMMはどのように機能するか、1画面で 図2. 1台のマシン内部。ランタイムはボックスごとにジェイルされたboxlite-shimをスポーンし、その中のVMMがmicro-VMを実行します。PROPOSEDは、このシリーズが置き換えるものをマークしています。 ハイパーバイザー(KVMまたはHypervisor.framework)は、CPU上でゲスト命令を実行します。VMMはその周りの通常のプロセスです。ゲストにメモリを提供し、vCPUを作成し、カーネルをロードし、すべてのデバイスをエミュレートします。その心臓部は1つのループです。 図3. vCPUが終了するまで実行し、終了を処理し、再び実行する。 最初に実行されたゲストは7バイトの長さでした: mov dx, 0x3f8 ; COM1 シリアルポート mov al, 'K' out dx, al ; KVMはVMMに終了します: ポート0x3f8、バイト'K' hlt その他すべては詳細であり、各詳細は本シリーズで一部を占めます。 ピース|何であるか|パート メモリ|ゲストRAMはホストメモリです。マッピングされていないアドレスはデバイスです|#1 終了|KVM、Hypervisor.framework、そして後にはWHPのための1つの終了契約|#2 停止|ゲストからvCPUを安全に引き抜く|#3 CPU状態|x86上のレジスタ、CPUID、MSR|#4 ブート|VMMはブートローダーです|#6 デバイス|最初にシリアル、RTC、リセット、次にvirtio|#7, #10–12 5. シリーズ 2026年10月11日現在のステータス。コードがマージされた後にのみパートが出力されるため、すべての主張はマージされたPRにリンクされています。 アーチ|パート|出荷時期 1. 最初の命令|あなたの最初のVMは7バイトです · #2 終了契約の設計から始める · #3 vCPUの停止が難しい部分 · #4 手作業によるx86 CPU状態 · #5 私たちが構築するカーネル|コードマージ済み 2. 最初のブート(M1)|あなたはブートローダーです · #7 退屈なデバイスから始める · #8 Apple Silicon上では、終了をデコードします · #9 1つのカーネル、3つのホスト|M1着陸 3. 最初のボックス(M2–M3)|ゼロからのvirtio · #11 ディスク、ソケット、ネットワーク · #12 ボリュームごとのvirtio-fsデバイス · #13 PID 1としての私たちのエージェント|M2–M3 4. 出荷(M4–M5)|ゲスト入力はホストをパニックさせない必要があります · #15 libkrunとの比較 · #16 libkrunの削除|M4–M5 M5以降メモリ スナップショット、ホットプラグマウント、GPU、独自のネットワークスタック 現状✅ KVM、Hypervisor.framework、そして後にはWindowsのための設計と1つのハイパーバイザー契約✅ KVM on x86_64: VM、メモリ、実行ループ、I/O完了、キック、ブートレジスタ、CPUID、MSR✅ x86_64用のLinux 6.12カーネルの再現可能なビルド⏳ M1: macOS arm64、Linux x86_64、Linux arm64での最初のブート、CIでチェック済み RSSフィードとGitHubの各PRでフォローしてください。 6. 私たちと一緒に構築しましょう BoxLiteはオープンソースであり、このVMMのすべてのステップも同様です。皆様の協力を歓迎します。 設計に異議を唱える。VMM設計ドキュメントを読み、どこが間違っているか教えてください。M1の作業を引き受けてください。#1698には、オープンなスライスとその依存関係(デバイス、カーネルローダー、Hypervisor.frameworkバックエンド、arm64 KVM、3ホストCI)がリストアップされています。 質問して議論する。GitHubイシューを開くか、Discordで見つけてください。CONTRIBUTING.mdから始めてください。最初のPRでは、コントリビューターライセンス契約への署名を求められます。 トピック/#virtualization#microvm#rust