
نواة لينكس في مساحة المستخدم قائمة على JIT تدير الحاويات بشكل أصلي على macOS من Apple Silicon دون استخدام جهاز افتراضي. بديل مباشر لواجهة Docker Engine API مع عزل الحاويات، صور التراكب، ونشر المنافذ.
شغّل حاويات لينكس على macOS — دون آلة افتراضية.
dd يشغّل حاويات لينكس بشكل أصلي على macOS بمعمارية Apple Silicon دون آلة افتراضية. لا يوجد نواة لينكس ولا هايبرفايزر تحتها: JIT يترجم كود الحاوية ويخدم استدعاءات النظام لينكس في مساحة المستخدم (سلالة gVisor / PRoot). JIT هو نواة لينكس للضيف — فضاءات الأسماء، cgroups، طبقات الصورة overlays، والشبكات تُحتفظ بها كحالة في مساحة المستخدم. يتحدث واجهة Docker Engine API، لذا فإن سطر الأوامر العادي docker يقودها.
حوسبة الحاوية تعمل كتعليمات أصلية لـ Apple Silicon؛ فقط استدعاءات النظام الخاصة بها تُفسّر. لا آلة افتراضية للإقلاع، لا خفيّ داخل آلة افتراضية، لا تكلفة افتراضية.
الموقع والوثائق: https://ricccrd.github.io/dd/
make jit # build.rs compiles + codesigns the JITs
DD_IMAGES=/path/to/images cargo run -p dd-daemon # start the 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، يصنع أعلامها، ويخفض SSE/x87 إلى NEON (ثنائيات glibc تعمل)؛ وضيوف macOS arm64 (ddcli mac) — لا آلة افتراضية في أي منها..wh. whiteout، getdents مدمجة)، VFS سجن مسار خالٍ من TOCTOU، فضاءات أسماء PID / UTS / USER، netns loopback خاص مع نشر منفذ -p، وحدود cgroup للذاكرة والعمليات (OOM عند الحد).dd يُثبّت خفيّاً خلفياً لكل مستخدم وdocker context — كل شيء تحت ، أبداً .كل طريقة أخرى لتشغيل حاويات لينكس على ماك — Docker Desktop، Colima، Rancher، OrbStack — تُقلّع آلة افتراضية لينكس تحت هايبرفايزر وتشغّل الخفيّ داخلها. تلك الآلة الافتراضية ضريبة تدفعها طوال اليوم. dd يلغيها: الحاوية هي عملية ماك عادية تحدث استدعاءات نظامها بالصدف أن تُخدم بواسطة نواة لينكس في مساحة المستخدم.
المكسب هيكلي: حوسبة الضيف تعمل كـ تعليمات أصلية لـ Apple Silicon (لا طبقة افتراضية للأجهزة في المسار الساخن)، واختناق مشاركة الملفات الشهير في Docker-Desktop — جسر virtiofs/FUSE بين ماك والآلة الافتراضية — ببساطة غير موجود، لأن VFS الخاص بـ dd هو نظام ملفات المضيف خلف سجن مسار.
مقايضة صادقة: نواة مساحة المستخدم كاملة فقط بقدر استدعاءات النظام التي تنفذها، واليوم افتراضياً يعمل الضيف في عملية واحدة — سريع، والقرار الصحيح للكود الذي تثق به (بيئة التطوير، CI، أدواتك الخاصة). للكود غير الموثوق يوجد الآن انقسام حارس اختياري (
DDJIT_UNTRUSTED): يعمل الضيف في صندوق رمل Seatbolt يمنع افتراضياً بدون أي صلاحيات مضيف لنظام الملفات/الشبكة، بينما عملية حارس موثوقة تمتلك الموارد الحقيقية وتخدم استدعاءات النظام عبر حلقة ذاكرة مشتركة — شكل gVisor. لا يزال مبكراً (استدعاءات نظام الملفات الأساسية — read/write/open/close/lseek — توجّه اليوم؛ المقابس/exec/fork قيد التطوير)، لذا للكود المعادي بالكامل لا تزال الآلة الافتراضية تعرض سطحاً أضيق.
نفس ثنائي لينكس الثابت، يُشغّل بطريقتين على Apple M5 Pro (macOS 26.3): داخل آلة افتراضية لينكس (كيف تشغّل Docker القائمة على آلة افتراضية الحاويات) مقابل عبر JIT الخاص بـ dd على المضيف بدون آلة افتراضية. متوسط 7 (make bench). الوقت الأقل أفضل؛ "dd مقابل VM" > 1× يعني dd أسرع. حارة dd تدفع حتى ضريبة جسر عبر عملية صغيرة لا يدفعها التطبيق الحقيقي — لذا فهذه متحفّظة.
حاويات x86-64 — dd مقابل محاكاة آلة افتراضية (qemu-user؛ تشغيل x86 على Apple Silicon يعني ترجمتها في كلتا الحالتين). JIT الخاص بـ dd يتفوق على qemu في 9 من 10 أعباء العمل، بشكل كبير في الفاصلة العائمة:
حاويات aarch64 — dd مقابل آلة افتراضية أصلية (الآلة الافتراضية تشغّل arm64 بسرعة أصلية كاملة — أصعب معيار):
dd يشغّل حوسبة arm64 بسرعة أصلية — متقدماً في int sieve + mandelbrot، بتكافؤ في SHA-256، matmul، memcpy، n-body، و base64. الفجوات المتبقية هي عمل ثقيل في الفروع غير المباشرة / استدعاءات النظام — 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، لذا فإن ضريبة جسر الجري الصغيرة لكل تشغيل لا تذكر هنا.)
هذه معايير دقيقة للحوسبة — إنها لا تلتقط حتى المكاسب الهيكلية لـ dd (لا آلة افتراضية للإقلاع، لا ذاكرة مقيمة، إدخال-إخراج مباشر لنظام ملفات المضيف). جميع الأرقام مُقاسة، متوسط 7. كرّر: make bench.
الهدف هو التغلب على الآلة الافتراضية في كل معيار. dd يفوز بالفعل في كل عبء عمل x86-64 أعلاه ويتطابق أو يتفوق على arm64 الأصلي؛ حيث لا يزال متأخراً — SQLite arm64 الثقيل في استدعاءات النظام/تخصيص الذاكرة، واستخراج المزيد من مترجم x86 — هو بالضبط حدود التحسين (مُحسّن التتبع من المستوى الثاني وعمل أداء jit86). التكافؤ أو الأفضل في كل مكان هو المعيار.
dd يشغّل حاوية لينكس بكونه نواتها في مساحة المستخدم. JIT يترجم كود الآلة للضيف ويصطاد كل تعليمة استدعاء نظام؛ معالج الصيد — service() في dd-jit/src/runtime/os/linux/ — هو 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 # افتح الواجهة الرسومية
docker --context dd run alpine echo hi
dd يستهدف Apple-Silicon macOS (arm64، macOS 12+). JIT يحتاج إلى Xcode Command Line Tools (clang + codesign).
احصل على أحدث .dmg من صفحة الإصدارات، افتحه، واسحب dd إلى التطبيقات. ثم في الطرفية:
dd install # ~/.dd tree + per-user LaunchAgent + `docker context create dd`
dd app # افتح الواجهة الرسومية
dd doctor # تحقق من المقبس / الوكيل / السياق / حجر التطبيق
Gatekeeper: الـ DMG غير موقّع (مؤقت). عند التشغيل الأول، انقر بزر الماوس الأيمن على التطبيق → فتح، أو تشغيل
xattr -dr com.apple.quarantine /Applications/dd-app.app(dd doctorيكتشف هذا ويطبع الإصلاح).
xcode-select --install # clang + codesign
# ثبت Rust (المستقر) و Nix (لبيئة تطوير GTK4)
git clone https://github.com/ricccrd/dd && cd dd
make app # بناء + تجميع وتوقيع مؤقت 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. الحزمة تعيد توطين رسم بياني لـ dylib الخاص بـ GTK إلى Contents/Frameworks، وتجهّز بيانات تشغيل GTK، وتوقّع مؤقتاً من الداخل إلى الخارج.
مساحة عمل Cargo.
dd-jit/ — بيئة تشغيل JIT (C، تحت src/runtime/) بالإضافة إلى روابط Rust الخاصة بها.
build.rs يجمّع ويوقّع ثنائي JIT واحد لكل معمارية ضيف (aarch64, x86_64)؛
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؛ كل من الواجهة الرسومية و 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 (CI)
الحالات مُصرّحة في dd-tests/src/cases/. الحالة هي برنامج ضيف + تأكيدات؛ ضيوف aarch64 يُجمّعون فورياً (gcc -static-pie) ويُقارنون مع oracle أصلي، ضيوف x86-64 يأتون من تجهيزات مبنية مسبقاً. كل حالة تُشغّل على كل محرك لديها ضيف له.
clang + codesign (Xcode CLT).-p)، netns loopback خاص، حدود cgroup للذاكرة+العمليات، فضاءات أسماء UTS/PID/USER.docs/ للكتابات المفصلة.ريتشارد هوتا — [email protected]
MIT.
$HOMEsudo| dd — نواة مساحة مستخدم (JIT) | Docker القائم على آلة افتراضية (Desktop / Colima / …) |
|---|
| النموذج الأساسي | JIT يخدم استدعاءات نظام لينكس في مساحة المستخدم (سلالة gVisor) | نواة لينكس كاملة داخل آلة افتراضية تحت هايبرفايزر |
| الذاكرة المقيمة عند الخمول | لا شيء — لكل حاوية، تُحرر عند الخروج | غيغابايت محجوزة للآلة الافتراضية، دائماً قيد التشغيل |
| بدء التشغيل | إطلاق عملية — لا آلة افتراضية للإقلاع | إقلاع آلة افتراضية لينكس + الخفيّ داخلها أولاً |
| الربط-التركيب / إدخال-إخراج الملفات | نظام ملفات المضيف مباشر عبر سجن مسار | جسر virtiofs/gRPC-FUSE عبر حدود الآلة الافتراضية |
| نشر المنفذ | مباشرة إلى مقابس المضيف | عبر طبقة NAT/إعادة توجيه الآلة الافتراضية |
| تكلفة البطارية / الخلفية | لا شيء يعمل عندما لا توجد حاوية | آلة افتراضية خاملة وتستهلك البطارية |
| مساحة التوزيع والتصحيح | لا نواة لينكس — لا شيء لتتبّع CVEs | يوزّع ويصحّح ويتتبّع نواة لينكس كاملة |
| قابلية المراقبة | عملية ماك عادية — sample, debug, Activity Monitor | آلة افتراضية غير شفافة؛ عبء العمل غير مرئي لأدوات المضيف |
| عبء العمل | آلة افتراضية (qemu) | dd (بدون آلة افتراضية) | dd مقابل آلة افتراضية |
|---|
| float n-body | 5.39s | 0.23s | أسرع بـ 24× |
| mandelbrot | 7.81s | 0.83s | أسرع بـ 9.4× |
| matmul | 8.21s | 1.37s | أسرع بـ 6.0× |
| SQLite (600k rows) | 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×) |
| عبء العمل | آلة افتراضية (أصلية) | dd (بدون آلة افتراضية) | dd مقابل آلة افتراضية |
|---|
| 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 rows) | 0.36s | 0.62s | أبطأ بـ 1.71× |
SpawnConfigdd-tests/ — إطار اختبار تصريحي؛ الحالات تُشغّل عبر كل محرك مع تقرير مجمّع.dd-client/ — عميل صغير مكتوب لواجهة Docker-Engine-API عبر مقبس Unix الخاص بالخفيّ (المصدر الوحيد للحقيقة لصيغة الشبكة، مشترك بين الواجهة الرسومية وسطر الأوامر).dd-gui/ (ثنائي dd-app) — واجهة مستخدم سطح مكتب GTK4. تُبنى فقط على macOS عبر بيئة تطوير Nix.dd-cli/ (ثنائي dd) — سطح التثبيت/التحكم، كل ذلك بدون جذر.