
JIT-आधारित यूज़रस्पेस लिनक्स कर्नेल जो बिना VM के Apple Silicon macOS पर मूल रूप से कंटेनर चलाता है। ड्रॉप-इन Docker Engine API प्रतिस्थापन जिसमें कंटेनर अलगाव, ओवरले इमेज और पोर्ट प्रकाशन शामिल है।
macOS पर Linux कंटेनर चलाएँ — बिना किसी VM के।
dd Apple-Silicon macOS पर बिना किसी वर्चुअल मशीन के मूल रूप से Linux कंटेनर चलाता है। इसके नीचे कोई Linux कर्नेल या हाइपरवाइज़र नहीं है: एक JIT कंटेनर के कोड का अनुवाद करता है और इसके Linux syscalls को userspace में सेवा प्रदान करता है (gVisor / PRoot वंशावली)। JIT ही अतिथि का Linux कर्नेल है — नेमस्पेस, cgroups, ओवरले इमेज लेयर और नेटवर्किंग को userspace स्थिति के रूप में बनाए रखा जाता है। यह Docker Engine API बोलता है, इसलिए सामान्य docker CLI इसे चलाता है।
कंटेनर का compute मूल Apple-Silicon निर्देशों के रूप में चलता है; केवल इसके syscalls की व्याख्या की जाती है। बूट करने के लिए कोई VM नहीं, VM में कोई डेमन नहीं, कोई वर्चुअलाइज़ेशन लागत नहीं।
वेबसाइट और दस्तावेज़: https://ricccrd.github.io/dd/
make jit # build.rs JITs को संकलित और कोडसाइन करता है
DD_IMAGES=/path/to/images cargo run -p dd-daemon # डेमन शुरू करें
export DOCKER_HOST=unix://$PWD/dd.sock
docker run -p 8080:80 -m 256m alpine sh -c 'echo hi from $(hostname)'
DOCKER_HOST को इसके सॉकेट पर इंगित करें और आपके मौजूदा docker run / ps / images / build कमांड बिना किसी बदलाव के काम करते हैं।jit86) के माध्यम से x86-64 Linux इमेज जो x86 को डिकोड करता है, इसके फ़्लैग्स को संश्लेषित करता है, और SSE/x87 को NEON पर कम करता है (glibc बाइनरी चलती हैं); और macOS arm64 अतिथि (ddcli mac) — इनमें से किसी में भी कोई VM नहीं।.wh. व्हाइटआउट, मर्ज किया गया getdents), एक TOCTOU-मुक्त पथ-जेल VFS, PID / UTS / USER नेमस्पेस, -p पोर्ट पब्लिशिंग के साथ एक निजी लूपबैक netns, और cgroup मेमोरी + pids सीमाएँ (सीमा पर OOM)।dd CLI एक प्रति-उपयोगकर्ता बैकग्राउंड डेमन और एक docker context स्थापित करते हैं — सब कुछ के अंतर्गत, कभी नहीं।Mac पर Linux कंटेनर चलाने का हर दूसरा तरीका — Docker Desktop, Colima, Rancher, OrbStack — एक हाइपरवाइज़र के नीचे एक Linux VM बूट करता है और उसके अंदर डेमन चलाता है। वह VM एक कर है जो आप पूरे दिन चुकाते हैं। dd इसे हटा देता है: एक कंटेनर एक सामान्य macOS प्रक्रिया है जिसके syscalls एक userspace Linux कर्नेल द्वारा सेवा किए जाते हैं।
जीत संरचनात्मक है: अतिथि का compute मूल Apple-Silicon निर्देशों के रूप में चलता है (हॉट पथ में कोई हार्डवेयर-वर्चुअलाइज़ेशन लेयर नहीं), और कुख्यात Docker-Desktop फ़ाइल-शेयरिंग अड़चन — macOS और VM के बीच virtiofs/FUSE ब्रिज — बस मौजूद नहीं है, क्योंकि dd का VFS है होस्ट फ़ाइल सिस्टम एक पथ जेल के पीछे।
ईमानदार समझौता: एक userspace कर्नेल केवल उतना ही पूर्ण है जितने कि वह syscalls लागू करता है, और आज डिफ़ॉल्ट रूप से अतिथि एक प्रक्रिया में चलता है — तेज़, और उस कोड के लिए सही कॉल जिस पर आप भरोसा करते हैं (आपका देव वातावरण, CI, आपके अपने टूल्स)। अविश्वसनीय कोड के लिए अब एक ऑप्ट-इन सेंट्री स्प्लिट है (
DDJIT_UNTRUSTED): अतिथि एक डिफ़ॉल्ट-अस्वीकार Seatbelt सैंडबॉक्स में चलता है जिसमें कोई होस्ट fs/net अधिकार नहीं है, जबकि एक विश्वसनीय sentry प्रक्रिया वास्तविक संसाधनों की मालिक है और एक साझा-मेमोरी रिंग — gVisor आकार — में syscalls की सेवा करती है। यह शुरुआती है (कोर फ़ाइल syscalls — read/write/open/close/lseek — आज आगे बढ़ते हैं; sockets/exec/fork आ रहे हैं), इसलिए पूरी तरह से शत्रुतापूर्ण कोड के लिए एक VM अभी भी एक संकीर्ण सतह उजागर करता है।
एक ही स्थैतिक Linux बाइनरी, दो तरीकों से चलाई गई एक Apple M5 Pro (macOS 26.3) पर: Linux VM के अंदर (VM-आधारित Docker कंटेनर कैसे चलाता है) बनाम dd के JIT के माध्यम से होस्ट पर बिना VM के। 7 का माध्य (make bench)। कम समय बेहतर है; "dd बनाम VM" > 1× का अर्थ है dd तेज़ है। dd लेन एक छोटा क्रॉस-प्रोसेस ब्रिज टैक्स भी चुकाता है जो वास्तविक ऐप नहीं करता — इसलिए ये रूढ़िवादी हैं।
x86-64 कंटेनर — dd बनाम VM एमुलेशन (qemu-user; Apple Silicon पर x86 चलाने का अर्थ है इसे अनुवाद करना किसी भी तरह से)। dd का JIT 10 में से 9 वर्कलोड पर qemu को हराता है, विशेष रूप से फ़्लोटिंग-पॉइंट पर नाटकीय रूप से:
aarch64 कंटेनर — dd बनाम एक मूल VM (VM arm64 को पूर्ण मूल गति पर चलाता है — सबसे कठिन बार):
dd arm64 compute को मूल गति पर चलाता है — int sieve + mandelbrot पर आगे, SHA-256, matmul, memcpy, n-body, और base64 पर समानता पर। शेष अंतर अप्रत्यक्ष-शाखा / syscall-भारी कार्य हैं — qsort (~1.3×), text-scan (~1.35×) और SQLite (~1.5×) — नवीनतम पासों द्वारा तेजी से कम किया गया (§B-off + चुराया गया x16/x17 SQLite को ~1.9× से ~1.5× पर ले गया)। बाकी को बंद करना (VDBE डिस्पैच) सक्रिय सीमा है; देखें docs/design/arm-sqlite-parity.md। (प्रत्येक वर्कलोड ≥0.45s चलने के लिए आकार दिया गया है, इसलिए हार्नेस का छोटा प्रति-रन ब्रिज टैक्स यहाँ नगण्य है।)
ये compute माइक्रो-बेंचमार्क हैं — वे dd के संरचनात्मक लाभों (बूट करने के लिए कोई VM नहीं, कोई निवासी RAM नहीं, प्रत्यक्ष होस्ट-फ़ाइलसिस्टम I/O) को भी कैप्चर नहीं करते हैं। सभी संख्याएँ मापी गईं, 7 का माध्य। पुनरुत्पादन: make bench।
लक्ष्य VM को हर बेंचमार्क पर हराना है। dd पहले से ही ऊपर प्रत्येक x86-64 वर्कलोड जीतता है और मूल arm64 से मेल खाता है या हराता है; जहाँ यह अभी भी पीछे है — syscall/आवंटन-भारी arm64 SQLite, और x86 अनुवादक से अधिक निचोड़ना — वही अनुकूलन सीमा है (टियर-2 ट्रेस ऑप्टिमाइज़र और jit86 प्रदर्शन कार्य)। हर जगह समानता-या-बेहतर बार है।
dd एक Linux कंटेनर को userspace में इसके कर्नेल होने के द्वारा चलाता है। एक JIT अतिथि की मशीन कोड का अनुवाद करता है और प्रत्येक syscall निर्देश को ट्रैप करता है; ट्रैप हैंडलर — dd-jit/src/runtime/os/linux/ में service() — है Linux syscall ABI, macOS होस्ट के विरुद्ध कार्यान्वित।
ld.so के माध्यम से गतिशील) और प्रारंभिक स्टैक का निर्माण करें।# 1. डेमन शुरू करें, docker को इस पर इंगित करें
make jit
DD_IMAGES=/path/to/images cargo run -p dd-daemon
export DOCKER_HOST=unix://$PWD/dd.sock
# 2. यह बस Docker है
docker run -p 8080:80 -m 256m alpine sh -c 'echo hi from $(hostname)'
docker ps
docker images
docker run --rm -it ubuntu bash
# 3. या स्थापित डेस्कटॉप ऐप के माध्यम से (प्रति-उपयोगकर्ता, कोई रूट नहीं)
dd install # LaunchAgent + docker context
dd app # GUI खोलें
docker --context dd run alpine echo hi
dd Apple-Silicon macOS (arm64, macOS 12+) को लक्षित करता है। JIT को Xcode Command Line Tools (clang + codesign) की आवश्यकता है।
नवीनतम .dmg को रिलीज़ पेज से प्राप्त करें, इसे खोलें, और dd को Applications में खींचें। फिर एक टर्मिनल में:
dd install # ~/.dd ट्री + प्रति-उपयोगकर्ता LaunchAgent + `docker context create dd`
dd app # GUI खोलें
dd doctor # सॉकेट / एजेंट / कॉन्टेक्स्ट / ऐप क्वारंटाइन जाँचें
गेटकीपर: DMG अहस्ताक्षरित (ad-hoc) है। पहले लॉन्च पर, राइट-क्लिक करें ऐप पर → Open, या चलाएँ
xattr -dr com.apple.quarantine /Applications/dd-app.app(dd doctorइसका पता लगाता है और फिक्स प्रिंट करता है)।
xcode-select --install # clang + codesign
# Rust (stable) और Nix (GTK4 देव शेल के लिए) स्थापित करें
git clone https://github.com/ricccrd/dd && cd dd
make app # बिल्ड + असेंबल & ad-hoc-साइन target/dd-app.app
make dmg # -> target/dist/dd-<ver>-<arch>.dmg
make install # Applications में कॉपी करें और `dd install` चलाएँ
make app/dmg Nix देव शेल (nix/flake.nix) के अंदर बंडलिंग चलाते हैं, जो GTK4 + dylibbundler / create-dmg प्रदान करता है। बंडल GTK dylib ग्राफ को Contents/Frameworks में स्थानांतरित करता है, GTK रनटाइम डेटा को स्टेज करता है, और आंतरिक→बाहरी ad-hoc-साइन करता है।
एक Cargo वर्कस्पेस।
dd-jit/ — JIT रनटाइम (C, src/runtime/ के अंतर्गत) साथ ही इसके Rust बाइंडिंग्स। build.rs प्रति अतिथि आर्किटेक्चर (aarch64, x86_64) एक JIT बाइनरी संकलित और कोडसाइन करता है; src/lib.rs Guest + टाइप किया गया SpawnConfig लॉन्च कॉन्ट्रैक्ट उजागर करता है। aarch64 अतिथि पूरी तरह से विघटित है (jit/ इंजन + os/linux/ व्यक्तित्व + frontend/aarch64/); x86-64 अतिथि (jit86) os/linux/ परत साझा करता है।dd-daemon/ — Docker Engine API डेमन। प्रत्येक इमेज के अतिथि आर्किटेक्चर को उसके ELF से पहचानता है, मिलान करने वाला JIT चुनता है, और इसे के माध्यम से लॉन्च करता है।डेमन ~/.dd/run/docker.sock पर सुनता है; GUI और docker --context dd दोनों इसका उपयोग करते हैं। स्थिति ~/.dd/state.json में बनी रहती है।
make test # इंजन × केस मैट्रिक्स, समूहीकृत रिपोर्ट
make test ENGINE=x86_64 # एक इंजन
make test FILTER=container # एक समूह / नाम से मेल खाने वाले मामले
cargo run -p dd-tests -- --list # समूह + मामले सूचीबद्ध करें
make test-ci # cargo-test पथ (CI)
मामले dd-tests/src/cases/ में घोषित किए गए हैं। एक मामला एक अतिथि प्रोग्राम + अभिकथन है; aarch64 अतिथि को मौके पर संकलित किया जाता है (gcc -static-pie) और एक मूल ओरेकल के विरुद्ध विभेदित किया जाता है, x86-64 अतिथि पूर्व-निर्मित फिक्स्चर से आते हैं। प्रत्येक मामला हर इंजन पर चलता है जिसके लिए उसके पास एक अतिथि है।
clang + codesign (Xcode CLT) की आवश्यकता है।-p), निजी-लूपबैक netns, cgroup मेमोरी+pids सीमाएँ, UTS/PID/USER नेमस्पेस।docs/ देखें।Richard Hutta — [email protected]
MIT।
$HOMEsudo| dd — userspace कर्नेल (JIT) | VM-आधारित Docker (Desktop / Colima / …) |
|---|
| अंतर्निहित मॉडल | एक JIT userspace में Linux syscalls की सेवा करता है (gVisor वंशावली) | हाइपरवाइज़र VM के अंदर एक पूर्ण Linux कर्नेल |
| निष्क्रिय होने पर निवासी RAM | कोई नहीं — प्रति-कंटेनर, बाहर निकलने पर मुक्त | गीगाबाइट्स VM के लिए आरक्षित, हमेशा चालू |
| स्टार्टअप | प्रक्रिया स्पॉन — बूट करने के लिए कोई VM नहीं | पहले एक Linux VM + VM-आंतरिक डेमन को बूट करें |
| बाइंड-माउंट / फ़ाइल I/O | पथ जेल के माध्यम से सीधा होस्ट फ़ाइल सिस्टम | VM सीमा के पार virtiofs/gRPC-FUSE ब्रिज |
| पोर्ट पब्लिशिंग | सीधे होस्ट सॉकेट पर | VM के NAT/फ़ॉरवर्डिंग लेयर के माध्यम से |
| बैटरी / बैकग्राउंड लागत | जब कोई कंटेनर नहीं चल रहा हो तो कुछ नहीं चल रहा | एक VM निष्क्रिय और बैटरी खत्म कर रहा है |
| शिप और पैच करने का पदचिह्न | कोई Linux कर्नेल नहीं — CVE-ट्रैक करने के लिए कुछ नहीं | एक पूर्ण Linux कर्नेल शिप, पैच और ट्रैक करता है |
| अवलोकनीयता | एक सामान्य macOS प्रक्रिया — sample, debug, Activity Monitor | एक अपारदर्शी VM; वर्कलोड होस्ट टूल्स के लिए अदृश्य है |
| वर्कलोड | VM (qemu) | dd (बिना VM) | dd बनाम VM |
|---|
| float n-body | 5.39s | 0.23s | 24× तेज़ |
| mandelbrot | 7.81s | 0.83s | 9.4× तेज़ |
| matmul | 8.21s | 1.37s | 6.0× तेज़ |
| SQLite (600k पंक्तियाँ) | 2.99s | 1.01s | 3.0× तेज़ |
| qsort | 3.91s | 1.68s | 2.3× तेज़ |
| memcpy | 2.40s | 1.10s | 2.2× तेज़ |
| text-scan (wc/grep) | 1.42s | 1.11s | 1.3× तेज़ |
| int sieve | 1.31s | 1.04s | 1.25× तेज़ |
| SHA-256 | 2.72s | 2.44s | 1.1× तेज़ |
| base64 | 4.28s | 5.39s | 0.79× (1.26× धीमा) |
| वर्कलोड | VM (मूल) | dd (बिना VM) | dd बनाम VM |
|---|
| int sieve | 0.75s | 0.48s | 1.58× तेज़ |
| mandelbrot | 0.79s | 0.77s | 1.03× तेज़ |
| matmul | 0.66s | 0.66s | ~समानता |
| memcpy | 0.55s | 0.56s | ~समानता |
| base64 | 0.68s | 0.68s | ~समानता |
| float n-body | 0.17s | 0.17s | ~समानता |
| SHA-256 | 0.80s | 0.82s | ~समानता |
| qsort | 0.83s | 1.10s | 1.33× धीमा |
| text-scan (wc/grep) | 0.51s | 0.68s | 1.35× धीमा |
| SQLite (600k पंक्तियाँ) | 0.36s | 0.62s | 1.71× धीमा |
SpawnConfigdd-tests/ — एक घोषणात्मक परीक्षण हार्नेस; मामले प्रत्येक इंजन में एक समूहीकृत रिपोर्ट के साथ चलते हैं।dd-client/ — डेमन के Unix सॉकेट पर एक छोटा टाइप किया हुआ Docker-Engine-API क्लाइंट (वायर फॉर्मेट के लिए एकल स्रोत सत्य, GUI और CLI द्वारा साझा)।dd-gui/ (बाइनरी dd-app) — एक GTK4 डेस्कटॉप UI। केवल Nix देव शेल के माध्यम से macOS पर निर्मित।dd-cli/ (बाइनरी dd) — स्थापना/नियंत्रण सतह, सभी बिना रूट के।