
信頼できないプロセスを実行するための、軽量で安全なLinuxサンドボックス。ブラウザとサーバーの両方で動作します。
Vpod vpod とは何か?vpod は、信頼できないプロセスに即座の Linux 環境を提供する、軽量で移植性の高いサンドボックスです。RISC‑V アーキテクチャを使用し、完全に WebAssembly 内で動作します。
vpod は、WebAssembly にコンパイルされた完全な RISC‑V システム(RV64GC、シングル vCPU)を実行します。その内部で実際の Linux カーネルと実際のユーザー空間を起動するため、シェル、ツール、デーモンはすべて実ハードウェア上と同様に動作します。
スナップショット。 vpod は Linux をゼロから起動する代わりに、スナップショット(起動直後に取得した保存済みマシン状態:CPU レジスタ、RAM、ファイルシステム)を復元します。復元には 1 秒もかかりません。サスペンドもその逆の仕組みで動作し、ダーティなメモリページのみがディスクに書き戻されるため、サンドボックスを一時停止して、後で別のプロセスからでも再開できます。
事前翻訳(Ahead-of-time translation)。 純粋な命令単位のエミュレーションは低速であり、WebAssembly では実行時 JIT が使用できません。そのため、スナップショットのビルド時に、最もホットなゲストコードパスを RISC‑V からネイティブコードに翻訳し、それを WASM モジュール自体にコンパイルします。実行時、エミュレータはゲストコードが一致した場合にこれらの翻訳済みブロックへディスパッチし、一致しない場合はインタープリタにフォールバックします。これにより CPU バウンドな処理では約 5 倍の効果が得られ、分離性にはまったく影響しません。翻訳済みコードはインタープリタ実行コードと同じ MMU およびメモリチェックを通過します。
WASI 境界。 WASM コンポーネントは WASI 0.2 経由でのみホストと通信します。ゲストがホストのファイルディスクリプタ、ソケット、メモリを見ることはありません。ファイルシステムアクセスは明示的にマウントされたディレクトリを通り、ネットワーキングはコンポーネント内部のユーザーモードネットワークスタック(ホストに対してプレーンなアウトバウンドソケットのみを要求する)を通ります。その他すべて(ゲストカーネル、プロセス、メモリ)は WASM リニアメモリ内に存在し、それとともに消滅します。
G(汎用拡張)
C(圧縮命令) コードサイズを 30% 削減し、命令フェッチ速度とメモリ効率を向上させます。これは、メモリ制約のある WASM 環境内で完全な Linux ユーザー空間を実行する際に重要です。
[!NOTE] V(ベクトル)拡張は実装されていません。RVV 命令はエミュレートされた RISC-V として実行されます。ホスト CPU への SIMD パススルーはありません。V を追加するとエミュレーションのオーバーヘッドが増えるだけで、ベクトル化されたワークロードに対する性能上のメリットはありません。
pip install vpod
from vpod import Sandbox
# Run a command
sandbox = Sandbox.create()
result = sandbox.commands.run("whoami")
print(result.stdout) # root
sandbox.close()
# Persistent session — state preserved across calls
with Sandbox.create() as sandbox:
sandbox.commands.run("export API_KEY=secret")
result = sandbox.commands.run("echo $API_KEY")
print(result.stdout) # secret
# Python REPL — variables persist
with Sandbox.create() as sandbox:
sandbox.code.run("import requests")
sandbox.code.run("data = [1, 2, 3]")
result = sandbox.code.run("print(sum(data))")
print(result.text) # 6
[!IMPORTANT] 最初の
Sandbox.create()呼び出しで、デフォルトのスナップショット(alpine)がダウンロードされ、まだ存在しない場合はローカルにキャッシュされます。
curl -fsSL https://install.vpod.sh | sh
または PowerShell(Windows)でインストール
irm https://install.vpod.sh | iex
# Pull a snapshot
vpod pull alpine:latest
# Start an interactive shell
vpod
Vpod ドキュメント を参照してください。
バグ報告から新しいデバイスサポートまで、コントリビューションを歓迎します。実装する前に、重要な内容については イシュー を開いて相談してください。
wasm32-wasip2 ターゲット: rustup target add wasm32-wasip2# One-time: generate the AOT stub (a fresh clone has no translated blocks)
./scripts/aot-stub.sh
# Build the WASM component (library + CLI)
./scripts/build-wasm.sh
# Install the host CLI
cargo install --path crates/vpod
# Install the Python SDK in dev mode
pip install -e "sdks/python[dev]"
CI はすべての PR でこれらを実行するため、プッシュ前に実行してください:
cargo fmt --all -- --check # formatting
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all # Rust tests
# Python SDK integration tests (needs the WASM library in place)
cp target/wasm32-wasip2/release/vpod_wasi_lib.wasm sdks/python/vpod/
pytest sdks/python/tests/ -v -m integration
このプロジェクトは registry.vpod.sh の事前ビルド済み Alpine スナップショットを使用するため、通常はこれを実行する必要はありません。ローカルでビルドするには:
./scripts/build-default-snapshot.sh # dist/alpine-3.23.0-256mb.snap
./scripts/build-data-snapshot.sh # 512 MB variant with numpy/pandas/scipy
[!IMPORTANT] ローカルでビルドしたスナップショットを使用するには、
crates/vpod/src/main.rsのresolve_snapshot()内の行のコメントを解除してください。
スナップショットのビルドでは AOT パス(scripts/aot-snapshot.sh <snapshot>)も実行できます。これは代表的なワークロードをトレースし、ホットブロックを翻訳して、それらを組み込んだ状態でエミュレータを再ビルドします。時間がかかります。日常的な開発には aot-stub.sh のスタブで十分です。動作はすべて同じで、ただ遅いだけです。
fmt、clippy、テストスイートがすべてパスする必要があります(CI が 3 つすべてを強制します)。このプロジェクトは Apache License 2.0 の下でライセンスされています。 詳細は LICENSE ファイルを参照してください。