photoncloud-monorepo/docs/por/T014-plasmavmc-firecracker/design.md
centra a7ec7e2158 Add T026 practical test + k8shost to flake + workspace files
- Created T026-practical-test task.yaml for MVP smoke testing
- Added k8shost-server to flake.nix (packages, apps, overlays)
- Staged all workspace directories for nix flake build
- Updated flake.nix shellHook to include k8shost

Resolves: T026.S1 blocker (R8 - nix submodule visibility)
2025-12-09 06:07:50 +09:00

213 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FireCracker Backend Design
**Date:** 2025-12-08
**Task:** T014 S1
**Status:** Design Complete
## Overview
FireCrackerはAWSが開発した軽量なmicroVMハイパーバイザーで、以下の特徴があります
- 高速な起動時間(< 125ms
- 低メモリオーバーヘッド
- セキュリティ重視最小限のデバイスモデル
- サーバーレス/関数ワークロードに最適
## FireCracker API
FireCrackerはREST API over Unix socketを使用しますデフォルトのソケットパスは `/tmp/firecracker.socket` ですが起動時にカスタマイズ可能です
### 主要エンドポイント
1. **PUT /machine-config**
- CPU数メモリサイズなどのマシン設定
- 例: `{"vcpu_count": 2, "mem_size_mib": 512, "ht_enabled": false}`
2. **PUT /boot-source**
- カーネルイメージとinitrdの設定
- 例: `{"kernel_image_path": "/path/to/kernel", "initrd_path": "/path/to/initrd", "boot_args": "console=ttyS0"}`
3. **PUT /drives/{drive_id}**
- ディスクドライブの設定rootfsなど
- 例: `{"drive_id": "rootfs", "path_on_host": "/path/to/rootfs.ext4", "is_root_device": true, "is_read_only": false}`
4. **PUT /network-interfaces/{iface_id}**
- ネットワークインターフェースの設定
- 例: `{"iface_id": "eth0", "guest_mac": "AA:FC:00:00:00:01", "host_dev_name": "tap0"}`
5. **PUT /actions**
- VMのライフサイクル操作
- `InstanceStart`: VMを起動
- `SendCtrlAltDel`: リブートACPI対応が必要
- `FlushMetrics`: メトリクスのフラッシュ
6. **GET /vm**
- VMの状態情報を取得
### API通信パターン
1. FireCrackerプロセスを起動jailerまたは直接実行
2. Unix socketが利用可能になるまで待機
3. REST API経由で設定を送信machine-config boot-source drives network-interfaces
4. `InstanceStart`アクションでVMを起動
5. ライフサイクル操作は`/actions`エンドポイント経由
## FireCrackerBackend構造体設計
```rust
pub struct FireCrackerBackend {
/// FireCrackerバイナリのパス
firecracker_path: PathBuf,
/// Jailerバイナリのパスオプション
jailer_path: Option<PathBuf>,
/// VMのランタイムディレクトリ
runtime_dir: PathBuf,
/// FireCracker API socketのベースパス
socket_base_path: PathBuf,
}
```
### 設定
環境変数による設定
- `PLASMAVMC_FIRECRACKER_PATH`: FireCrackerバイナリのパスデフォルト: `/usr/bin/firecracker`
- `PLASMAVMC_FIRECRACKER_JAILER_PATH`: Jailerバイナリのパスオプションデフォルト: `/usr/bin/jailer`
- `PLASMAVMC_FIRECRACKER_RUNTIME_DIR`: ランタイムディレクトリデフォルト: `/var/run/plasmavmc/firecracker`
- `PLASMAVMC_FIRECRACKER_KERNEL_PATH`: カーネルイメージのパス必須
- `PLASMAVMC_FIRECRACKER_ROOTFS_PATH`: Rootfsイメージのパス必須
- `PLASMAVMC_FIRECRACKER_INITRD_PATH`: Initrdのパスオプション
## VmSpecからFireCracker設定へのマッピング
### Machine Config
- `vm.spec.cpu.vcpus` `vcpu_count`
- `vm.spec.memory.size_mib` `mem_size_mib`
- `ht_enabled`: 常に`false`FireCrackerはHTをサポートしない
### Boot Source
- `vm.spec.boot.kernel` `kernel_image_path`環境変数から解決
- `vm.spec.boot.initrd` `initrd_path`環境変数から解決
- `vm.spec.boot.cmdline` `boot_args`デフォルト: `"console=ttyS0"`
### Drives
- `vm.spec.disks[0]` rootfs drive`is_root_device: true`
- 追加のディスクは`is_root_device: false`で設定
### Network Interfaces
- `vm.spec.network` 各NICを`/network-interfaces/{iface_id}`で設定
- MACアドレスは自動生成または`vm.spec.network[].mac_address`から取得
- TAPインターフェースは外部で作成する必要がある将来的に統合
## 制限事項とサポート状況
### FireCrackerの制限
- **Hot-plug**: サポートされない起動前の設定のみ
- **VNC Console**: サポートされないシリアルコンソールのみ
- **Nested Virtualization**: サポートされない
- **GPU Passthrough**: サポートされない
- **Live Migration**: サポートされない
- **最大vCPU**: 32FireCrackerの制限
- **最大メモリ**: 制限なし実用的には数GiBまで
- **Disk Bus**: Virtioのみ
- **NIC Model**: VirtioNetのみ
### BackendCapabilities
```rust
BackendCapabilities {
live_migration: false,
hot_plug_cpu: false,
hot_plug_memory: false,
hot_plug_disk: false,
hot_plug_nic: false,
vnc_console: false,
serial_console: true,
nested_virtualization: false,
gpu_passthrough: false,
max_vcpus: 32,
max_memory_gib: 1024, // 実用的な上限
supported_disk_buses: vec![DiskBus::Virtio],
supported_nic_models: vec![NicModel::VirtioNet],
}
```
## 実装アプローチ
### 1. FireCrackerClientREST API over Unix socket
QMPクライアントと同様にFireCracker用のREST APIクライアントを実装
- Unix socket経由でHTTPリクエストを送信
- `hyper`または`ureq`などのHTTPクライアントを使用
- またはUnix socketに対して直接HTTPリクエストを構築
### 2. VM作成フロー
1. `create()`:
- ランタイムディレクトリを作成
- FireCrackerプロセスを起動jailerまたは直接
- API socketが利用可能になるまで待機
- `/machine-config``/boot-source``/drives``/network-interfaces`を設定
- `VmHandle`を返すsocketパスとPIDを保存
2. `start()`:
- `/actions`エンドポイントに`InstanceStart`を送信
3. `stop()`:
- `/actions`エンドポイントに`SendCtrlAltDel`を送信ACPI対応が必要
- またはプロセスをkill
4. `kill()`:
- FireCrackerプロセスをkill
5. `status()`:
- `/vm`エンドポイントから状態を取得
- FireCrackerの状態を`VmState`にマッピング
6. `delete()`:
- VMを停止
- ランタイムディレクトリをクリーンアップ
### 3. エラーハンドリング
- FireCrackerプロセスの起動失敗
- API socketへの接続失敗
- 設定APIのエラーレスポンス
- VM起動失敗
## 依存関係
### 必須
- `firecracker`バイナリv1.x以上
- カーネルイメージvmlinux形式x86_64
- Rootfsイメージext4形式
### オプション
- `jailer`バイナリセキュリティ強化のため推奨
### Rust依存関係
- `plasmavmc-types`: VM型定義
- `plasmavmc-hypervisor`: HypervisorBackendトレイト
- `tokio`: 非同期ランタイム
- `async-trait`: 非同期トレイト
- `tracing`: ロギング
- `serde`, `serde_json`: シリアライゼーション
- `hyper`または`ureq`: HTTPクライアントUnix socket対応
## テスト戦略
### ユニットテスト
- FireCrackerClientのモック実装
- VmSpecからFireCracker設定へのマッピングテスト
- エラーハンドリングテスト
### 統合テスト(環境ゲート付き)
- `PLASMAVMC_FIRECRACKER_TEST=1`で有効化
- 実際のFireCrackerバイナリとカーネル/rootfsが必要
- VMのライフサイクルcreate start status stop deleteを検証
## 次のステップS2
1. `plasmavmc-firecracker`クレートを作成
2. `FireCrackerClient`を実装REST API over Unix socket
3. `FireCrackerBackend`を実装HypervisorBackendトレイト
4. ユニットテストを追加
5. 環境変数による設定を実装