
2026/10/15 3:21
Virtual Oxide Labs:完全な Oxide ラックのシミュレーション
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本稿の核心となるメッセージは、Oxide Product Assurance チームが、標準ソフトウェアを一切変更せずに、Voxel という高忠実度仮想環境全体でソフトウェアスタックを厳格にテストすることで、製品化における信頼性を保証することです。この「未変更コード」への厳格な adherence(遵守)により、テスト結果は実際のハードウェア上での実世界のパフォーマンスと正確に対応します。従来のシステムや特別な「テスト用バージョン」と異なり、このアプローチでは物理プロトタイプを各チェックに必要とするのではなく、ネットワークプロトコルやセキュリティチップなどの重要なコンポーネントに対して、高度なエミュレーターを用いて検証を行います。
Voxel は illumos オペレーティングシステム上で動作し、Rust を利用して複雑なスタックをエミュレートするとともに、Propolis による仮想化や SoftNPU によるネットワークシミュレーションといったツールを採用しています。純粋な物理ベースのテストからこれらの高度な仮想手法への移行により、現在は root of trust コンポーネントに対するマイクロコントローラーのシミュレーションが可能になっています。具体的には、Voxel は Cortex-M7 と Cortex-M33 デバイスをエミュレートし、単スレッド環境内で命令、時間、割り込みをシミュレートします。時間が経過した時間を基準とするのではなく命令数を基準とした時間エミュレーションロジックを改善することで、チームはエミュレーターのばらつきにかかわらず正確な速度会計を保証し、これにより企業がハードウェア導入に自信を持ち、継続的インテグレーションパイプラインを清潔かつ効率的に保つことができます。
最近の進展では、AMD Ryzen 9 9955HX プロセッサと 96GB の RAM を搭載した Minisforum MS-A2 ミニ PC が標準的なハードウェアであっても既に 6 つの仮想サーバーを実行できることが示されており、将来的な大規模なマルチラック構成の可能性を示唆しています。最適な動作を実現するため、Voxel は MPL 2.0 ライセンスの下で利用可能であり、少なくとも 16 スレッドと 64GB の RAM を持つ Helios OS 環境が必要です。時間が経過した時間を基準とするのではなく命令数を基準とした時間エミュレーションロジックを改善することで、チームはエミュレーターのばらつきにかかわらず正確な速度会計を保証し、これにより企業がハードウェア導入に自信を持ち、継続的インテグレーションパイプラインを清潔かつ効率的に保つことができます。
※注:元の要約の 2 段落最後の部分で「時間エミュレーション」に関する記述がやや重複していました。上記の改善版では、具体的な技術詳細(命令数や CPU モデルなど)を一貫した物語に統合するとともに、最後の繰り返しを修正し、ライセンス要件で結んでいます。
本文
Oxide ラックスケール開発のための「Voxel」とは?
🛑 開発における課題と解決策
ラックスケールハードウェアのテストへの障壁
- 入手性の低さ: 完成品は瞬く間に顧客のデータセンターへ送られ、開発チームが触れにくい。
- 公平性と合理性: Oxide プロダクト保証チームとしては、アクセス制限を「不公平」かつ「理にかなった」と捉える。
必要な対策(重要)
以下を**「テスト用リリース」を切り出すことなく**継続的インテグレーション(CI)プロセスと統合する必要があります:
- 🌐 多様な顧客のネットワークトポロジーの再現
- 🎮 実際に運用中のコントロールプレーンの動作検証
- 📦 ソフトウェア最新バージョンのテスト
- ⚙️ 自社製ハードウェア部品(スイッチ、マイコンコントローラー等)の代表動作
🏗️ テスト環境の構築戦略
1. 「ラックレット(Racklettes)」の活用
商業販売向けの製品とは異なる小型テスト用ラック。
- 構成: スレド 4 台、スイッチ 2 つ。
- 特徴:
- 本物のラックと同様の初期化・動作が可能。
- 商業的には不採算だが、テスト用途には極めて効果的。
- 現状保有数: 4 台(近々 8 台へ増備予定)。
- 活用方法: ハードウェアとソフトウェア要件のあらゆる組み合わせ検証に利用。
2. シミュレーション手法(Omicron)
- 詳細ドキュメント: 「How to Run Simulated」「The Full(er) How to Run Guide」参照。
- 機能: コントロールプレーンの大部分を、独立して・並行して・異なるシミュレーション下で動作させる。
🎲 Voxel(Virtual OXidE Labs)とは?
概念と歴史的背景
「Voxel」とは、単一ハードウェアユニットに詰めた莫大な忠実度を持つ仮想ラボです。
- 精神的後継者:以前の仮想ラボ「a4x2」の進化版。
- 名前の由来: 「Volume Element(体積要素)」+「Pixel(画素)」= 「Voxel」(ボキセル)。3 次元空間上の点を表す単位。
- プライム・ディレクティブ: Bryan Cantrill の提唱通り、ハッキングや改修なしに標準の Oxide ソフトウェアを使用する。
提供可能な忠実な構成
Rust 上構築された illumos ベースの完全なエミュレーションスタック:
- スレド仮想化: Propolis による管理。
- ネットワーク構成:
- Debian + FRR を用いた BGP(番号指定あり・なし)。
- 静的ネットワークリング。
- スイッチング: Oxide 独自のソフト NPU(SoftNPU)/ソフトウェア実装の P4 スイッチ。
- マイコン制御: サービスプロセッサ(SP)とトラストの根元(RoT)向けのシミュレーション/エミュレーション。
小規模環境での稼働例
自宅用ミニ PC(Minisforum MS-A2: Ryzen 9 9955HX / 96GB RAM)での検証結果:
- スレド数: 容易に 6 つ起動可能。
- 構成モード:
- 単一ラック形式。
- マルチラック構成(別々の 2 ラック+1 つの管理プレーン)。
- 必要条件: Oxide Helios OS、高速な NVMe ドライブのみ。
- 起動後約10 分で完全な Oxide ラックインフラストラクチャ(スイッチ含む)構築完了。
📦 イメージの作成手順
再利用可能なスナップショットを標準的プロセスで作成します。
スレドの種類
- 通常のスレド: gimlet(第 1 世代)、現在では cosmo。
- スクリメット(Scrimlet): サイドカー・スイッチに接続され、スイッチゾーンを実行。
作成フロー
- 「スレド」名義の仮想マシンを作成。
- コントロールプレーン(Omicron)をインストール。
- 構成直前時点でスナップショットを取得(「起動準備のあるスレド」完成)。
インストール方法の選択肢
- ソースコードから: GitHub の Omicron リポジトリをクローンし、ローカルソースを使用(開発時推奨)。
- TUF レポジトリから: The Update Framework (TUF) と Buildomat を用い、Tufaceous でパッケージ化されたリリースを使用。
コマンド例:TUF からのイメージ作成
以下のコマンドを実行すると、スレド構成の中核要素が抽出されます。
$ pfexec ./target/debug/voxel image create --from-tuf ../5d176e0be7e5cc0d3288c1bef10005ec31f2cd7c.zip 5d176e0be7e5cc0d3288c1bef10005ec31f2cd7c [voxel] TUF source ../5d176e0be7e5cc0d3288c1bef10005ec31f2cd7c.zip: system version 23.0.0-0.ci+git5d176e0be7e, omicron 5d176e0be7e [voxel] extracted 12 zones from ../5d176e0be7e5cc0d3288c1bef10005ec31f2cd7c.zip [voxel] extracted 3 measurement corpus artifacts [voxel] extracting host artifacts -> /export/home/helios/voxel-rawfix/target/debug/../../voxel-image/.tuf-host [voxel] host boot image 1258295296 bytes, phase 1 rom 33554432 bytes [voxel] extracted SP/RoT firmware -> /export/home/helios/voxel-rawfix/target/debug/../../voxel-image/.tuf-fw/ca9184058bd7
コントロールプレーンの準備完了
十分な展開・ステージングの後、VM が起動し、最終的なイメージ書き込みを行います。
[voxel] ready: voxel-cp version=unknown unpacked_artifacts=18 built=2026-09-06T21:37:58 [voxel] clearing device-instance map, halting [voxel] flushing, up to 25s [voxel] stopping hypervisor [voxel] writing voxel image voxel-cp-5d176e0be7e-tuf
結果: 生成されたのはZFS スナップショットであり、後ほどラック構築に再利用可能。
🚀 起動プロセス概要
既にコントロールプレーンがインストールされている状態でラックを起動します。必要な要素:
- "frr" イメージ: ネットワーク用 Debian VM。
- コントロールプレーンイメージ: 上記で作成したもの。
- voxel-init エージェント: 各仮想スレドへの割り当て管理。
主な手順と自動化
多くの複雑なステップがありますが、以下の流れで自動実行されます:
- 信頼材料の生成
- sprockets PKI の形式で証明書などを発行。
- ファームウェアのフラッシュ
- エミュレートされた STM32H753 および LPC55 マイコンコントローラーへ、Hubris ファームウェアをインストール。
- ネットワークトポロジースイート(Falcon)の起動
- SimNet と VNIC ペアを用いてトポロジー構築。
- スレド(g0, g1, g2 など)をステージング。
- Propolis VM の起動
- 6 つのスレド起動(3 つネットワーク駆動、3 つ Oxide スレド)。
- voxel-init の実行
- NAT およびアップリンクアドレスの設定。
- アンダーレイ設定構築。
- エミュレート起動ディスクへの M.2 パーティション配置。
- 5 つの U.2 データディスクラベリング。
- ホストフェーズ 2 イメージおよびインストールデータの種まき。
- スクリメットの割り当てとアイデンティティ記憶(スイッチエネフォアサー)。
- sled-agent の起動(コントロールプレーンの各スレド用設定層)。
- wicketd コメッショニング API への接続によるラック初期化完了。
注意点:
- 「エミュレートされたマイコンコントローラー」部分は、ハードウェアを別々のコードピースとして表現している点で真の再現とは異なりますが、他は完全に正しく動作します。
- プロダクション環境のように RoT で証明書が製造時に設定されていませんが、実行時間を妨げる影響はないため、当面はこの方式で運用可能です。
⚙️ サービスプロセッサ(SP)のエミュレーション技術
従来手法の限界
- 過去は SP の機能を返すためのスタブ構造「SpSim」を使用。
- しかしこれはシミュレーションに過ぎず、実際のテストケースにおける忠実度は不足していた。
新たなアプローチ:sp-emu(オープンソース)
illumos および Linux(x86/ARM)向けに、実際のCortex-M7およびCortex-M33デバイスをエミュレートするツール
sp-emu を開発。
- 機能:
- シングルスレッド内で動作。
- 「命令数」「時間」「割り込み」の 3 つを忠実に再現。
- Hubris ファームウェアを直接フラッシュ可能。
- 通信方法: Management Gateway Service (MGS) および IPCC を介した対話。
ハードウェアエミュレーションの工夫(重要)
シリコン上の動作を擬似的に実行するために、以下の工夫がなされています:
- 時間の扱い:
- エミュレータはウォールクロックを使用せず、Hubris の 1ms SysTick をスケジューリング基準にするため、時間を「命令数」に置き換える。
- 例外ハンドリング:
- Cortex-M コアでの例外発生からハンドラ開始までの間をモデル化。
関数がハードウェア動作をカバーする。self.exception_entry
代表的なコードパターン(時間処理)
if self.systick == 0 { self.systick = self.syst_rvr; } self.systick -= 1; if self.systick == 0 { self.systick = self.syst_rvr; self.tick_events = self.tick_events.wrapping_add(1); if self.syst_csr & 2 != 0 && self.mode == Mode::Thread && !self.primask { self.exception_entry(15, bus); // SysTick exception } }
プリエンプティブスケジューリングの実装
Hubris はプリエンプティブではないが、タスクのスケジューリングを実行するため、IRQ や PendSV を優先度に基づいて処理します。
if let Some(irq) = bus.next_irq() { if self.basepri == 0 || (bus.irq_prio(irq) as u32) < self.basepri { bus.clear_pending(irq); self.exception_entry(16 + irq as u32, bus); return; } } if bus.take_pendsv() { self.exception_entry(14, bus); }
主ループ構造(ハートビート)
すべての機能はこの無限ループによって駆動されます。
loop { cpu.step(&mut bus, host.as_mut())?; // 一つの Thumb-2 命令 cpu.maybe_tick(&mut bus); // SysTick: 時間は命令数 cpu.maybe_interrupt(&mut bus); // NVIC および PendSV デリバリー if cpu.cycles % 4096 == 0 { bus.pump_eth(host.as_mut()); // MGS パケット入出力 bus.pump_uart(host.as_mut()); } }
補足:
フィールド名は存在しますが、実際のサイクル時間ではなく**「ごまかす」ための計数値**です。cycles
💻 ユーザーエクスペリエンスと操作ツール
コネクティビティ管理 (voxel
コマンド)
voxel単一システムで多数のコンポーネントを動作させる場合、接続先や構成を理解しやすいよう、
voxel はコネクティビティツールとしても機能します。
スレドへの直接ログイン例
$ pfexec ./target/debug/voxel host login g0 [voxel] ssh root@192.168.68.167 (g0 global zone) The illumos Project helios-3.0.23976 May 2026 root@g0:~# zoneadm list global oxz_switch oxz_internal_dns_5b07f3e7-444c-462c-9633-6967e52d6a3b ...
スイッチゾーンへの接続(技術者ポート)
$ pfexec ./target/debug/voxel tp login switch0 [voxel] ssh root@192.168.68.167 -> zlogin oxz_switch (g0 switch0) [Connected to zone 'oxz_switch' pts/3] Last login: Sun Sep 6 22:17:52 from fdb0:a840:2500: The illumos Project helios-3.0.23976 May 2026 root@oxz_switch:~# tp
管理コマンドの拡張性
- イメージ管理(エクスポート/インポート、削除)。
- 設定変更(ネットワークトポロジー、スレドサイズ、マルチラック構成など)。
- 開発随伴により機能をさらに追加予定。
📥 ダウンロードと推奨環境
- ライセンス: MPL 2.0 下の配布可能です。
- OS 要件: Helios OS を実行する必要がある。
- 推奨ハードウェア:
- CPU: 16 コア以上。
- メモリ:64GB RAM 以上。
- ストレージ: オンボード DRAM 付き、プレミアム NVMe ドライブ。
Voxel を利用することで、本物のラックスケール機器に近い環境を低コストかつ高効率に構築・検証できます。