# FireCracker Backend Configuration Schema

**Date:** 2025-12-08  
**Task:** T014 S1  
**Status:** Design Complete

## Environment Variables

### Required

- `PLASMAVMC_FIRECRACKER_KERNEL_PATH`: カーネルイメージのパス（vmlinux形式、x86_64）
  - 例: `/opt/firecracker/vmlinux.bin`
  - デフォルト: なし（必須）

- `PLASMAVMC_FIRECRACKER_ROOTFS_PATH`: Rootfsイメージのパス（ext4形式）
  - 例: `/opt/firecracker/rootfs.ext4`
  - デフォルト: なし（必須）

### Optional

- `PLASMAVMC_FIRECRACKER_PATH`: FireCrackerバイナリのパス
  - 例: `/usr/bin/firecracker`
  - デフォルト: `/usr/bin/firecracker`

- `PLASMAVMC_FIRECRACKER_JAILER_PATH`: Jailerバイナリのパス（セキュリティ強化のため推奨）
  - 例: `/usr/bin/jailer`
  - デフォルト: `/usr/bin/jailer`（存在する場合）

- `PLASMAVMC_FIRECRACKER_RUNTIME_DIR`: VMのランタイムディレクトリ
  - 例: `/var/run/plasmavmc/firecracker`
  - デフォルト: `/var/run/plasmavmc/firecracker`

- `PLASMAVMC_FIRECRACKER_SOCKET_BASE_PATH`: FireCracker API socketのベースパス
  - 例: `/tmp/firecracker`
  - デフォルト: `/tmp/firecracker`

- `PLASMAVMC_FIRECRACKER_INITRD_PATH`: Initrdイメージのパス（オプション）
  - 例: `/opt/firecracker/initrd.img`
  - デフォルト: なし

- `PLASMAVMC_FIRECRACKER_BOOT_ARGS`: カーネルコマンドライン引数
  - 例: `"console=ttyS0 reboot=k panic=1 pci=off"`
  - デフォルト: `"console=ttyS0"`

- `PLASMAVMC_FIRECRACKER_USE_JAILER`: Jailerを使用するかどうか
  - 値: `"1"` または `"true"` で有効化
  - デフォルト: `"true"`（jailerバイナリが存在する場合）

## Configuration Structure (Rust)

```rust
pub struct FireCrackerConfig {
    /// FireCrackerバイナリのパス
    pub firecracker_path: PathBuf,
    /// Jailerバイナリのパス（オプション）
    pub jailer_path: Option<PathBuf>,
    /// VMのランタイムディレクトリ
    pub runtime_dir: PathBuf,
    /// FireCracker API socketのベースパス
    pub socket_base_path: PathBuf,
    /// カーネルイメージのパス（必須）
    pub kernel_path: PathBuf,
    /// Rootfsイメージのパス（必須）
    pub rootfs_path: PathBuf,
    /// Initrdイメージのパス（オプション）
    pub initrd_path: Option<PathBuf>,
    /// カーネルコマンドライン引数
    pub boot_args: String,
    /// Jailerを使用するかどうか
    pub use_jailer: bool,
}

impl FireCrackerConfig {
    /// 環境変数から設定を読み込む
    pub fn from_env() -> Result<Self, Error> {
        // 実装...
    }

    /// デフォルト設定を作成
    pub fn with_defaults() -> Result<Self, Error> {
        // 実装...
    }
}
```

## Configuration Resolution Order

1. 環境変数から読み込み
2. デフォルト値で補完
3. 必須項目（kernel_path, rootfs_path）の検証
4. バイナリパスの存在確認（オプション）

## Example Usage

```rust
// 環境変数から設定を読み込む
let config = FireCrackerConfig::from_env()?;

// またはデフォルト値で作成（環境変数で上書き可能）
let config = FireCrackerConfig::with_defaults()?;

// FireCrackerBackendを作成
let backend = FireCrackerBackend::new(config);
```

## Validation Rules

1. `kernel_path`と`rootfs_path`は必須
2. `firecracker_path`が存在することを確認（起動時に検証）
3. `jailer_path`が指定されている場合、存在することを確認（起動時に検証）
4. `runtime_dir`は書き込み可能である必要がある
5. `socket_base_path`の親ディレクトリは存在する必要がある
