أعماق الافتراضيّة في Windows(الجزء 3)── آلات افتراضيّة تقلع في ثوانٍ: لماذا WSL2 وWindows Sandbox والحاويات خفيفة هكذا

· · Windows, الافتراضيّة, WSL2, Windows Sandbox, الحاويات, Hyper-V

عندما تُنشئ آلة افتراضيّة Windows في Hyper-V Manager، يستغرق بدؤها عشرات الثواني وتحتكر عدّة غيغابايت من الذاكرة. لكن على الحاسوب نفسه، كتابة wsl تُرجع صدفة Linux خلال بضع ثوانٍ، ويفتح Windows Sandbox سطح مكتب قابلاً للرمي في بضع ثوانٍ أيضاً.1

كلاهما يستند إلى hypervisor Windows نفسه (الجزء 1، «أين يعمل Windows فعليّاً؟»). في الجزء 2 رأينا أنّ هذا الأساس يستطيع إنشاء عزل أقوى من النواة. فلماذا أحدهما ثقيل والآخر خفيف؟

السؤال الذي يجيب عنه الجزء الأخير من السلسلة واحد فقط.

الآلات الافتراضيّة الكاملة ثقيلة ── فلماذا WSL2 وWindows Sandbox خفيفان هكذا؟

القرّاء المستهدَفون مطوِّرون ومشغِّلون يستخدمون WSL2 وWindows Sandbox وحاويات Windows للتطوير والتحقّق، ويريدون فهم خفّتها وقيودها من الآليّات صعوداً. المتطلّبات هي Windows 10/11؛ المرور بقسم Windows Sandbox يتطلّب إصدار Pro أو Enterprise أو Education (Home وWindows Server لا يملكان هذه الميزة). معرفة الخلفيّة هي مفهوم الأقسام من الجزء 1. الصعوبة متوسّطة.

1. الخلاصة أوّلاً

تُبقي آلة افتراضيّة خفيفة خطّ العزل(نواة مخصَّصة وحدّ hypervisor)وتخفِّف «نسخة نظام تشغيل ضيف كاملة». يشارك Sandbox Windows المضيف نفسه؛ ويستبدل WSL2 الضيف بـ Linux صغير مبنيّ لغرضه؛ وفي الحالتين ليست الذاكرة حجزاً ثابتاً بل إعارة واستعارة ديناميّة مع المضيف.

مصدر ثقل آلة افتراضيّة كاملة ليس العزل نفسه بل التكرار. صورة نظام تشغيل أخرى على القرص، صفحات بقدر نظام تشغيل آخر في RAM، وإقلاع كامل آخر في كلّ مرّة تبدأ. تقطع الآلات الافتراضيّة الخفيفة ذلك التكرار بسياستين: «شارك ما هو آمن للمشاركة» (Sandbox) و«إن لم تستطع مشاركته، أعد بناءه صغيراً» (WSL2).

ثلاثة أنواع من المشاركة تدعم الآلات الافتراضيّة الخفيفةصورة نظام التشغيل التي كانت آلة افتراضيّة كاملة تكرِّرها تُقطَع بالمشاركة في Sandbox وبالتقليص في WSL2؛ الذاكرة التي هي تخصيص ثابت افتراضيّاً(الذاكرة الديناميّة هي الاستثناء)تصبح إعارة واستعارة ديناميّة مع المضيف؛ يُستبدَل البدء بنواة خفيفة وإعداد أدنى؛ حدّ العزل وحده يبقىيُستبدَل بـيُستبدَل بـيُستبدَل بـآلة افتراضيّة كاملة: تكرارالقرص: نسخة صورة نظام تشغيلذاكرة أم بدء؟الذاكرة: ثابت افتراضيّاًالبدء: إقلاع كاملمشاركة(Sandbox)أو تقليص(WSL2)إعارة ديناميّة من المضيفنواة خفيفة + أدنى

الشكل 1: هيكل الجواب على «الـ hypervisor نفسه، ومع ذلك خفيف» هو أنّهم توقّفوا عن التكرار، لا عن العزل.

أدناه ننظر إلى WSL2 وWindows Sandbox والحاويات بهذا الترتيب، وإلى أيّ نوع من التكرار يقطعه كلّ منها.

2. ما الذي تحمله آلة افتراضيّة كاملة

كخطّ أساس للمقارنة، إليك ما تحمله آلة افتراضيّة تقليديّة.

  • صورة نظام تشغيل مستقلّة. تحتفظ بكلّ ملفّات نظام تشغيل الضيف داخل قرص افتراضيّ. حتّى إن كان للمضيف Windows نفسه، لا يشاركه.
  • تخصيص ذاكرة خشن. افتراضيّ آلة افتراضيّة تقليديّة هو تخصيص ذاكرة المضيف بحجم ثابت. آليّات مثل Hyper-V Dynamic Memory تستطيع تنمية التخصيص وانكماشه ضمن نطاق مضبوط، لكن وسائل التكيّف مع تغيّرات الطلب محدودة.2
  • إقلاع كامل عامّ الغرض. يبدأ البرنامج الثابت ومحمِّل الإقلاع ومجموعة الخدمات بالتسلسل نفسه كما على جهاز فيزيائيّ.
الأحمال الثلاثة التي تحملها آلة افتراضيّة كاملةتحمل آلة افتراضيّة كاملة صورة نظام تشغيل مستقلّة، وتخصيص ذاكرة ثابت افتراضيّاً، وإقلاعاً كاملاً عامّ الغرض، وتظهر تلك تكاليف في القرص وRAM وزمن البدءآلة افتراضيّة كاملةصورة نظام تشغيل مستقلّةذاكرة أم إقلاع؟ذاكرة ثابتة افتراضيّاًإقلاع عامّ الغرضقرص إضافيّ لنسخةتحتجز RAM غير مستخدَمة أيضاًيستغرق عشرات الثواني

الشكل 2: تفصيل تكلفة آلة افتراضيّة كاملة يُدفَع لا للعزل بل للعموميّة والتكرار.

هذه ليست عيوباً؛ إنّها ثمن العموميّة أنّ «يمكنك وضع أيّ شيء في الضيف». لاستخدام مثل تشغيل Linux قديم بجانب Windows Server، تلك العموميّة هي القيمة. لكن لاستخدام مثل «أريد تشغيل نظام التشغيل نفسه (أو مقرَّر) كالمضيف، الآن، للتطوير أو التحقّق»، معظمها أمتعة مهدورة. تضع الآلات الافتراضيّة الخفيفة تلك الأمتعة جانباً بتضييق الغرض.

3. WSL2 ── آلة افتراضيّة خدميّة بنواة مبنيّة لغرضها

3.1. البنية: آلة افتراضيّة مُدارة والتوزيعات داخلها

WSL2 آليّة تشغِّل نواة Linux أصيلة داخل آلة افتراضيّة خدميّة خفيفة.3 ثمّة ثلاث نقاط.

  • النواة أصيلة، لكنّها منتج متخصِّص. هي نواة Linux تبنيها Microsoft من فرع Stable، مضبوطة أصلاً حجماً وأداءً لـ WSL2. على المعيار الحاليّ، WSL الموزَّع عبر Microsoft Store، تُحدَّث النواة مع حزمة WSL نفسها وتُطبَّق بـwsl --update (على التوزيع الأقدم داخل الصندوق كانت تأتي عبر Windows Update).4 لأنّها نواة أصيلة، توافق استدعاءات النظام كامل، وتعمل أدوات مثل Docker كما هي.
  • الآلة الافتراضيّة خلف الكواليس. إنشاء الآلة الافتراضيّة وبدءها وإيقافها تديره WSL؛ المستخدم يفتح صدفة فحسب. لا شاشة إعدادات آلة افتراضيّة ولا انتظار إقلاع ملموس.4
  • التوزيعة حاوية داخل الآلة الافتراضيّة. تعمل توزيعات مثل Ubuntu وDebian حاويات معزولة داخل آلة افتراضيّة مُدارة واحدة. تشارك مساحة أسماء الشبكة والنواة، بينما تُفصَل مساحات أسماء مثل PID وmount وuser.3
معماريّة WSL2يجلس Windows مضيف وآلة افتراضيّة خدميّة خفيفة جنباً إلى جنب على الـ hypervisor؛ تعمل نواة Linux تبنيها Microsoft داخل الآلة الافتراضيّة؛ وتعمل كلّ توزيعة حاويةً معزولة داخل ذلكInterop(أوامر، ملفّات، شبكة)الـ hypervisorWindows المضيفآلة افتراضيّة خدميّة خفيفةنواة Linux(بناء Microsoft؛ تُحدَّث بـ wsl --update)Ubuntu(حاوية)Debian(حاوية)

الشكل 3: جواب «هل WSL2 آلة افتراضيّة؟» هو «نعم، لكن آلة افتراضيّة مُدارة خلف الكواليس»، وحتّى إن ثبَّتَّ عدّة توزيعات ما زالت ثمّة آلة افتراضيّة واحدة.

لحظة كتابة wsl، يبدو الجانب الخلفيّ هكذا.

من تشغيل أمر wsl إلى عودة صدفة في بضع ثوانٍإن لم تكن الآلة الافتراضيّة الخدميّة تعمل عند تنفيذ wsl، تبدأ الآلة الافتراضيّة الخفيفة ونواة Linux؛ إن كانت تعمل أصلاً يُعاد استخدامها؛ وتعود صدفة داخل حاوية التوزيعةلانعمشغِّل wslهل الآلة الافتراضيّة الخدميّة تعمل أصلاً؟ابدأ الآلة الافتراضيّة الخفيفة ونواة Linux(بضع ثوانٍ)أعد استخدام الآلة الافتراضيّة العاملةتعود صدفة داخل الحاوية

الشكل 4: الانتظار هو بدء آلة افتراضيّة أدنى فقط، وهنا يظهر وضع أمتعة الإقلاع الكامل جانباً.

3.2. إدخال/إخراج الملفّات: الجانب الذي تضعه فيه يجعله شيئاً مختلفاً

الموضوع الذي يظهر دائماً في حديث أداء WSL2 هو أين تضع الملفّات.

  • عمليّات الملفّات في جانب Linux (القرص الافتراضيّ ext4) سريعة. ذلك لأنّ نواة Linux تتحدّث إلى نظام ملفّاتها مباشرةً، وقد أُبلِغ عن تسريعات تصل إلى 20 ضعفاً مقابل WSL1 لاستخراج tarball، و2–5 أضعاف لـgit clone وnpm install.4
  • عمليّات الملفّات في جانب Windows (/mnt/c وما شابه) تصبح بطيئة لأنّها تمرّ بمشاركة ملفّات تعبر حدّ نظام تشغيل. أداء نظام الملفّات عبر أنظمة التشغيل هو البند الكبير الوحيد الذي يكون فيه WSL2 أسوأ من WSL1.4

لذا القاعدة هي: «ضع ملفّات المشروع في جانب نظام التشغيل نفسه الذي تستخدمه الأدوات التي تعمل عليها».4 مستودع تتعامل معه بأدوات بناء Linux يذهب إلى جانب Linux؛ حلّ تبنيه في Visual Studio يذهب إلى جانب Windows.

تفرع مسارات إدخال/إخراج ملفّات WSL2الوصول إلى القرص الافتراضيّ ext4 في جانب Linux مباشر من نواة Linux ولذلك سريع؛ الوصول إلى ملفّات جانب Windows يمرّ بمشاركة تعبر حدّ نظام تشغيل ولذلك بطيءجانب Linux(home وغيرها)جانب Windows(/mnt/c وغيرها)عمليّات ملفّات داخل WSL2في أيّ جانب الملفّ؟إدخال/إخراج مباشر إلى قرص ext4 الافتراضيّعبر مشاركة تعبر حدّ نظام تشغيلسريع(أمثلة تصل إلى 20 ضعفاً مقابل WSL1)يميل إلى البطءالإصلاح: ضع الملفّ على نظام التشغيل الذي يستخدمه

الشكل 5: ما هو بطيء هو المسار، لا WSL2، لذا تغيير أين تضع الملفّات غالباً يجعل مشكلة الأداء تختفي.

3.3. الذاكرة: تنمو، وتنكمش، لكنّها لا تعيد كلّ شيء دائماً

استخدام ذاكرة WSL2 (تراه عمليّة vmmem في مدير المهام) ليس حجزاً ثابتاً؛ إنّه ينمو وينكمش مع الاستخدام. الذاكرة التي أطلقتها العمليّات تُعاد تلقائيّاً إلى Windows تحت إعداد pageReporting، المفعَّل افتراضيّاً.5 الصفحات المحتفَظ بها ذاكرة تخزين مؤقّت للملفّات كانت لا تعود إلى Windows حتّى تخرج الآلة الافتراضيّة.4 في WSL الحاليّ، إعداد .wslconfig التجريبيّ autoMemoryReclaim (الافتراضيّ هو dropCache) يستعيد التخزين المؤقّت تلقائيّاً أيضاً.5 في بيئات يكون فيها هذا الإعداد disabled، أو على WSL أقدم، يمكن أن يبقى تخزين مؤقّت جلسة طويلة حتّى تخرج الآلة الافتراضيّة ويضغط ذاكرة المضيف.

كيف تنمو ذاكرة WSL2 وتنكمش وتُعادنموّ الطلب داخل WSL2 يرفع استخدام ذاكرة الآلة الافتراضيّة؛ الصفحات التي أطلقتها العمليّات تُعاد إلى Windows تحت pageReporting المفعَّل افتراضيّاً؛ يستعيد autoMemoryReclaim التخزين المؤقّت للملفّات تلقائيّاً افتراضيّاً؛ لكن على إعداد معطَّل أو WSL أقدم يبقى حتّى تخرج الآلة الافتراضيّة، وwsl --shutdown يعيد كلّ شيءأطلقتها عمليّة(عندما pageReporting مفعَّل)محتفَظ بها تخزيناً مؤقّتاً للملفّاتينمو طلب الذاكرة داخل WSL2ينمو استخدام vmmemهل أُطلِقت تلك الصفحة؟تُعاد تلقائيّاً إلى Windowsيستعيدها autoMemoryReclaim تلقائيّاً(افتراضيّ)على إعداد معطَّل أو WSL أقدم، تبقى حتّى تخرج الآلة الافتراضيّةwsl --shutdown يعيد كلّ شيء

الشكل 6: ما يبدو «لم تتوقّف عن النموّ» هو أساساً التخزين المؤقّت (وعندما يكون pageReporting معطَّلاً، الصفحات التي أطلقتها العمليّات أيضاً)، فاعرف مسار الإعادة قبل أن تقرِّر أنّه تسرّب.

إذا أردت حدّاً أعلى صريحاً، يمكن لـ%UserProfile%\.wslconfig التحكّم بذاكرة الآلة الافتراضيّة الكلّيّة وعدد المعالجات وswap.5

# %UserProfile%\.wslconfig
[wsl2]
memory=8GB
processors=4
swap=2GB

بعد تغيير الإعدادات، أعد تشغيل الآلة الافتراضيّة بـwsl --shutdown حتّى تسري. هذا التخصيص الديناميّ ── «الحدّ الأعلى إعداد، والاستخدام الفعليّ يتبع الطلب» ── يُؤخَذ أبعد في الموضوع التالي، Windows Sandbox.

4. Windows Sandbox ── إعادة استخدام Windows المضيف

4.1. صورة أساسيّة ديناميّة: Windows كامل في 500 ميغابايت

Windows Sandbox سطح مكتب Windows قابل للرمي معزول بالـ hypervisor. أغلقه فيختفي كلّ شيء؛ في المرّة التالية، يبدأ في بضع ثوانٍ من حالة نظيفة.1

اللغز الأوّل هو القرص. يستطيع إقلاع Windows كامل، ومع ذلك صورة Sandbox الأساسيّة نحو 500 ميغابايت فقط بعد التثبيت، و30 ميغابايت مضغوطة وقت التوزيع.2 السرّ هو الصورة الأساسيّة الديناميّة.

  • معظم ملفّات نظام التشغيل غير قابلة للتغيير، لذا يمكن مشاركة نُسَخ المضيف كما هي.
  • العدد الصغير من الملفّات القابلة للتغيير لا يمكن مشاركته، لذا تُحفَظ نسخة نظيفة منها داخل الصورة الأساسيّة.
  • عند البدء، تُجمَع ملفّات المضيف غير القابلة للتغيير زائد النُسَخ المحلّيّة للملفّات القابلة للتغيير لتجميع صورة Windows كاملة.2

بعبارة أخرى، لا ينزِّل Sandbox نسخة من Windows ولا يخزِّنها؛ إنّه يعيد استخدام Windows المثبَّت أصلاً على المضيف للبدء.

كيف تُجمَّع صورة أساسيّة ديناميّةتُشارَك ملفّات نظام التشغيل غير القابلة للتغيير من Windows المضيف؛ الملفّات القابلة للتغيير وحدها تُحفَظ نسخة نظيفة في الصورة الأساسيّة؛ ويُجمَع الاثنان لتجميع صورة Windows الكاملة لـ Sandboxتُشارَك كما هياحتفظ بنسخة نظيفةWindows الكامل للمضيفملفّات نظام تشغيل غير قابلة للتغيير(الأغلبيّة)ملفّات نظام تشغيل قابلة للتغيير(أقلّيّة)صورة إقلاع Sandboxتقلع Windows كاملاًنحو 500 ميغابايت فقط تحتاج إلى التخزين

الشكل 7: شكل التخلّي عن تكرار القرص ليس «امتلك Windows آخر» بل «جمِّعه من Windows المضيف».

ذلك التركيب هو ما يجعل دورة الحياة التالية ممكنة. ما يُرمى هو الحالة المحلّيّة داخل Sandbox. إذا كنت قد ربطت مجلّداً قابلاً للكتابة من المضيف في ملفّ إعداد .wsb، تبقى التغييرات هناك على المضيف.6

دورة حياة Windows Sandboxيجهِّز البدء Windows نظيفاً في بضع ثوانٍ؛ بعد التحقّق من تطبيق أو تجارب تغلقه وتُرمى كلّ الحالة داخل Sandbox لذا تبدأ المرّة التالية نظيفة أيضاً؛ لكن تغييرات مجلّد مضيف مربوط قابلاً للكتابة تبقىالبدء التاليابدأ(بضع ثوانٍ)Windows نظيفتحقّق من تطبيق أو تجاربأغلقارمِ كلّ الحالة داخل Sandboxتغييرات مجلّد مربوط قابل للكتابة تبقى على المضيف

الشكل 8: إمكان العودة إلى نظيف في كلّ مرّة لأنّ الجزء القابل للتغيير نسخة قابلة للرمي، ورميه جزء من التصميم.

4.2. Direct map: الـ ntdll.dll نفسه هو الصفحة الفيزيائيّة نفسها

ليس القرص فقط بل RAM أيضاً يُشارَك. لأنّ Sandbox يشغِّل صورة نظام التشغيل نفسها كالمضيف، تُستخدَم تقنيّة تُسمَّى «direct map» بحيث، للملفّات الثنائيّة لنظام التشغيل، يستخدم صفحات الذاكرة الفيزيائيّة نفسها كالمضيف. عندما يُحمَّل ntdll.dll في الذاكرة داخل Sandbox، يشير إلى الصفحة الفيزيائيّة نفسها كالملفّ الثنائيّ نفسه المحمَّل أصلاً على المضيف. دون تعريض أسرار المضيف للخطر، يحقِّق بصمة ذاكرة أصغر بكثير من آلة افتراضيّة تقليديّة.2

«شارك الصفحة الفيزيائيّة نفسها بين عدّة مستخدمين» ── تلك هي الفكرة نفسها لمشاركة DLL عبر كائنات القسم، التي تتبّعناها في الجزء 3 من سلسلة الذاكرة («كائنات القسم والنسخ عند الكتابة»). تلك الآليّة كانت مشاركة بين العمليّات؛ يفعل Sandbox ذلك عبر حدّ آلة افتراضيّة.

مشاركة الصفحات الفيزيائيّة عبر direct mapيشارك تطبيق على المضيف وتطبيقاً داخل Sandbox صفحة الذاكرة الفيزيائيّة نفسها لملفّات نظام التشغيل الثنائيّة مثل ntdll، فيقلّ استخدام الذاكرةتطبيق على المضيفعنوان افتراضيّ جانب المضيفتطبيق داخل Sandboxعنوان افتراضيّ جانب Sandboxالصفحة الفيزيائيّة نفسها(ملفّات ثنائيّة مثل ntdll.dll)لا حاجة لتكرار بقدر نظام تشغيل من RAM

الشكل 9: Direct map هي فكرة مشاركة الصفحات المستخدَمة بين العمليّات، مطبَّقة عبر حدّ آلة افتراضيّة.

4.3. إعارة الذاكرة واستعارتها: أقرب إلى عمليّة منها إلى آلة افتراضيّة

مقابل تخصيص الذاكرة الثابت لآلة افتراضيّة تقليديّة، تقرِّر تقنيّة الحاويات التي يجلس عليها Sandbox تخصيص الموارد ديناميّاً بالتعاون مع المضيف. إذا نقصت ذاكرة المضيف، يمكنه استعادة ذاكرة من الحاوية بالطريقة نفسها التي يستعيدها من عمليّة عاديّة.2 تنمّي Hyper-V Dynamic Memory أيضاً تخصيص آلة افتراضيّة وتنكمشه ضمن نطاق مضبوط، لكن Sandbox يذهب أبعد: الفرق هو أنّه يعير ويستعير على الميدان نفسه كإدارة ذاكرة المضيف.

تعاون الذاكرة بين المضيف وSandboxافتراضيّ آلة افتراضيّة تقليديّة تخصيص حصريّ بحجم ثابت بوسائل تكيّف محدودة؛ يصبح Sandbox هدفاً للاستعادة استجابةً لضغط ذاكرة المضيف ويعير ويستعير ذاكرة على الميدان نفسه كالعمليّات العاديّةيرتفع ضغط ذاكرة المضيفمن أين نستعيد؟مجموعات عمل العمليّات العاديّةاستخدام Sandbox(الحاوية)تُؤمَّن ذاكرة حرّةلآلة افتراضيّة تقليديّة وسائل تكيّف محدودة

الشكل 10: في إعارة الذاكرة واستعارتها، يقف Sandbox في جانب العمليّة لا جانب الآلة الافتراضيّة، ويقدِّم ذاكرة عندما يكون المضيف في ضيق.

في الجزء 1 قلنا «أداء آلة افتراضيّة يعتمد أيضاً على جانب المضيف»، لكن مع الآلات الافتراضيّة الخفيفة نأخذ خطوة إضافيّة: تخصيص الذاكرة نفسه عمل مشترك مع المضيف. سبب إمكان استخدام Sandbox بإحساس «تطبيق آخر» لا «منتج افتراضيّة ثقيل» هو هذا التعاون.

الإجراء الملموس لاستخدام Sandbox للتحقّق من تطبيق أعمال مشروح في «كيف نستعمل Windows Sandbox لتسريع التحقّق من تطبيقات Windows» السابق. هذا المقال هو الآليّة تحت ذلك.

5. الحاويات ── أين ترسم خطّ العزل

5.1. عزل العمليّة وعزل Hyper-V

لحاويات Windows وضعا عزل وقت التشغيل. الصورة مشتركة؛ تختار بعلم عند البدء.7

  • عزل العمليّة: تشارك عدّة حاويات النواة مع المضيف وتعزل عبر افتراضيّة لكلّ مساحة أسماء لنظام الملفّات والسجلّ ومنافذ الشبكة وفضاء معرِّف العمليّة ومساحة أسماء مدير الكائنات وغيرها. هو أساساً النهج نفسه لحاويات Linux.
  • عزل Hyper-V: تعمل كلّ حاوية داخل آلة افتراضيّة عالية التحسين ولها ما هو في الواقع نواة مخصَّصة. وجود الآلة الافتراضيّة يضع عزلاً على مستوى العتاد بين الحاويات والمضيف.7

يمكن وصف العزل عبر مساحات الأسماء بوصفه نسخة مستفيضة من التقنيّة التي رأيناها في مقال افتراضيّة السجلّ («إعادة توجيه السجلّ والافتراضيّة على Windows») ── «أظهر واقعاً مختلفاً تحت الواجهة البرمجيّة نفسها».

عزل العمليّة مقابل عزل Hyper-Vتحت عزل العمليّة، تشارك الحاويات النواة مع المضيف وتعزل عبر مساحات الأسماء؛ تحت عزل Hyper-V، لكلّ حاوية نواة مخصَّصة داخل آلة افتراضيّة محسَّنةعزل Hyper-Vعزل العمليّةنواة مخصَّصة(داخل آلة افتراضيّة محسَّنة)الحاوية جنواة مخصَّصة(داخل آلة افتراضيّة محسَّنة)الحاوية دنواة مشتركة مع المضيفالحاوية أالحاوية ب

الشكل 11: حتّى مع صورة الحاوية نفسها، ما إذا رسمت خطّ العزل فوق النواة أو قسَّمت النواة نفسها اختيار تجريه عند البدء.

5.2. أيّهما يمكنك تسميته «حدّ أمان»

الفرق بين هذين الوضعين ليس قصّة أداء فقط. لا تعتبر Microsoft حاوية معزولة بالعمليّة حدّ أمان متيناً. الحاويات التي تُصان (مع استجابة للثغرات) بوصفها حدّ أمان هي الحاويات المعزولة بالـ hypervisor، وعزل Hyper-V هو ما ينبغي اختياره في سيناريو متعدّد المستأجرين معادٍ.8

كان VBS الذي رأيناه في الجزء 2 أيضاً تصميماً يفترض «يمكن اختراق النواة» ويتراجع إلى حدّ hypervisor. المعيار نفسه ينطبق في عالم الحاويات. الخطّ الذي يحصر شيفرة غير موثوقة يُرسَم عند حدّ الـ hypervisor، لا داخل نواة مشتركة.

كيفيّة اختيار العزل من مقدار ثقتك بالشيفرةإن كان حمل العمل موثوقاً، خذ الكثافة والأداء بعزل العمليّة؛ إن كانت الشيفرة غير موثوقة أو لشخص آخر، اختر حدّ hypervisor مثل حاوية معزولة بـ Hyper-V، أو Windows Sandbox محصَّن بتعطيل الشبكة، أو آلة افتراضيّة معزولةنعملا / شيفرة شخص آخرهل تستطيع الوثوق بتلك الشيفرة؟عزل العمليّة(أعطِ الأولويّة للكثافة والسرعة)اختر حدّ hypervisorحاويات معزولة بـ Hyper-VSandbox محصَّن أو آلة افتراضيّة معزولة

الشكل 12: وضع العزل قصّة أمان قبل أن يكون قصّة أداء، والثقة تقرِّر أين ترسم الخطّ.

بالمناسبة، تشغيل حاوية معزولة بـ Hyper-V داخل آلة افتراضيّة Hyper-V يجعل الـ hypervisor طبقتين عمقاً ── افتراضيّة متداخلة. مستوى واحد من التداخل مدعوم في الإنتاج على بيئات تستوفي الشروط (معالج Intel مع مضيف Windows 10 / Windows Server 2016 أو أحدث، أو معالج AMD مع مضيف Windows 11 / Windows Server 2022 أو أحدث، وإصدار تكوين الآلة الافتراضيّة المقابل في كلّ حالة)، ومتطلَّب إضافيّ هو إعداد يعرِّض امتدادات الافتراضيّة للآلة الافتراضيّة الخارجيّة (ExposeVirtualizationExtensions على Set-VMProcessor في Hyper-V). تشغيل WSL2 داخل آلة افتراضيّة مدعوم بالطريقة نفسها.9 ما إذا كان يمكنك استخدام WSL2 أو Docker في آلة افتراضيّة تطوير في السحابة يقرِّره أيضاً ما إذا كان حجم تلك الآلة الافتراضيّة وتكوينها يعرِّضان الافتراضيّة المتداخلة.

بنية الافتراضيّة المتداخلةتجلس آلة افتراضيّة سحابيّة على hypervisor المضيف الفيزيائيّ، وداخلها يعمل hypervisor آخر(التداخل المدعوم مستوى واحد)لدعم WSL2 والحاويات المعزولة بـ Hyper-Vhypervisor المضيف الفيزيائيّآلة افتراضيّة سحابيّة(جهاز تطوير)hypervisor داخل الآلة الافتراضيّة(مستوى التداخل 1)WSL2حاوية معزولة بـ Hyper-Vالتداخل المدعوم مستوى واحد

الشكل 13: سبب عمل wsl داخل آلة افتراضيّة سحابيّة هو أنّ الافتراضيّة المتداخلة مدعومة رسميّاً لمستوى واحد فقط.

5.3. طيف العزل والخفّة

اصطفاف الطاقم حتّى الآن على محور واحد يبدو هكذا.

طيف قوّة العزل والخفّةالحاويات المعزولة بالعمليّة الأخفّ لكنّها تشارك النواة؛ WSL2 وSandbox والحاويات المعزولة بـ Hyper-V آلات افتراضيّة خفيفة بنواة مخصَّصة(يخفِّف Sandbox بالمشاركة، وWSL2 بنواة مبنيّة لغرضها);آلة افتراضيّة كاملة الأثقل لكنّها عامّة الغرضخفيف ← → ثقيلحاويات معزولة بالعمليّة(نواة مشتركة)WSL2 وSandbox وعزل Hyper-V(آلات افتراضيّة خفيفة بنواة مخصَّصة)آلة افتراضيّة كاملة(تشغِّل أيّ شيء؛ تحتفظ بنسخة كاملة)الحدّ: مساحات الأسماءالحدّ: hypervisorالحدّ: hypervisor + استقلال كامل

الشكل 14: مجموعة الآلات الافتراضيّة الخفيفة هي الحلّ الوسط الذي أبقى حدّ الـ hypervisor وقطع التكرار؛ طريقة قطعه تنقسم إلى مشاركة لـ Sandbox ونواة مبنيّة لغرضها لـ WSL2.

6. انظر بنفسك

الخفّة والمشاركة أمور يمكنك ملاحظتها على جهاز أمامك.

زمن البدء وصعود الذاكرة وهبوطها (WSL2). مع فتح مدير المهام، جرِّب التالي.

# Felt startup time (the first run starts the VM; the second and later are faster still)
Measure-Command { wsl -e true }

# Memory usage of the WSL2 VM (vmmem / Virtual Machine Memory)
Get-Process -Name vmmem* | Select-Object Name, WorkingSet64

# End the whole VM and watch the memory come back
wsl --shutdown

إذا فعلت بناء كبيراً أو عمليّة ملفّات داخل WSL2، ينمو vmmem، ويمكنك ملاحظة إعادته دفعة واحدة بـwsl --shutdown.

فرق السرعة من أين تضع الملفّات (WSL2). ضع المستودع نفسه في جانب Linux (~/repo) وفي جانب Windows (/mnt/c/repo) وقارن زمن git status أو استخراج، فيظهر فرق القسم 3.2 بالأرقام.

خلفيّة لـ direct map (Sandbox). ابدأ Sandbox وانظر إلى الزيادة في الذاكرة في مدير المهام على المضيف. أنّ الزيادة تبقى أصغر بكثير ممّا يوحي به «Windows آخر» هو أثر المشاركة يروي قصّته. للحفر أبعد في تفصيل ذاكرة جانب المضيف، مقال أدوات Sysinternals الذي يغطّي كيفيّة استخدام RAMMap وVMMap («Process Explorer / Handle / VMMap عمليّاً») مفيد. هذه مع ذلك أدوات للنظر في تصنيف عمليّات جانب المضيف والذاكرة الفيزيائيّة؛ ولا تلاحظ المشاركة مع الضيف نفسه مباشرةً.

أوضاع عزل الحاويات (Docker / حاويات Windows). إن كان لديك بيئة حاويات Windows، ابدأ الصورة نفسها بـdocker run --isolation=process و--isolation=hyperv وقارن زمن البدء وكيف تبدو في مدير المهام (تحت عزل العمليّة، تظهر العمليّات داخل الحاوية في قائمة عمليّات المضيف)، ويمكنك الشعور أين يجلس خطّ العزل.7 عزل العمليّة مع ذلك يفترض تطابق إصدارات المضيف والصورة، وعلى نظام تشغيل عميل يقتصر على استخدام التطوير والاختبار. يتيح عزل Hyper-V مجموعة أوسع من التركيبات، لذا افعل المقارنة على زوج متوافق.10

7. ثلاثة قراءات خاطئة تجنَّبها في العمل

7.1. «WSL2 بطيء»

ما هو بطيء ليس WSL2 بل مسار إدخال/إخراج الملفّات الذي يعبر حدّ نظام تشغيل. ثمّة حالات كثيرة حيث مجرّد نقل المشروع إلى جانب Linux يجعل الإحساس شيئاً مختلفاً.4 بالمقابل، وضع ملفّات ستلمسها أدوات Windows في جانب Linux غير مواتٍ بالقدر نفسه وللسبب نفسه. احكم بـ«ضعه على نظام التشغيل نفسه كالجانب الذي يستخدمه».

7.2. «نموّ vmmem كبيراً تسرّب ذاكرة»

تنمو ذاكرة WSL2 وتنكمش مع الطلب، وتُعاد الأجزاء المطلَقة. على WSL الحاليّ، يستعيد autoMemoryReclaim أيضاً التخزين المؤقّت للملفّات تلقائيّاً (الافتراضيّ هو dropCache)، لذا «بقي كبيراً» غالباً يُحَلّ مع الوقت.5 إن بقي مع ذلك، أكِّد أنّ autoMemoryReclaim لم يُضبَط على disabled وأنّ pageReporting، المسؤول عن إعادة الأجزاء المطلَقة، لم يُعطَّل (أو أنّك لست على WSL أقدم)، ثمّ إمّا اجعل الحدّ الأعلى صريحاً بـmemory في .wslconfig أو أعد كلّ شيء بـwsl --shutdown عند حدّ جلسة. طريقة التفكير في التمييز بين تسرّب ولا-تسرّب هي نفسها كما في الحلقة التمهيديّة لسلسلة الذاكرة، «ماذا يعني «استخدام الذاكرة» في Windows فعليّاً؟».

7.3. «إنّه في حاوية، إذن هو آمن»

حاوية معزولة بالعمليّة تشارك النواة، وبمعيار Microsoft ليست حدّ أمان.8 لتشغيل شيفرة غير موثوقة أو عيّنة، اختر عزلاً يملك حدّ hypervisor، مثل حاوية معزولة بـ Hyper-V، أو Windows Sandbox، أو آلة افتراضيّة مخصَّصة. حدّ hypervisor مع ذلك ليس إعفاءً شاملاً. إعدادات Windows Sandbox الافتراضيّة تملك اتّصال شبكة ممكَّناً، ويمكن أن تعرِّض تطبيقاً غير موثوق للشبكة الداخليّة.1 إن استخدمته لتشغيل عيّنة، حصِّن العزل بتعطيل الشبكة وإعادة توجيه الحافظة في ملفّ إعداد .wsb، أو استخدم آلة افتراضيّة مخصَّصة على شبكة معزولة.

8. الخلاصة ── إغلاق السلسلة

نقاط الجزء 3.

  • خفّة آلة افتراضيّة خفيفة نتيجة «إيقاف التكرار»، لا «إضعاف العزل».
  • يشغِّل WSL2 نواة Linux أصيلة في آلة افتراضيّة خدميّة خفيفة مُدارة، والتوزيعات معزولة حاويات داخل تلك الآلة الافتراضيّة.3 قاعدة الأداء هي وضع الملفّات على نظام التشغيل الذي يستخدمها، وتنمو الذاكرة وتنكمش ديناميّاً، مع إمكان التحكّم بالحدّ الأعلى في .wslconfig.45
  • يشارك Windows Sandbox ملفّات نظام التشغيل غير القابلة للتغيير للمضيف عبر صورة أساسيّة ديناميّة ويشارك أيضاً الصفحات الفيزيائيّة لملفّات نظام التشغيل الثنائيّة المستهدَفة عبر direct map، لذا لا يحتفظ بنسخة Windows كاملة.2 ما زلت تحتاج نحو 500 ميغابايت للملفّات القابلة للتغيير، زائد ذاكرة التطبيقات التي تشغِّلها داخله.
  • يُختار وضع عزل الحاوية عند البدء، والجانب الذي يمكنك تسميته حدّ أمان هو عزل Hyper-V.78

وإذا وضعنا السلسلة كلّها في صفحة واحدة، تبدو هكذا.

  • الجزء 1: ثمّة طبقة hypervisor تحت Windows، ونظام التشغيل المضيف نفسه يعمل بوصفه القسم الجذر. تحكيم المعالج والذاكرة (SLAT) تفعله هذه الطبقة مباشرةً، ويتوسّط القسم الجذر (VSP) إدخال/إخراج الأجهزة الاصطناعيّة وراء VMBus.
  • الجزء 2: تُستخدَم تلك الطبقة لا لعزل الآلات الافتراضيّة بعضها عن بعض فقط بل أيضاً لرسم حدّ أقوى من النواة (VTL) داخل نظام التشغيل نفسه. أمان Windows 11 الافتراضيّ مبنيّ فوق هذا.
  • الجزء 3: على الطبقة نفسها، قطع التكرار هو ما يجعل «آلة افتراضيّة تبدأ في ثوانٍ» ممكناً. خطّ العزل مُبقًى، وأصبحت أداة يوميّة.
صورة واحدة للسلسلة كلّهاالـ hypervisor مباشرةً على العتاد هو الجزء 1؛ انقسام VTL0 وVTL1 داخل Windows المضيف هو الجزء 2؛ خفّة WSL2 وSandbox وعزل Hyper-V على الطبقة نفسها هي الجزء 3؛ الحاويات المعزولة بالعمليّة تشارك نواة المضيف؛ يخفِّف Sandbox بالمشاركة، وWSL2 بنواة مبنيّة لغرضهاالعتادالـ hypervisor(الجزء 1)Windows المضيف(عزل VTL هو الجزء 2)WSL2 وSandbox وعزل Hyper-V(الجزء 3)حاويات معزولة بالعمليّة(نواة مشتركة)يشارك Sandbox؛ يخفِّف WSL2 بنواة مبنيّة لغرضها

الشكل 15: كدِّس الحلقات الثلاث فتحصل على الصورة الكلّيّة للأرض تحت Windows الحاليّ.

الافتراضيّة لم تعد تقنيّة غرفة خوادم، ولا تقنيّة لمن يُقيم آلات افتراضيّة فقط. عند الأرض تحت Windows لديك، تدعم بهدوء كلاً من الأمان وتجربة التطوير ── هناك نحن الآن.

مقالات ذات صلة

مجالات الاستشارة ذات الصلة

تتعامل شركة كومورا سوفت ذ.م.م. مع إعداد بيئات تطوير تستخدم WSL2 والحاويات، وتصميم بيئات التحقّق لتطبيقات Windows، والتحقيق في الأداء والتوافق في البيئات الافتراضيّة.

روابط مرجعيّة

  1. Microsoft Learn, Windows Sandbox. حول بدء Windows Sandbox في بضع ثوانٍ آلةً افتراضيّة قابلة للرمي ورمي كلّ شيء عند الإغلاق؛ وحول تشغيل نواة منفصلة بـ Microsoft hypervisor لعزلها عن المضيف؛ وحول تفعيل اتّصال الشبكة افتراضيّاً وإمكان تعطيله في ملفّ الإعداد.  2 3

  2. Microsoft Learn, Windows Sandbox architecture. حول تجميع صورة أساسيّة ديناميّة صورة Windows كاملة من مشاركة ملفّات نظام التشغيل غير القابلة للتغيير للمضيف زائد نسخة نظيفة من الملفّات القابلة للتغيير (نحو 500 ميغابايت بعد التثبيت)؛ وحول تخصيص حاوية ديناميّاً بالتعاون مع المضيف، مقابل تخصيص الذاكرة الثابت لآلة افتراضيّة تقليديّة، فيستطيع المضيف استعادة ذاكرة؛ وحول جعل direct map ملفّات نظام التشغيل الثنائيّة مثل ntdll.dll تستخدم الصفحات الفيزيائيّة نفسها كالمضيف.  2 3 4 5 6

  3. Microsoft Learn, What is the Windows Subsystem for Linux?. حول تشغيل WSL2 نواة Linux داخل آلة افتراضيّة خدميّة خفيفة؛ وحول عمل كلّ توزيعة حاويةً معزولة، مشاركة مساحة أسماء الشبكة والنواة مع فصل مساحات أسماء مثل PID وmount وuser.  2 3

  4. Microsoft Learn, Comparing WSL Versions. حول بناء نواة WSL2 بواسطة Microsoft من فرع Stable؛ وحول تلقّي WSL الموزَّع عبر Store تحديثات حزمة منفصلة عن صورة نظام التشغيل وتطبيقها بـwsl --update (على التوزيع الأقدم داخل الصندوق، عبر Windows Update)؛ وحول أمثلة أداء مثل حتى 20 ضعفاً لاستخراج tarball؛ وحول كون WSL1 أسرع لأداء نظام الملفّات عبر أنظمة التشغيل، لذا ينبغي وضع الملفّات على نظام التشغيل الذي يستخدمها؛ وحول نموّ الذاكرة وانكماشها مع إعادة الأجزاء المطلَقة، بينما قد لا يعود التخزين المؤقّت حتّى تخرج الآلة الافتراضيّة.  2 3 4 5 6 7 8

  5. Microsoft Learn, Advanced settings configuration in WSL. حول إمكان ضبط سقف ذاكرة آلة WSL2 الافتراضيّة الكلّيّة وعدد المعالجات وswap وpageReporting (مفعَّل افتراضيّاً؛ مسؤول عن كشف الذاكرة غير المستخدَمة وإعادتها) في قسم [wsl2] من .wslconfig؛ وحول افتراض الإعداد التجريبيّ autoMemoryReclaim قيمة dropCache، فتُستعاد ذاكرة التخزين المؤقّت تلقائيّاً.  2 3 4 5

  6. Microsoft Learn, Use and configure Windows Sandbox. حول إمكان مشاركة MappedFolders في ملفّ إعداد .wsb مجلّد مضيف للقراءة فقط أو قابلاً للكتابة. 

  7. Microsoft Learn, Isolation Modes. حول مشاركة عزل العمليّة لحاويات Windows النواة مع المضيف والعزل عبر مساحات الأسماء؛ وحول امتلاك عزل Hyper-V ما هو في الواقع نواة مخصَّصة داخل آلة افتراضيّة محسَّنة؛ وحول إمكان تشغيل الصورة نفسها في أيّ من الوضعين عبر علم عند البدء.  2 3 4

  8. Microsoft Learn, Secure Windows containers. حول معاملة الحاويات المعزولة بالـ hypervisor فقط حدّ أمان؛ وحول عدم اعتبار الحاويات المعزولة بالعمليّة حدّ أمان متيناً؛ وحول كون عزل الـ hypervisor ما ينبغي اختياره في سيناريو متعدّد المستأجرين معادٍ.  2 3

  9. Microsoft Learn, What is Nested Virtualization?. حول دعم تشغيل حاويات معزولة بـ Hyper-V داخل آلة افتراضيّة Hyper-V (مستوى تداخل واحد) في الإنتاج؛ وحول كون المتطلّبات معالج Intel مع Windows Server 2016 / Windows 10 أو أحدث، أو معالج AMD مع Windows Server 2022 / Windows 11 أو أحدث، زائد إصدار تكوين الآلة الافتراضيّة المقابل في كلّ حالة؛ وحول كون تعريض امتدادات الافتراضيّة للآلة الافتراضيّة الخارجيّة (ExposeVirtualizationExtensions) متطلَّباً مسبقاً؛ وحول دعم تشغيل WSL2 داخل آلة افتراضيّة Hyper-V. 

  10. Microsoft Learn, Windows container version compatibility. حول افتراض عزل العمليّة تطابق إصدارات المضيف وصورة الحاوية؛ وحول إمكان تشغيل عزل Hyper-V صورة إصدار نظام تشغيل مختلف عن المضيف؛ وحول اقتصار عزل العمليّة على نظام تشغيل عميل على استخدام التطوير والاختبار. 

أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.

كيف نستعمل Windows Sandbox لتسريع التحقّق من تطبيقات Windows - صلاحيّات المسؤول والبيئات النظيفة وإعادة إنتاج حالات نقص الصلاحيّات أو الموارد

مرشد عمليّ يبيّن كيف يسرّع Windows Sandbox التحقّق من تطبيقات Windows، عبر ملفّات .wsb لكلّ سيناريو وفحوصات المستخدم القياسيّ ومحاكاة شُح...

ترتبط هذه المقالة بشكل طبيعي بصفحات الخدمات التالية.

الأسئلة الشائعة

أسئلة شائعة حول موضوع هذه المقالة.

هل WSL2 آلة افتراضيّة؟
نعم. يشغِّل WSL2 نواة Linux أصيلة تبنيها Microsoft داخل آلة افتراضيّة خدميّة خفيفة. تدير WSL الآلة الافتراضيّة خلف الكواليس، لذا لا يجعل التصميم المستخدم يفكِّر في إعدادات آلة افتراضيّة أو انتظار إقلاع. يعمل كلّ توزيعة Linux حاويةً معزولة داخل هذه الآلة الافتراضيّة المُدارة.
لماذا عمليّات الملفّات تحت /mnt/c بطيئة في WSL2؟
لأنّ الوصول من نواة Linux في WSL2 إلى نظام ملفّات جانب Windows يمرّ بمشاركة ملفّات تعبر حدّ نظام تشغيل. عمليّات نظام ملفّات Linux(قرص افتراضيّ ext4)سريعة، لذا القاعدة هي إبقاء ملفّات المشروع في جانب نظام التشغيل نفسه الذي تستخدمه الأدوات التي تعمل عليها.
هل استخدام ذاكرة كبير لعمليّة vmmem تسرّب؟
في معظم الحالات ليس تسرّباً. تنمو ذاكرة WSL2 وتنكمش مع الاستخدام، والذاكرة التي أطلقتها العمليّات تُعاد إلى Windows تحت إعداد pageReporting، المفعَّل افتراضيّاً. صفحات ذاكرة التخزين المؤقّت للملفّات أيضاً تُستعاد تلقائيّاً في WSL الحاليّ عبر autoMemoryReclaim في .wslconfig(الافتراضيّ هو dropCache). في بيئات عُطِّلت فيها هذه الإعدادات، أو على WSL أقدم، يمكن أن تبقى الذاكرة حتّى تخرج الآلة الافتراضيّة؛ في تلك الحالة اضبط حدّاً أعلى بإعداد memory، أو أعدها بـ wsl --shutdown.
كيف يستطيع Windows Sandbox إقلاع Windows كامل من بضع مئات ميغابايت من القرص؟
عبر آليّة تُسمَّى صورة أساسيّة ديناميّة. تشارك ملفّات نظام التشغيل غير القابلة للتغيير من Windows المثبَّت أصلاً على المضيف، وتحتفظ بنسخة نظيفة من العدد الصغير فقط من الملفّات القابلة للتغيير. ذلك يتيح تجميع صورة كاملة قابلة للإقلاع دون تخزين نسخة كاملة من Windows.
هل الحاويات أكثر أماناً من الآلات الافتراضيّة؟
يعتمد على وضع العزل. الحاويات المعزولة بالعمليّة تشارك النواة مع المضيف، ولا تعتبر Microsoft هذا حدّ أمان متيناً. عندما تتعامل مع شيفرة معادية، تحتاج عزل Hyper-V، الذي يعطي كلّ حاوية نواتها المخصَّصة.

الملف الشخصي للمؤلف

صفحة الملف الشخصي لمؤلف المقالة.

غو كومورا

مؤسّس شركة كومورا سوفت ذ.م.م.

يركّز على تطوير برامج ويندوز، والاستشارات التقنية، والتحقيق في الأخطاء، ويتميّز في المشاريع التي تبقى فيها الأصول القديمة ناشطة، وفي تشخيص الأعطال التي يصعب تحديد سببها.

العودة إلى المدونة