
अविश्वसनीय प्रक्रियाओं के लिए हल्के, सुरक्षित Linux सैंडबॉक्स। ब्राउज़र और सर्वर पर चलता है।
Vpod vpod क्या है?vpod एक हल्का, पोर्टेबल सैंडबॉक्स है जो एक अविश्वसनीय प्रक्रिया को तुरंत Linux वातावरण प्रदान करता है। यह RISC‑V आर्किटेक्चर का उपयोग करता है और पूरी तरह से WebAssembly के अंदर चलता है।
एक vpod WebAssembly में संकलित एक पूर्ण RISC‑V सिस्टम (RV64GC, सिंगल vCPU) चलाता है। इसके अंदर एक वास्तविक Linux कर्नेल वास्तविक यूज़रस्पेस के साथ बूट होता है, इसलिए शेल, टूल्स और डेमॉन सभी वास्तविक हार्डवेयर की तरह व्यवहार करते हैं।
स्नैपशॉट। शुरू से Linux बूट करने के बजाय, एक vpod स्नैपशॉट को पुनर्स्थापित करता है: एक सहेजी गई मशीन स्थिति (CPU रजिस्टर, RAM, फ़ाइल सिस्टम) जो बूट के तुरंत बाद कैप्चर की गई होती है। इसे पुनर्स्थापित करने में एक सेकंड से भी कम समय लगता है। सस्पेंड उल्टे क्रम में उसी तरह काम करता है, केवल गंदे मेमोरी पेज डिस्क पर वापस लिखे जाते हैं, इसलिए आप एक सैंडबॉक्स को रोक सकते हैं और बाद में उसे फिर से शुरू कर सकते हैं, यहाँ तक कि किसी अन्य प्रक्रिया से भी।
अग्रिम-समय अनुवाद। शुद्ध निर्देश-दर-निर्देश एमुलेशन धीमा है, और WebAssembly रनटाइम JIT को असंभव बना देता है। इसलिए स्नैपशॉट निर्माण समय पर, सबसे अधिक उपयोग होने वाले गेस्ट कोड पथ RISC‑V से नेटिव कोड में अनुवादित किए जाते हैं जो स्वयं WASM मॉड्यूल में संकलित होते हैं। रनटाइम पर एमुलेटर इन अनुवादित ब्लॉकों में डिस्पैच करता है जब गेस्ट कोड मेल खाता है, और जब नहीं मेल खाता तो इंटरप्रेटर पर वापस आ जाता है। यह CPU-बाउंड कार्यों पर लगभग 5x का लाभ देता है, पृथक्करण पर शून्य प्रभाव के साथ: अनुवादित कोड उसी MMU और मेमोरी जाँच से गुजरता है जैसे इंटरप्रेटेड कोड।
WASI सीमा। WASM घटक होस्ट से केवल WASI 0.2 के माध्यम से संवाद करता है। गेस्ट कभी भी होस्ट फ़ाइल डिस्क्रिप्टर, सॉकेट या मेमोरी नहीं देखता है: फ़ाइल सिस्टम एक्सेस स्पष्ट रूप से माउंट किए गए निर्देशिकाओं के माध्यम से होता है, और नेटवर्किंग घटक के अंदर एक यूज़र-मोड नेटवर्क स्टैक के माध्यम से होती है जो होस्ट से केवल साधारण आउटबाउंड सॉकेट माँगता है। बाकी सब कुछ (गेस्ट कर्नेल, प्रक्रियाएँ, मेमोरी) WASM लीनियर मेमोरी के अंदर रहता है और उसके साथ समाप्त हो जाता है।
G (सामान्य-उद्देश्य एक्सटेंशन)
C (संपीड़ित निर्देश) कोड आकार को 30% तक कम करता है, निर्देश प्राप्ति गति और मेमोरी दक्षता में सुधार करता है। यह हमारे मेमोरी-सीमित WASM वातावरण में पूर्ण Linux यूज़रस्पेस चलाते समय महत्वपूर्ण है।
[!NOTE] V (वेक्टर) एक्सटेंशन लागू नहीं किया गया है। RVV निर्देश एमुलेटेड RISC-V के रूप में निष्पादित होंगे; होस्ट CPU के लिए कोई SIMD पासथ्रू नहीं है। V जोड़ने से वेक्टराइज़्ड वर्कलोड के लिए किसी भी प्रदर्शन लाभ के बिना एमुलेशन ओवरहेड बढ़ जाएगा।
npm install @capsule-run/vpod
import { Sandbox } from "@capsule-run/vpod";
const sandbox = await Sandbox.create();
// कॉल के बीच स्थिति संरक्षित रहती है
await sandbox.commands.run("export API_KEY=secret");
const key = await sandbox.commands.run("echo $API_KEY");
console.log(key.stdout); // secret
// Python REPL — वेरिएबल बने रहते हैं
await sandbox.code.run("data = [1, 2, 3]");
const total = await sandbox.code.run("print(sum(data))");
console.log(total.text); // 6
await sandbox.close();
वही पैकेज ब्राउज़र टैब में चलता है, जहाँ स्नैपशॉट डिस्क के बजाय ऑरिजिन-प्राइवेट स्टोरेज में कैश किया जाता है।
[!IMPORTANT]
Sandbox.create()का पहला कॉल डिफ़ॉल्ट स्नैपशॉट (alpine) डाउनलोड करता है और यदि पहले से मौजूद नहीं है तो उसे स्थानीय रूप से कैश करता है।
pip install vpod
from vpod import Sandbox
# एक कमांड चलाएँ
sandbox = Sandbox.create()
result = sandbox.commands.run("whoami")
print(result.stdout) # root
sandbox.close()
# स्थायी सत्र — कॉल के बीच स्थिति संरक्षित
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 — वेरिएबल बने रहते हैं
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
curl -fsSL https://install.vpod.sh | sh
या PowerShell के माध्यम से इंस्टॉल करें (windows)
irm https://install.vpod.sh | iex
# एक स्नैपशॉट खींचें
vpod pull alpine:latest
# एक इंटरैक्टिव शेल शुरू करें
vpod
Vpod दस्तावेज़ीकरण पर जाएँ।
बग रिपोर्ट से लेकर नए डिवाइस समर्थन तक, योगदान का स्वागत है। कुछ भी महत्वपूर्ण बनाने से पहले चर्चा करने के लिए एक issue खोलें।
wasm32-wasip2 टारगेट के साथ: rustup target add wasm32-wasip2# एक बार: AOT स्टब उत्पन्न करें (एक नए क्लोन में कोई अनुवादित ब्लॉक नहीं होते)
./scripts/aot-stub.sh
# WASM घटक बनाएँ (लाइब्रेरी + CLI)। दोनों टियर को sdks/python/vpod/ में कॉपी करता है
./scripts/build-wasm.sh
# होस्ट CLI इंस्टॉल करें
cargo install --path crates/vpod
# Python SDK को डेव मोड में इंस्टॉल करें
pip install -e "sdks/python[dev]"
# TypeScript SDK बनाएँ। घटक को Python SDK निर्देशिका से उठाता है
cd sdks/typescript && npm install && npm run build
npm run build डिफ़ॉल्ट रूप से --tier aot का उपयोग करता है; CI --tier base पिन करता है। बिल्ड crates/ के अंतर्गत नवीनतम फ़ाइल से पुराने घटक को अस्वीकार कर देता है, इसलिए एमुलेटर को छूने के बाद ./scripts/build-wasm.sh को फिर से चलाएँ। एमुलेटर परिवर्तन केवल गेस्ट के माध्यम से सतह पर आता है, इसलिए एक पुराना घटक संकलित होता है और लगभग सब कुछ पास करता है।
CI हर PR पर इन्हें चलाता है, इसलिए पुश करने से पहले इन्हें चलाएँ:
cargo fmt --all -- --check # फ़ॉर्मेटिंग
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all # Rust परीक्षण
# Python SDK एकीकरण परीक्षण (WASM लाइब्रेरी की आवश्यकता है)
cp target/wasm32-wasip2/release/vpod_wasi_lib.wasm sdks/python/vpod/
pytest sdks/python/tests/ -v -m integration