Skip to content

ホワイトペーパー ​

このドキュメントでは、WSL Dashboard のアーキテクチャ設計、技術選定、および主要機能の基盤となる実装ロジックについて詳しく解説し、開発者や上級ユーザーに技術的な深い視点を提供します。

1. アーキテクチャ概要 ​

WSL Dashboard は、古典的な レスポンシブ UI 駆動 + 非同期バックエンドタスク アーキテクチャを採用し、Rust 言語の型システムと所有権モデルを活用して、メモリ安全性と高並行パフォーマンスを確保しています。

コアコンポーネント ​

  • Frontend (UI): Slint ベースの宣言型インターフェース。UI スレッドがレンダリングとユーザーインタラクションを担当します。
  • Backend (Runtime): Tokio ベースの非同期ランタイム。システムコマンド (CLI) の配信・実行、ファイル I/O、ネットワーク待ち受けを担当します。
  • Communication: UI スレッドと非同期タスクは Channel (MPSC) と Shared State (Arc/Mutex/RwLock) を介して、効率的かつスレッドセーフに通信します。

2. 技術選定の理由 ​

なぜ Rust なのか? ​

  • パフォーマンス: ゼロコスト抽象化、ネイティブマシンコードにコンパイルされ、GC による揺らぎがありません。
  • メモリ安全性: コンパイル時にバッファオーバーフローやデータ競合を排除します。これはディスク移行やネットワーク設定などシステムの低レベル操作に関わるツールにとって極めて重要です。
  • バイナリサイズ: すべての依存関係を静的リンクし、単一ファイルのポータブル実行可能プログラムを生成します。

なぜ Slint + Skia なのか? ​

  • 宣言型構文: インターフェースの記述とロジックが分離され、コードの保守が容易です。
  • Skia レンダリング: GPU アクセラレーション(Skia エンジン経由)を直接利用し、サブピクセルレベルの鮮明な文字と滑らかなアニメーション効果を提供します。
  • 低オーバーヘッド: Electron や WPF と比較して、Slint のランタイムオーバーヘッドは極めて小さいです。

3. 主要な技術実装 ​

3.1 WSL インスタンスの検出と解析 ​

アプリは wsl.exe --list --verbose を呼び出し、その出力を解析(UTF-16 エンコーディングを処理)して、インスタンスの状態をリアルタイムで取得します。

  • 低レベルデコード: 独自開発の効率的なエンコーディング/デコーダーにより、異なるロケール設定の Windows 環境でも出力を正しく解析できます。
  • 状態同期: 定時ポーリングと操作トリガーによる二重同期メカニズムを採用。

3.2 ディスクイメージ移行 (VHDX Move) ​

移行機能は WSL のインポート/エクスポートメカニズムを利用していますが、高度に抽象化され、アトミックに処理されます。

  • トランザクション保証: 移行開始前に、アプリはミューテックス (Mutex) で対象ディストリビューションをロックし、並行操作によるデータ破損を防止します。
  • 自動登録: 移行完了後、アプリは VHDX パスを自動的にリダイレクトしてディストリビューションを再登録するため、ユーザーの手動介入は不要です。

3.3 ポート転送とファイアウォールの自動化 ​

ネットワーク機能は単なる netsh interface portproxy の呼び出しではありません。

  • ルールライフサイクル管理: アプリは既存のファイアウォールルールを自動的に検出します。ユーザーが転送を作成すると、アプリは Windows API または CLI を利用して受信例外ルールを同期作成します。
  • IP 自動取得: wsl hostname -I の結果を解析し、ホストとインスタンス間の仮想ネットワーク IP を自動的にマッピングします。

3.4 USBIP 統合 ​

usbipd-win のコマンドラインインターフェースを利用します。

  • 権限昇格処理: バインド操作には管理者権限が必要で、バックエンドロジックは洗練された UAC 権限昇格要求の転送を実装しています。
  • 状態ステートマシン: 内部で USB デバイス接続の状態マシンを維持し、Attach/Detach プロセスの追跡可能性を確保します。

3.5 リソース監視と軽量化 ​

アプリは Windows ネイティブ API(GetProcessMemoryInfo など)を呼び出して、自身のリソース使用量を監視します。

  • 究極の軽量性: トレイのサイレントモードでは、アプリは不要な UI リソースを積極的に解放します。英語などの標準文字セットでは、メモリ使用量を 10MB まで抑えられます。中国語・日本語・韓国語などの複雑な文字セットでは、大きなフォントレンダリングキャッシュを読み込む必要があるため、約 38MB の使用量になります。

4. パフォーマンス最適化指標 ​

指標目標/実測最適化手段
起動速度< 500msSlint インターフェースをプリコンパイルし、ランタイム解析を削減。
基本メモリ (トレイ)~10MBバックグラウンドポーリング頻度を最小化し、必要に応じてレンダリングキャッシュを解放。
CPU 使用率 (静止時)< 0.1%Windows イベント駆動モデルを使用し、空ループのポーリングを回避。
レンダリングフレームレート60 FPSSkia GPU アクセラレーション、サブピクセルレベルのアンチエイリアシングレンダリング。

5. バックエンドタスク配信ロジック ​

UI の滑らかさを保証するため、すべての時間のかかる操作(VHDX のエクスポートなど)は非同期タスクで配信されます:

  1. リクエストのカプセル化: UI スレッドはユーザー操作を Command メッセージとしてカプセル化します。
  2. メッセージチャネル: tokio::sync::mpsc を介してバックエンドタスクプロセッサに送信します。
  3. 状態の返信: バックエンドタスクの完了後、コールバックまたは共有状態を介して UI を更新します。この設計により、数 GB のバックアップタスクを処理中でも、インターフェースがユーザーのクリックにリアルタイムで応答できます。

6. セキュリティへの配慮 ​

  • アトミック操作: 重要なインスタンスのアンインストールと移行に対して、事前検証を実装しています。
  • UAC 権限昇格管理: 必要な場合(USB デバイスのバインドなど)にのみ権限を要求し、最小権限の原則に従います。
  • ローカルストレージ: 設定はローカルの ~\.wsldashboard にのみ保存され、クラウド同期は一切行わず、ユーザーのプライバシーを保護します。