<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WSL2 on kenji.blog</title><link>http://kenji.blog/ar/tags/wsl2/</link><description>Recent content in WSL2 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 07:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/tags/wsl2/index.xml" rel="self" type="application/rss+xml"/><item><title>Hyper-V مقابل WSL2: مقارنة تقنيات المحاكاة الافتراضية على Windows</title><link>http://kenji.blog/ar/p/hyper-v-vs-wsl2-windows-virtualization/</link><pubDate>Sun, 13 Sep 2026 07:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/hyper-v-vs-wsl2-windows-virtualization/</guid><description>&lt;img src="http://kenji.blog/p/hyper-v-vs-wsl2-windows-virtualization/img/eyecatch.jpg" alt="Featured image of post Hyper-V مقابل WSL2: مقارنة تقنيات المحاكاة الافتراضية على Windows" />&lt;h2 id="1-مقدمة-تطور-المحاكاة-الافتراضية-في-windows">1. مقدمة: تطور المحاكاة الافتراضية في Windows
&lt;/h2>&lt;p>لقد تطورت تقنيات المحاكاة الافتراضية على منصة Windows بشكل كبير خلال العقود القليلة الماضية. في الماضي، كانت برامج الهايبرفايزر (Hypervisor) من النوع الثاني (Type 2) التابعة لجهات خارجية (مثل VMware Workstation و VirtualBox) هي السائدة، ولكن منذ أن قدمت Microsoft &amp;ldquo;Hyper-V&amp;rdquo; في Windows Server 2008، تم دمج برامج الهايبرفايزر من النوع الأول (Type 1) في أنظمة تشغيل سطح المكتب Windows 10/11.&lt;/p>
&lt;p>وفي السنوات الأخيرة، أصبح &amp;ldquo;WSL2 (Windows Subsystem for Linux 2)&amp;rdquo; يحظى بأكبر قدر من الاهتمام بين المطورين. بينما كان WSL1 يعتمد على ترجمة استدعاءات النظام (System Calls)، يستخدم WSL2 &amp;ldquo;جهازاً افتراضياً خفيفاً للأدوات (Lightweight Utility VM)&amp;rdquo; يعتمد على تقنية Hyper-V، مما يوفر توافقاً كاملاً مع نظام Linux وتحسناً هائلاً في الأداء.&lt;/p>
&lt;p>في هذه المقالة، سنقوم بمقارنة وشرح هاتين التقنيتين القويتين للمحاكاة الافتراضية ―― &amp;ldquo;Hyper-V&amp;rdquo; كامل الميزات، و &amp;ldquo;WSL2&amp;rdquo; المتخصص في تجربة المطورين ―― من حيث البنية، الأداء (وحدة المعالجة المركزية، الذاكرة، وإدخال/إخراج القرص (Disk I/O))، تكوين الشبكة، وأفضل حالات الاستخدام، إلى جانب تفاصيل فنية عميقة.&lt;/p>
&lt;hr>
&lt;h2 id="2-النظرية-الأساسية-للهايبرفايزر-ومقارنة-البنية-architecture">2. النظرية الأساسية للهايبرفايزر ومقارنة البنية (Architecture)
&lt;/h2>&lt;p>لفهم تقنيات المحاكاة الافتراضية، من الضروري فهم تصنيف أنواع الهايبرفايزر (مراقب الأجهزة الافتراضية: VMM).&lt;/p>
&lt;h3 id="21-الفرق-بين-الهايبرفايزر-من-النوع-الأول-type-1-والنوع-الثاني-type-2">2.1. الفرق بين الهايبرفايزر من النوع الأول (Type 1) والنوع الثاني (Type 2)
&lt;/h3>&lt;p>الهايبرفايزر عبارة عن طبقة برمجية تجرد الوصول إلى الأجهزة وتسمح لأنظمة تشغيل متعددة (أنظمة التشغيل الضيف) بالعمل في وقت واحد على جهاز مادي واحد.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>النوع الأول (المعدن المجرد - Bare-metal)&lt;/strong>: يعمل مباشرة على الأجهزة. لا يوجد مفهوم لنظام التشغيل المضيف (على الرغم من أنه بالمعنى الدقيق للكلمة قد يكون هناك نظام تشغيل إدارة له امتيازات)، وله حمل زائد (Overhead) منخفض للغاية ويوفر أداءً وأماناً عاليين. أمثلة: Hyper-V و VMware ESXi و Xen.&lt;/li>
&lt;li>&lt;strong>النوع الثاني (المستضاف - Hosted)&lt;/strong>: يعمل كتطبيق على نظام التشغيل المضيف (مثل Windows أو macOS). نظراً لأن جميع عمليات الوصول إلى الأجهزة تتم عبر نظام التشغيل المضيف، فإن الحمل الزائد يكون كبيراً. أمثلة: VMware Workstation و Oracle VirtualBox.&lt;/li>
&lt;/ul>
&lt;p>يعد Hyper-V الخاص بـ Windows &lt;strong>هايبرفايزر نقياً من النوع الأول (Type 1)&lt;/strong>. عندما تقوم بتمكين Hyper-V، فإن نظام تشغيل Windows الفعلي الذي يتفاعل معه المستخدم عادة سيعمل أيضاً داخل جهاز افتراضي خاص يسمى &amp;ldquo;قسم الجذر (Root Partition)&amp;rdquo;.&lt;/p>
&lt;h3 id="22-تفاصيل-بنية-hyper-v">2.2. تفاصيل بنية Hyper-V
&lt;/h3>&lt;p>تتبنى بنية Hyper-V تصميم الميكروكيرنل (Microkernel)، وتستند إلى وحدات عزل منطقية تسمى الأقسام (Partitions).&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;الأجهزة (وحدة المعالجة المركزية، ذاكرة الوصول العشوائي، القرص، بطاقة الشبكة)&amp;#34;] --&amp;gt; B[&amp;#34;هايبرفايزر ويندوز (Ring -1)&amp;#34;]
B --&amp;gt; C[&amp;#34;قسم الجذر (نظام تشغيل ويندوز)&amp;#34;]
B --&amp;gt; D[&amp;#34;القسم الفرعي 1 (جهاز افتراضي ويندوز)&amp;#34;]
B --&amp;gt; E[&amp;#34;القسم الفرعي 2 (جهاز افتراضي لينكس)&amp;#34;]
C --&amp;gt; F[&amp;#34;ناقل الجهاز الافتراضي (VMBus)&amp;#34;]
D --&amp;gt; F
E --&amp;gt; F
C --&amp;gt; G[&amp;#34;برنامج تشغيل البنية التحتية للمحاكاة الافتراضية (VID)&amp;#34;]
C --&amp;gt; H[&amp;#34;عملية العامل (VMWP.exe)&amp;#34;]
&lt;/pre>
&lt;ul>
&lt;li>&lt;strong>هايبرفايزر ويندوز (Windows Hypervisor)&lt;/strong>: يعمل بأعلى مستوى امتياز لوحدة المعالجة المركزية (Ring -1 أو VMX Root Mode)، ويكون مسؤولاً فقط عن تخصيص الذاكرة وجدولة وحدة المعالجة المركزية. لا يتضمن برامج تشغيل الأجهزة.&lt;/li>
&lt;li>&lt;strong>قسم الجذر (Root Partition)&lt;/strong>: القسم الذي يعمل فيه نظام تشغيل Windows المضيف. يمتلك جميع برامج تشغيل الأجهزة ويتحكم في الأجهزة مباشرةً. يوفر أيضاً وظائف الإدارة للأقسام الفرعية (مثل مزود WMI و VMWP.exe).&lt;/li>
&lt;li>&lt;strong>القسم الفرعي (Child Partition)&lt;/strong>: القسم الذي يعمل فيه نظام التشغيل الضيف. لا يُسمح له بالوصول المباشر إلى الأجهزة، ويرسل طلبات الإدخال/الإخراج إلى قسم الجذر (Synthetic I/O) عبر ناقل مشاركة ذاكرة منطقي يسمى &amp;ldquo;VMBus&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h3 id="23-آلية-عمل-wsl2-وجهاز-utility-vm-الخفيف">2.3. آلية عمل WSL2 وجهاز Utility VM الخفيف
&lt;/h3>&lt;p>يستخدم WSL2 نفس تقنية الأساس للهايبرفايزر من النوع الأول (Type 1) مثل Hyper-V، ولكنه يستخدم مجموعة فرعية تسمى &amp;ldquo;منصة الأجهزة الافتراضية (Virtual Machine Platform: VMP)&amp;rdquo; والتي تختلف عن الأجهزة الافتراضية كاملة الميزات لـ Hyper-V.&lt;/p>
&lt;p>يلغي &amp;ldquo;الجهاز الافتراضي الخفيف للأدوات (Lightweight Utility VM)&amp;rdquo; المستخدم في WSL2 تماماً المحاكاة (Emulation) للأجهزة القديمة التي تمتلكها الأجهزة الافتراضية التقليدية (مثل BIOS الافتراضي واللوحة الأم الافتراضية).&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;نظام تشغيل ويندوز المضيف (مساحة المستخدم)&amp;#34;]
B[&amp;#34;نظام ملفات NTFS&amp;#34;]
C[&amp;#34;خادم بروتوكول 9P (Plan 9)&amp;#34;]
D[&amp;#34;الجهاز الافتراضي الخفيف للأدوات (نواة لينكس)&amp;#34;]
E[&amp;#34;ext4.vhdx (القرص الافتراضي)&amp;#34;]
F[&amp;#34;مساحة مستخدم لينكس (توزيعات WSL2)&amp;#34;]
A --&amp;gt; C
C --&amp;gt;| مشاركة الملفات عبر أنظمة التشغيل | D
D --&amp;gt; E
D --&amp;gt; F
&lt;/pre>
&lt;p>أكبر ميزات WSL2 هي &lt;strong>سرعة بدء التشغيل&lt;/strong> و &lt;strong>التكامل السلس مع نظام التشغيل المضيف&lt;/strong>. تعمل نواة Linux في أقل من ثانية، ويتم الوصول إلى نظام الملفات (NTFS) على جانب Windows عبر بروتوكول نظام ملفات الشبكة &lt;code>9P&lt;/code> الخاص بـ Plan 9.&lt;/p>
&lt;hr>
&lt;h2 id="3-التحليل-الشامل-للأداء-موارد-الحوسبة-والإدخالالإخراج">3. التحليل الشامل للأداء: موارد الحوسبة والإدخال/الإخراج
&lt;/h2>&lt;p>يتم التعبير عن أداء الجهاز الافتراضي كمجموع الأحمال الزائدة (Overheads) في كل مكون: وحدة المعالجة المركزية، الذاكرة، وإدخال/إخراج القرص (Disk I/O).&lt;/p>
&lt;h3 id="31-وحدة-المعالجة-المركزية-وتبديل-السياق-context-switch">3.1. وحدة المعالجة المركزية وتبديل السياق (Context Switch)
&lt;/h3>&lt;p>يستخدم كل من Hyper-V و WSL2 المحاكاة الافتراضية المدعومة بالأجهزة (Intel VT-x / AMD-V). يتم تنفيذ تعليمات وحدة المعالجة المركزية بشكل أساسي بالسرعة الأصلية، ولكن عند تنفيذ التعليمات ذات الامتيازات أو معالجة الإدخال/الإخراج، تحدث مقاطعة تسمى &amp;ldquo;VM Exit&amp;rdquo;، ويتم تبديل السياق (Context Switch) إلى الهايبرفايزر.&lt;/p>
&lt;p>يمكن التعبير عن الحمل الزائد لوحدة المعالجة المركزية $T_{overhead}$ في هذا الوقت بالنموذج الرياضي التالي:&lt;/p>
$$ T_{overhead} = \sum_{i=1}^{N} (t_{vm\_exit} + t_{hypercall\_process} + t_{vm\_entry}) $$&lt;p>حيث:&lt;/p>
&lt;ul>
&lt;li>$N$: عدد مرات حدوث VM Exit لكل وحدة زمنية&lt;/li>
&lt;li>$t_{vm\_exit}$: وقت الانتقال من الضيف إلى الهايبرفايزر&lt;/li>
&lt;li>$t_{hypercall\_process}$: وقت معالجة الإدخال/الإخراج أو المقاطعات عبر VMBus&lt;/li>
&lt;li>$t_{vm\_entry}$: وقت العودة من الهايبرفايزر إلى الضيف&lt;/li>
&lt;/ul>
&lt;p>نظراً لعدم وجود محاكاة (Emulation) للأجهزة القديمة في WSL2، تم تحسين $t_{hypercall\_process}$ ليكون صغيراً للغاية. لذلك، في العمليات الحسابية البحتة لوحدة المعالجة المركزية (على سبيل المثال، تجميع النواة أو استنتاج نماذج التعلم الآلي)، يقتصر تدهور الأداء على بضع نسب مئوية مقارنة ببيئة المعدن المجرد (Bare-metal).&lt;/p>
&lt;h3 id="32-آلية-تخصيص-الذاكرة">3.2. آلية تخصيص الذاكرة
&lt;/h3>&lt;p>هناك اختلاف واضح في فلسفة التصميم بين الاثنين من حيث طرق إدارة الذاكرة.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Hyper-V (الذاكرة الديناميكية)&lt;/strong>: بناءً على طلب الذاكرة من الجهاز الافتراضي الضيف، يقوم قسم الجذر بتخصيص واستعادة الذاكرة ديناميكياً. ومع ذلك، لا يتم تحرير الذاكرة المحجوزة كذاكرة تخزين مؤقت للصفحات (Page Cache) داخل نظام التشغيل الضيف بسهولة ما لم يكن النظام تحت ضغط.&lt;/li>
&lt;li>&lt;strong>WSL2 (الاستعادة الديناميكية للذاكرة)&lt;/strong>: يمتلك WSL2 آلية خاصة به حيث يقوم بانتظام بإرجاع (Reclaim) الذاكرة التي لم يعد هناك حاجة إليها داخل جهاز Linux الافتراضي (بما في ذلك ذاكرة التخزين المؤقت) إلى مضيف Windows. في الإصدارات الأولى من WSL2، كانت هناك مشكلة حيث تستهلك ذاكرة التخزين المؤقت للصفحات في Linux ذاكرة Windows (تضخم عملية Vmmem)، ولكن تم تحسين ذلك الآن من خلال تصحيحات النواة (Kernel Patches).&lt;/li>
&lt;/ul>
&lt;h3 id="33-خصائص-إدخالإخراج-القرص-vhdx-مقابل-ext4vhdx">3.3. خصائص إدخال/إخراج القرص (VHDX مقابل ext4.vhdx)
&lt;/h3>&lt;p>غالبًا ما يكون إدخال/إخراج القرص هو العائق (Bottleneck) الأكبر في أداء الجهاز الافتراضي.&lt;/p>
&lt;p>يتم حساب زمن انتقال (Latency) الإدخال/الإخراج $L_{total}$ على النحو التالي:&lt;/p>
$$ L_{total} = L_{guest\_fs} + L_{vmbus} + L_{host\_fs} + L_{physical\_disk} $$&lt;p>&lt;strong>في حالة Hyper-V&lt;/strong>:
تستخدم الأجهزة الضيفة النموذجية في Hyper-V أقراصاً افتراضية بتنسيق &lt;code>VHDX&lt;/code>. يتم معالجة طلبات الإدخال/الإخراج الصادرة من نظام الملفات (ext4 أو NTFS) داخل نظام التشغيل الضيف عبر برنامج تشغيل تخزين الجهاز الكتلي لـ VMBus (storvsc)، ويتم التعامل معها كوصول إلى ملف VHDX على نظام NTFS في جانب Windows.&lt;/p>
&lt;p>&lt;strong>في حالة WSL2&lt;/strong>:
تعمل توزيعات Linux الخاصة بـ WSL2 على نظام ملفات ext4 الأصلي المبني داخل ملف &lt;code>ext4.vhdx&lt;/code> مخصص. توفر عمليات الملفات داخل Linux (مثل داخل دليل &lt;code>~&lt;/code>) أداءً أصلياً مشابهاً لأداء Hyper-V المذكور أعلاه.
ومع ذلك، &lt;strong>عند الوصول إلى ملفات على جانب Windows (مثل &lt;code>/mnt/c/&lt;/code>) من Linux في WSL2&lt;/strong>، أو العكس، تختلف المعالجة بشكل كبير. يتم استخدام &lt;code>9P (بروتوكول نظام ملفات Plan 9)&lt;/code> للوصول عبر أنظمة التشغيل هذه.&lt;/p>
$$ L_{cross\_os} = L_{9p\_client} + L_{socket\_transfer} + L_{9p\_server} + L_{ntfs} $$&lt;p>نظراً لأن الوصول عبر بروتوكول 9P يترتب عليه حمل زائد كبير بسبب عملية التسلسل (Serialization)، فإن الأداء ينخفض بشكل ملحوظ (أحياناً بتأخير يزيد عن 10 أضعاف) للاستخدامات التي تقرأ وتكتب عدداً كبيراً من الملفات الصغيرة (مثال: &lt;code>npm install&lt;/code> في مشروع Node.js أو عمليات Git الموجودة في دليل على جانب Windows).
لذلك، &lt;strong>القاعدة الذهبية عند استخدام WSL2 هي وضع ملفات المشروع دائماً في نظام الملفات الأصلي لنظام Linux (تحت &lt;code>~/&lt;/code>)&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="4-هيكل-الشبكة-nat-والمفتاح-الافتراضي-default-switch-والشبكة-المدمجة-bridged">4. هيكل الشبكة: NAT، والمفتاح الافتراضي (Default Switch)، والشبكة المدمجة (Bridged)
&lt;/h2>&lt;p>تعد مرونة ميزات الشبكات أحد الاختلافات الرئيسية بين Hyper-V و WSL2.&lt;/p>
&lt;h3 id="41-شبكة-wsl2-القائمة-على-nat">4.1. شبكة WSL2 (القائمة على NAT)
&lt;/h3>&lt;p>تم تكوين شبكة WSL2 افتراضياً لتكون شبكة &amp;ldquo;NAT (ترجمة عنوان الشبكة)&amp;rdquo; باستخدام تقنية التبديل الافتراضي (Virtual Switch) الخاصة بـ Hyper-V.
يتم تلقائياً تخصيص عنوان IP خاص (مثال: &lt;code>172.20.x.x&lt;/code>) لجهاز Linux الافتراضي يختلف عن مضيف Windows. توجد آلية مدمجة تقوم بتوجيه الطلبات من مضيف Windows عبر &lt;code>localhost&lt;/code> إلى الخدمات (المنافذ) التي تم تشغيلها داخل WSL2، مما يسمح للمطورين باختبار خوادم الويب وغيرها دون القلق بشأن الشبكة.&lt;/p>
&lt;p>في الآونة الأخيرة، تم تقديم وضع شبكة جديد يسمى &amp;ldquo;وضع النسخ المتطابق (Mirrored Mode)&amp;rdquo; في إصدار المعاينة لـ WSL2. يهدف هذا إلى دعم IPv6 وتحسين التوافق مع اتصالات VPN (يمكن تكوينه في &lt;code>.wslconfig&lt;/code>).&lt;/p>
&lt;h3 id="42-المفتاح-الافتراضي-لـ-hyper-v-virtual-switch">4.2. المفتاح الافتراضي لـ Hyper-V (Virtual Switch)
&lt;/h3>&lt;p>يسمح Hyper-V ببناء شبكات متقدمة على مستوى المؤسسات. من خلال &amp;ldquo;مدير المفتاح الافتراضي (Virtual Switch Manager)&amp;quot;، فإنه يوفر ثلاثة أوضاع رئيسية:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>خارجي (External)&lt;/strong>: يربط بطاقة الشبكة الفعلية للجهاز المضيف بالمفتاح الافتراضي، ويسمح للجهاز الافتراضي الضيف بالانضمام مباشرة إلى الشبكة المادية (اتصال جسر - Bridged). يحصل الجهاز الافتراضي على عنوان IP من خادم DHCP من نفس الشبكة الفرعية للشبكة المادية.&lt;/li>
&lt;li>&lt;strong>داخلي (Internal)&lt;/strong>: يسمح فقط بالاتصال بين نظام التشغيل المضيف والجهاز الافتراضي، وبين الأجهزة الافتراضية وبعضها البعض. لا يمكن الوصول المباشر إلى الشبكات الخارجية.&lt;/li>
&lt;li>&lt;strong>خاص (Private)&lt;/strong>: يسمح فقط بالاتصال بين الأجهزة الافتراضية، ويحظر حتى الاتصال بنظام التشغيل المضيف. يستخدم لبناء بيئات اختبار معزولة.&lt;/li>
&lt;/ol>
&lt;h3 id="43-بناء-شبكة-hyper-v-المتقدمة-باستخدام-powershell">4.3. بناء شبكة Hyper-V المتقدمة باستخدام PowerShell
&lt;/h3>&lt;p>في بيئات التطوير والاختبار، إذا كنت ترغب في إنشاء شبكة NAT مخصصة للأجهزة الافتراضية، يمكنك الحصول على تحكم دقيق باستخدام PowerShell. فيما يلي مثال لبرنامج نصي يقوم بإنشاء مفتاح افتراضي داخلي وتكوين NAT عليه لتوفير وصول الأجهزة الافتراضية إلى الإنترنت.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. إنشاء مفتاح افتراضي داخلي&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SwitchName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HyperV-NatSwitch&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-VMSwitch&lt;/span> &lt;span class="n">-SwitchName&lt;/span> &lt;span class="nv">$SwitchName&lt;/span> &lt;span class="n">-SwitchType&lt;/span> &lt;span class="n">Internal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. تعيين عنوان IP لبطاقة الشبكة الافتراضية على جانب المضيف (عنوان IP الذي سيكون البوابة)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$GatewayIP&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;192.168.100.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NetPrefix&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mf">24&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$InterfaceAlias&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;vEthernet (&lt;/span>&lt;span class="nv">$SwitchName&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-NetIPAddress&lt;/span> &lt;span class="n">-IPAddress&lt;/span> &lt;span class="nv">$GatewayIP&lt;/span> &lt;span class="n">-PrefixLength&lt;/span> &lt;span class="nv">$NetPrefix&lt;/span> &lt;span class="n">-InterfaceAlias&lt;/span> &lt;span class="nv">$InterfaceAlias&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. تكوين شبكة NAT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NatName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HyperV-NatNetwork&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NatSubnet&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;192.168.100.0/24&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-NetNat&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="nv">$NatName&lt;/span> &lt;span class="n">-InternalIPInterfaceAddressPrefix&lt;/span> &lt;span class="nv">$NatSubnet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># أمر للتحقق&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-NetNat&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>من خلال هذا التكوين، ومن خلال تعيين عنوان IP يدوياً مثل &lt;code>192.168.100.x&lt;/code> والبوابة &lt;code>192.168.100.1&lt;/code> لضيف Hyper-V المحدد، يمكنك بناء مقطع NAT خاص يمكنه الاتصال بالعالم الخارجي عبر المضيف.&lt;/p>
&lt;hr>
&lt;h2 id="5-حالات-الاستخدام-ودليل-الاختيار-العملي">5. حالات الاستخدام ودليل الاختيار العملي
&lt;/h2>&lt;p>بناءً على الاختلافات في البنية والأداء التي تمت مناقشتها حتى الآن، سنحدد في أي المواقف يجب اعتماد أي تقنية.&lt;/p>
&lt;h3 id="51-السيناريوهات-التي-يجب-فيها-اختيار-wsl2">5.1. السيناريوهات التي يجب فيها اختيار WSL2
&lt;/h3>&lt;p>تم تصميم WSL2 خصيصاً لـ &amp;ldquo;تحسين إنتاجية المطورين&amp;rdquo;. إنه مثالي للاستخدامات التالية:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>تطوير الويب وتطوير السحابة الأصلية (Cloud-Native)&lt;/strong>: تطوير الحاويات باستخدام Docker Desktop (نهاية WSL2 الخلفية - Backend) أو Podman.&lt;/li>
&lt;li>&lt;strong>استخدام الأدوات المخصصة لنظام Linux&lt;/strong>: إذا كنت تستخدم بشكل يومي bash و grep و awk و sed، أو مجمعات GCC أو Clang لنظام Linux.&lt;/li>
&lt;li>&lt;strong>تطبيقات واجهة المستخدم الرسومية (WSLg)&lt;/strong>: عندما تريد تشغيل تطبيقات X11/Wayland الخاصة بـ Linux بسلاسة على سطح مكتب Windows.&lt;/li>
&lt;li>&lt;strong>التعلم الآلي وتطوير الذكاء الاصطناعي&lt;/strong>: التدريب السريع للنماذج باستخدام TensorFlow أو PyTorch مع الاستفادة من ميزة التمرير المباشر لوحدة معالجة الرسومات (GPU Passthrough) (مثل NVIDIA CUDA على WSL).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>ملاحظة&lt;/strong>: قد تواجه قيوداً إذا كنت ترغب في تخصيص النواة بدقة، أو إذا كنت تبني خدمات معقدة تعتمد بشكل كبير على systemd (على الرغم من أن systemd مدعوم حالياً، إلا أنه قد يكون معطلاً أو مقيداً بشكل افتراضي).&lt;/p>
&lt;h3 id="52-السيناريوهات-التي-يجب-فيها-اختيار-hyper-v">5.2. السيناريوهات التي يجب فيها اختيار Hyper-V
&lt;/h3>&lt;p>يهدف Hyper-V إلى &amp;ldquo;المحاكاة الافتراضية للبنية التحتية والعزل الكامل&amp;rdquo;. وهو ضروري للاستخدامات التالية:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>تشغيل أجهزة Windows الافتراضية&lt;/strong>: عند تشغيل إصدارات مختلفة من Windows (مثل Windows Server أو إصدار أقدم من Windows 10) كبيئة اختبار.&lt;/li>
&lt;li>&lt;strong>المحاكاة الافتراضية المتداخلة (Nested Virtualization)&lt;/strong>: عندما تريد تشغيل أجهزة افتراضية (Hyper-V أو KVM) داخل جهاز افتراضي آخر. لا غنى عنه لبيئات التحقق الخاصة بمهندسي البنية التحتية.&lt;/li>
&lt;li>&lt;strong>متطلبات الشبكة المتقدمة&lt;/strong>: عندما تحتاج إلى التحكم الصارم في تكوين الشبكة، مثل اتصالات الجسر الخارجية (الانضمام إلى نفس الشبكة المحلية LAN)، ووضع علامات VLAN (VLAN Tagging)، وتعيين بطاقات شبكة (NICs) متعددة.&lt;/li>
&lt;li>&lt;strong>اللقطات (نقاط الفحص - Checkpoints)&lt;/strong>: القدرة على حفظ حالة الجهاز الافتراضي في نقطة زمنية معينة والتراجع (Rollback) إليها على الفور في أي وقت. مفيد للغاية للاختبارات المدمرة للبرامج أو تحليل البرامج الضارة.&lt;/li>
&lt;li>&lt;strong>تخصيص الموارد الثابتة&lt;/strong>: عندما تريد تحديد عدد أنوية وحدة المعالجة المركزية وسعة الذاكرة بدقة، وتقليل التأثير على نظام التشغيل المضيف.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-دراسة-إنتاجية-الإدخالالإخراج-باستخدام-النموذج-الرياضي-الملحق">6. دراسة إنتاجية الإدخال/الإخراج باستخدام النموذج الرياضي (الملحق)
&lt;/h2>&lt;p>كمهندس أنظمة، عند تقييم حدود أداء الإدخال/الإخراج لكليهما، من المهم أن تفهم نظرياً العلاقة بين الإنتاجية (Throughput) $S$ وحجم الكتلة (Block Size) $B$.&lt;/p>
&lt;p>إنتاجية نقل البيانات $S$ هي كمية البيانات المنقولة لكل وحدة زمنية، ويمكن تمثيلها بالنموذج التالي:&lt;/p>
$$ S(B) = \frac{B}{L_{setup} + \frac{B}{R_{max}}} $$&lt;ul>
&lt;li>$B$: حجم الكتلة (بايت - Bytes)&lt;/li>
&lt;li>$L_{setup}$: الكمون الثابت (Fixed Latency) المرتبط بإعداد طلب الإدخال/الإخراج وتبديل السياق&lt;/li>
&lt;li>$R_{max}$: أقصى عرض نطاق ترددي للأجهزة في النسخ ونقل الأجهزة&lt;/li>
&lt;/ul>
&lt;p>في الوصول إلى الملفات عبر بروتوكول 9P في WSL2، يكون $L_{setup}$ كبيراً جداً (بسبب اتصال المآخذ (Socket) والتسلسل/إلغاء التسلسل للبروتوكول). لذلك، عندما يكون حجم الكتلة $B$ صغيراً (قراءة وكتابة كميات كبيرة من الملفات الصغيرة بحجم عدة كيلوبايتات)، يصبح تأثير $L_{setup}$ في المقام هو السائد، وتنخفض الإنتاجية $S$ بشكل كبير.
على العكس من ذلك، في الوصول إلى VHDX عبر VMBus في Hyper-V، يتم تحسين $L_{setup}$ إلى مستوى قريب من مقاطعات الأجهزة، مما يتيح الحفاظ على IOPS عالي حتى مع الكتل الصغيرة.&lt;/p>
&lt;p>هذا الواقع الرياضي هو الأساس المنطقي لأفضل الممارسات القائلة: &amp;ldquo;في WSL2، يجب ألا تضع ملفات مشروعك على جانب Windows&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="7-الخلاصة-تقنيتا-محاكاة-افتراضية-تتعايشان-معا">7. الخلاصة: تقنيتا محاكاة افتراضية تتعايشان معاً
&lt;/h2>&lt;p>لا يعني Hyper-V و WSL2 أن أحدهما أفضل من الآخر، بل هما &lt;strong>&amp;ldquo;حلان ذوا أهداف مختلفة&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>WSL2&lt;/strong> هو &amp;ldquo;أداة التكامل الأفضل&amp;rdquo; لكسر قوقعة نظام التشغيل Windows وتقديم نظام Linux البيئي بسلاسة وسرعة إلى مستخدمي Windows. ليس من المبالغة القول إنها بيئة واجهة سطر الأوامر (CLI) المثلى للمطورين.&lt;/li>
&lt;li>&lt;strong>Hyper-V&lt;/strong> هو &amp;ldquo;هايبرفايزر متكامل&amp;rdquo; يجلب قدرات العزل والإدارة القوية المزروعة في مراكز بيانات المؤسسات إلى سطح المكتب. لا يوجد مثيل له في بناء الشبكات واختبار نظام تشغيل Windows ومحاكاة بيئات البنية التحتية.&lt;/li>
&lt;/ul>
&lt;p>في بيئات Windows الحديثة، لا تتنافس هاتان التقنيتان مع بعضهما البعض، بل تتعايشان بشكل جميل على نفس منصة الأجهزة الافتراضية. من خلال استخدامهما في المكان المناسب حسب الغرض، سيصبح Windows أقوى محطة عمل هندسية وأكثرها مرونة في العالم.&lt;/p></description></item><item><title>الدليل الشامل لإعداد بيئة التطوير لنظام WSL2 (نظام ويندوز الفرعي لنظام لينكس)</title><link>http://kenji.blog/ar/p/wsl2-ultimate-development-setup-guide/</link><pubDate>Sat, 12 Sep 2026 23:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/wsl2-ultimate-development-setup-guide/</guid><description>&lt;img src="http://kenji.blog/p/wsl2-ultimate-development-setup-guide/img/eyecatch.jpg" alt="Featured image of post الدليل الشامل لإعداد بيئة التطوير لنظام WSL2 (نظام ويندوز الفرعي لنظام لينكس)" />&lt;p>يوفر &amp;ldquo;WSL2&amp;rdquo; (نظام ويندوز الفرعي لنظام لينكس 2)، والذي يقدم بيئة تطوير أصلية للينكس على ويندوز، أداة لا غنى عنها في تطوير البرمجيات الحديثة. ومع ذلك، هناك فرق شاسع في الأداء وتجربة التطوير بين الاستمرار في استخدامه في حالته الافتراضية، وبين فهم بنيته المعمارية وإجراء الضبط المناسب.&lt;/p>
&lt;p>في هذه المقالة، سنشرح بالتفصيل الشامل (بأكثر من 10,000 حرف) جميع الخطوات اللازمة لبناء &amp;ldquo;بيئة التطوير المطلوبة (المثالية)&amp;rdquo; التي يبحث عنها المهندسون المحترفون. بدءًا من شرح البنية المعمارية التي تشكل أساس WSL2، وصولاً إلى الإعدادات اللازمة لاستخراج أقصى أداء، وبناء بيئة طرفية (Terminal) مريحة، والتكامل السلس مع Docker و VS Code، وإعدادات الشبكة المتقدمة.&lt;/p>
&lt;hr>
&lt;h2 id="1-بنية-wsl2-وتطورها-عن-wsl1">1. بنية WSL2 وتطورها عن WSL1
&lt;/h2>&lt;p>لاستخراج كامل إمكانات WSL2، من المهم أولاً فهم بنيته الداخلية. تختلف المقاربة المستخدمة لتشغيل ثنائيات لينكس على ويندوز بشكل جذري بين الإصدار الأول (WSL1) و WSL2.&lt;/p>
&lt;h3 id="wsl1-طبقة-ترجمة-استدعاءات-النظام-system-calls">WSL1: طبقة ترجمة استدعاءات النظام (System Calls)
&lt;/h3>&lt;p>اعتمد WSL1 على آلية تترجم استدعاءات نظام لينكس إلى واجهة برمجة تطبيقات ويندوز (NT API) في الوقت الفعلي (Real-time). وبما أن هذا لم يستخدم جهازًا افتراضيًا (VM)، كان يتمتع بميزة أن العبء على الموارد كان ضئيلًا جدًا. ومع ذلك، كان من الصعب محاكاة استدعاءات النظام المعقدة بشكل كامل، مثل عمليات الإدخال والإخراج (I/O) لنظام الملفات، مما أدى إلى انخفاض مروع في الأداء، خاصة في العمليات التي تتعامل مع عدد كبير من الملفات الصغيرة، مثل &lt;code>npm install&lt;/code> في Node.js أو عمليات مستودع Git.&lt;/p>
&lt;h3 id="wsl2-جهاز-افتراضي-vm-للمرافق-خفيف-الوزن-ونواة-لينكس-كاملة">WSL2: جهاز افتراضي (VM) للمرافق خفيف الوزن ونواة لينكس كاملة
&lt;/h3>&lt;p>في WSL2، تم تجديد البنية المعمارية، وأصبحت نواة لينكس حقيقية، تم بناؤها بواسطة Microsoft، تعمل مباشرة على &amp;ldquo;جهاز افتراضي للمرافق خفيف الوزن&amp;rdquo; يستخدم مجموعة فرعية من بنية Hyper-V. هذا يضمن توافقًا بنسبة 100% مع استدعاءات النظام، ومن خلال استخدام قرص افتراضي (VHDX) يستخدم نظام ملفات ext4 الأصلي للينكس، تم تحسين أداء إدخال/إخراج الملفات بشكل كبير مقارنة بـ WSL1.&lt;/p>
&lt;p>يوضح مخطط Mermaid التالي الاختلافات الهيكلية بين WSL1 و WSL2.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
subgraph &amp;#34;بيئة نظام تشغيل ويندوز&amp;#34;
A[&amp;#34;نواة Windows NT&amp;#34;]
A --&amp;gt; F[&amp;#34;نظام ملفات NTFS (محرك C:)&amp;#34;]
end
subgraph &amp;#34;بنية WSL2&amp;#34;
B[&amp;#34;مراقب الأجهزة الافتراضية Hyper-V&amp;#34;]
B --&amp;gt; C[&amp;#34;جهاز افتراضي (VM) للمرافق خفيف الوزن&amp;#34;]
C --&amp;gt; D[&amp;#34;نواة لينكس (Microsoft)&amp;#34;]
D --&amp;gt; E[&amp;#34;مساحة مستخدم Ubuntu (glibc, bash, إلخ)&amp;#34;]
D --&amp;gt; G[&amp;#34;قرص افتراضي ext4 (.vhdx)&amp;#34;]
end
A -.-&amp;gt;|&amp;#34;مشاركة ملفات شبكة بروتوكول Plan 9 (9P)&amp;#34;| D
style B fill:#f9f,stroke:#333,stroke-width:2px
style D fill:#bbf,stroke:#333,stroke-width:2px
&lt;/pre>
&lt;p>الدرس المهم المستفاد من هذا الهيكل هو أن &lt;strong>&amp;ldquo;الوصول إلى الملفات الموجودة على جانب لينكس (داخل VHDX) سريع للغاية، ولكن الوصول إلى الملفات الموجودة على جانب ويندوز (&lt;code>/mnt/c/&lt;/code>) بطيء جدًا لأنه يمر عبر بروتوكول 9P&amp;rdquo;&lt;/strong>. يجب وضع الشيفرة المصدرية (Source code) للمشروع دائمًا ضمن الدليل الرئيسي (&lt;code>~&lt;/code>) على جانب WSL.&lt;/p>
&lt;hr>
&lt;h2 id="2-التحليل-الرياضي-للأداء-لماذا-يعتبر-wsl2-سريعا">2. التحليل الرياضي للأداء: لماذا يعتبر WSL2 سريعًا؟
&lt;/h2>&lt;p>دعونا نقيم تحسين أداء WSL2 بشكل كمي باستخدام نموذج رياضي. في تطوير البرمجيات، واحدة من أكثر العمليات استهلاكًا للوقت هي تلك التي تتضمن عمليات إدخال/إخراج (I/O) لعدد كبير من الملفات (مثل: تثبيت المكتبات أو البناء).&lt;/p>
&lt;p>يتم التعبير عن وقت التنفيذ الإجمالي للعملية $T_{total}$ بمجموع وقت الحوسبة بواسطة وحدة المعالجة المركزية $T_{compute}$ ووقت إدخال/إخراج القرص $T_{io}$.&lt;/p>
$$ T_{total} = T_{compute} + T_{io} $$&lt;p>في حالة WSL1، يتم تكبد عبء لتحويل عمليات جانب لينكس إلى عمليات NTFS، لذلك يتم نمذجة وقت الإدخال/الإخراج على النحو التالي. هنا، $n$ هو عدد عمليات الملفات، و $t_{ntfs\_syscall}$ هو وقت تنفيذ استدعاء النظام على جانب ويندوز، و $t_{trans}$ هو عبء طبقة الترجمة.&lt;/p>
$$ T_{wsl1\_io} = \sum_{i=1}^{n} (t_{ntfs\_syscall_i} + t_{trans_i}) $$&lt;p>من ناحية أخرى، في حالة WSL2، تُصدر النواة (Kernel) عمليات الإدخال/الإخراج مباشرة إلى نظام ملفات ext4، لذلك يكون العبء عبارة عن تأخير طفيف جداً بسبب المحاكاة الافتراضية $t_{virt}$ فقط.&lt;/p>
$$ T_{wsl2\_io} = \sum_{i=1}^{n} (t_{ext4_i} + t_{virt_i}) $$&lt;p>في أنظمة الملفات العامة، بما أن $t_{ext4} \ll t_{ntfs\_syscall} + t_{trans}$، فإنه عندما يكون $n$ كبيرًا جدًا (إجراء عشرات الآلاف إلى مئات الآلاف من عمليات الملفات)، يتسع الفارق في وقت الإدخال/الإخراج بين WSL1 و WSL2 بشكل أُسّي.&lt;/p>
&lt;p>بالإضافة إلى ذلك، إذا كانت نسبة عبء حساب وحدة المعالجة المركزية (CPU) في البيئة الافتراضية هي $\rho$، فإن المحاكاة الافتراضية الحديثة المدعومة بالأجهزة (Intel VT-x / AMD-V) ستبقيها عند حوالي $\rho \approx 0.01 \sim 0.03$ (1 إلى 3٪). وبالتالي، حتى في مهام الحساب البحتة، يتم تحقيق أداء بنسبة $97\% \sim 99\%$، وهو ما يمكن مقارنته ببيئة لينكس الأصلية (Native).&lt;/p>
&lt;hr>
&lt;h2 id="3-التثبيت-وبناء-الأساس">3. التثبيت وبناء الأساس
&lt;/h2>&lt;p>على أنظمة التشغيل Windows 10/11، أصبح تثبيت WSL2 بسيطًا للغاية. افتح PowerShell بصلاحيات المسؤول وقم بتنفيذ الأمر التالي.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># سيتم تثبيت WSL2 و Ubuntu بشكل افتراضي&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># لتحديد توزيعة معينة&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># يمكن التحقق منها باستخدام wsl --list --online&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span> &lt;span class="n">-d&lt;/span> &lt;span class="n">Ubuntu&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">24.04&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بعد التثبيت وإعادة التشغيل، سيُطلب منك إعداد اسم مستخدم UNIX وكلمة مرور عند بدء التشغيل لأول مرة. هذا المستخدم مستقل عن مستخدم ويندوز ويكون صالحًا فقط داخل WSL.&lt;/p>
&lt;p>إذا كنت تستخدم WSL1 بالفعل، فقم بالتحويل إلى WSL2 باستخدام الأوامر التالية.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># تحويل توزيعة موجودة إلى WSL2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-set-version&lt;/span> &lt;span class="n">Ubuntu&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># تعيين WSL2 كإصدار افتراضي للتوزيعات التي ستضاف مستقبلاً&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-set-default-version&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="4-أسرار-التحكم-في-الموارد-wslconfig-و-wslconf">4. أسرار التحكم في الموارد: .wslconfig و wsl.conf
&lt;/h2>&lt;p>أحد أكبر فخاخ WSL2 هو &amp;ldquo;الاستهلاك غير المحدود للذاكرة (تضخم عملية Vmmem)&amp;rdquo;. نظرًا لأن WSL2 يستخدم ذاكرة التخزين المؤقت للصفحات (Page cache) الخاصة بنواة لينكس، فإنه سيستهلك ذاكرة المضيف (ويندوز) بلا حدود في كل مرة يتم فيها إجراء إدخال/إخراج (I/O). لمنع ذلك، من الضروري تقييد الموارد باستخدام ملفات الإعدادات.&lt;/p>
&lt;p>تنقسم ملفات إعدادات WSL2 إلى قسمين: &lt;strong>&lt;code>.wslconfig&lt;/code> الذي يؤثر على نظام ويندوز بأكمله&lt;/strong>، و &lt;strong>&lt;code>wsl.conf&lt;/code> الذي يؤثر على التوزيعة الفردية من الداخل&lt;/strong>.&lt;/p>
&lt;h3 id="41-wslconfig-جانب-ويندوز">4.1. .wslconfig (جانب ويندوز)
&lt;/h3>&lt;p>قم بإنشاء ملف في مجلد ملف تعريف مستخدم ويندوز الخاص بك (&lt;code>C:\Users\&amp;lt;اسم المستخدم&amp;gt;\.wslconfig&lt;/code>) للتحكم في تخصيص الموارد للجهاز الافتراضي (VM).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># C:\Users\&amp;lt;اسم المستخدم&amp;gt;\.wslconfig&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[wsl2]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># أقصى قدر من الذاكرة المخصصة للجهاز الافتراضي. يوصى بنسبة 50% إلى 75% من إجمالي ذاكرة المضيف&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">memory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">16GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># عدد نوى وحدة المعالجة المركزية (CPU) المراد استخدامها (إذا تم حذفها، يتم استخدام جميع النوى)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">processors&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># حجم ملف التبادل (Swap file)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">swap&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">8GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># وجهة حفظ ملف التبادل (إذا كنت ترغب في توفير مساحة على محرك الأقراص C)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># swapfile=D:\\wsl\\swap.vhdx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تمكين إعادة توجيه localhost (للوصول إلى WSL من جانب ويندوز باستخدام localhost)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">localhostForwarding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تحرير الذاكرة تلقائيًا (نظام التشغيل Windows 11 فقط)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># يحرر ذاكرة التخزين المؤقت للصفحات ديناميكيًا ويمنع تضخم Vmmem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">autoMemoryReclaim&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">dropcache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[experimental]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ميزات الشبكات المتقدمة المتاحة في Windows 11 إصدار 22H2 وما بعده&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># يتيح هذا دعم IPv6 ومشاركة نفس عنوان IP بين WSL وويندوز&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">networkingMode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">mirrored&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">dnsTunneling&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">firewall&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">autoProxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="42-wslconf-جانب-لينكس">4.2. wsl.conf (جانب لينكس)
&lt;/h3>&lt;p>قم بتحرير &lt;code>/etc/wsl.conf&lt;/code> داخل WSL للتحكم في السلوك الخاص بالتوزيعة.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /etc/wsl.conf (تم التحرير داخل WSL)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[network]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تعطيل إنشاء ملف /etc/resolv.conf التلقائي عند بدء تشغيل WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># مفيد عندما تريد إعداد DNS خاص بك (مثال: 8.8.8.8)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">generateResolvConf&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تعيين اسم مضيف (hostname) مخصص&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">hostname&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">WSL-DevNode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[automount]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># الإعدادات عند تركيب محركات أقراص ويندوز (Mounting)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">enabled&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">options&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;metadata,uid=1000,gid=1000,umask=022&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تغيير نقطة تركيب محرك الأقراص C من /mnt/c إلى /c (لتقصير المسار)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">root&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[boot]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تمكين systemd (في WSL إصدار 0.67.6 وما بعده)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># يتيح هذا لـ snap والبرامج الخفية (daemons) المتنوعة (مثل Docker) العمل محليًا&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">systemd&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[user]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># المستخدم الذي سيتم تسجيل الدخول به افتراضيًا&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">default&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">kenji&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>لتطبيق هذه الإعدادات، تحتاج إلى تشغيل &lt;code>wsl --shutdown&lt;/code> في PowerShell لإيقاف تشغيل جهاز WSL الافتراضي بالكامل قبل إعادة تشغيله.&lt;/p>
&lt;hr>
&lt;h2 id="5-بيئة-الطرفية-المطلوبة-zsh--powerlevel10k">5. بيئة الطرفية المطلوبة: Zsh + Powerlevel10k
&lt;/h2>&lt;p>لن تتحسن إنتاجيتك مع بقاء bash الافتراضي. سنقوم ببناء أقوى موجه أوامر (Prompt) من خلال الجمع بين Zsh، الذي يتميز بوظائف إكمال قوية وإمكانيات رؤية واضحة، مع السمة (Theme) فائقة السرعة &amp;ldquo;Powerlevel10k&amp;rdquo;.&lt;/p>
&lt;h3 id="51-تثبيت-وإعداد-windows-terminal">5.1. تثبيت وإعداد Windows Terminal
&lt;/h3>&lt;p>قم بتثبيت &amp;ldquo;Windows Terminal&amp;rdquo; من متجر Microsoft. افتح إعدادات JSON (&lt;code>settings.json&lt;/code>)، واضبط ملف التعريف (Profile) الافتراضي على WSL (Ubuntu)، وقم بتغيير الخط إلى خط Nerd مخصص للتطوير (مثال: &lt;code>HackGen Console NF&lt;/code> أو &lt;code>MesloLGS NF&lt;/code>).&lt;/p>
&lt;h3 id="52-تثبيت-zsh-و-oh-my-zsh">5.2. تثبيت Zsh و Oh My Zsh
&lt;/h3>&lt;p>قم بتنفيذ الأوامر التالية في محطة طرفية لـ WSL.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تحديث الحزم وتثبيت Zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt upgrade -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y zsh git curl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تنفيذ برنامج نصي (Script) لتثبيت Oh My Zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sh -c &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="53-تقديم-powerlevel10k-والإضافات-plugins">5.3. تقديم Powerlevel10k والإضافات (Plugins)
&lt;/h3>&lt;p>قم بتثبيت الإضافات لتعزيز Zsh (تسليط الضوء على بناء الجملة والإكمال التلقائي للإدخال) وسمة Powerlevel10k.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Powerlevel10k&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone --depth&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> https://github.com/romkatv/powerlevel10k.git &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="nv">$HOME&lt;/span>&lt;span class="p">/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/themes/powerlevel10k
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zsh-autosuggestions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/zsh-users/zsh-autosuggestions &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="p">~/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/plugins/zsh-autosuggestions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zsh-syntax-highlighting&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="p">~/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/plugins/zsh-syntax-highlighting
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>قم بتحرير &lt;code>~/.zshrc&lt;/code> وتمكين السمة والإضافات.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># التغييرات في ~/.zshrc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ZSH_THEME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;powerlevel10k/powerlevel10k&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># أضفه إلى مصفوفة الإضافات (plugins)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">plugins&lt;/span>&lt;span class="o">=(&lt;/span>git zsh-autosuggestions zsh-syntax-highlighting&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>عندما تقوم بالحفظ وتشغيل &lt;code>source ~/.zshrc&lt;/code>، سيبدأ معالج إعداد Powerlevel10k (&lt;code>p10k configure&lt;/code>). اتبع التعليمات التي تظهر على الشاشة لتخصيص موجه الأوامر (Prompt) حسب رغبتك (نمط الموجه، وجود الرموز من عدمها، المعلومات التي سيتم عرضها، إلخ). سيتم عرض أسماء فروع Git وحالتها، وإصدار Node.js، ووقت تنفيذ الأوامر، وما إلى ذلك في الوقت الفعلي، مما يؤدي إلى زيادة كفاءة التطوير بشكل كبير.&lt;/p>
&lt;hr>
&lt;h2 id="6-vs-code-remote---تكامل-سلس-مع-wsl">6. VS Code Remote - تكامل سلس مع WSL
&lt;/h2>&lt;p>عند التطوير في WSL2، توفر إضافة &amp;ldquo;Remote - WSL&amp;rdquo; آلية للوصول السلس إلى الملفات داخل WSL من بيئة التطوير المتكاملة (Visual Studio Code) المثبتة على جانب ويندوز.&lt;/p>
&lt;h3 id="شرح-البنية-المعمارية">شرح البنية المعمارية
&lt;/h3>&lt;p>يوضح مخطط التسلسل (Sequence diagram) التالي كيف يتصل VS Code مع WSL2.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;المطور&amp;#34;
participant V as &amp;#34;واجهة مستخدم VS Code (ويندوز)&amp;#34;
participant S as &amp;#34;خادم VS Code (WSL2)&amp;#34;
participant F as &amp;#34;نظام ملفات ext4 (WSL2)&amp;#34;
U-&amp;gt;&amp;gt;V: &amp;#34;كتابة `code .` في محطة WSL&amp;#34;
V-&amp;gt;&amp;gt;S: &amp;#34;إنشاء اتصال RPC عبر Vsock&amp;#34;
Note over V,S: الاتصال باستخدام مآخذ Hyper-V بدلاً من TCP/IP
S-&amp;gt;&amp;gt;F: &amp;#34;قراءة الملفات المصدرية / تشغيل أداة التحقق (Linter)&amp;#34;
F--&amp;gt;&amp;gt;S: &amp;#34;إرجاع البيانات والتحليل&amp;#34;
S--&amp;gt;&amp;gt;V: &amp;#34;بث نتائج خادم اللغة (Language Server) إلى واجهة المستخدم&amp;#34;
V--&amp;gt;&amp;gt;U: &amp;#34;عرض تمييز بناء الجملة (syntax highlighting) والأخطاء&amp;#34;
&lt;/pre>
&lt;p>يعمل VS Code على جانب ويندوز كمجرد &amp;ldquo;عميل خفيف (واجهة مستخدم)&amp;quot;، وتتم معالجة جميع المهام الثقيلة مثل خادم اللغة (Language Server)، والمصحح (Debugger)، وتنفيذ المحطة الطرفية بواسطة &amp;ldquo;خادم VS Code&amp;rdquo; على جانب WSL. يتيح لك ذلك الحفاظ على نظافة البيئة الخاصة بك من خلال استخدام جانب WSL فقط، دون تثبيت Node.js أو Python على جانب ويندوز.&lt;/p>
&lt;h3 id="إعدادات-vs-code-الأساسية">إعدادات VS Code الأساسية
&lt;/h3>&lt;p>من &amp;ldquo;الإضافات&amp;rdquo; (Extensions) في VS Code، قم بتثبيت &lt;strong>&amp;ldquo;WSL&amp;rdquo; (ms-vscode-remote.remote-wsl)&lt;/strong>. بعد ذلك، ببساطة انتقل إلى دليل المشروع في محطة WSL وقم بتنفيذ &lt;code>code .&lt;/code>، وسيتم تشغيل VS Code على جانب ويندوز مع فتح ذلك الدليل.&lt;/p>
&lt;p>&lt;strong>ملاحظة هامة (مشكلة رمز نهاية السطر (Line Ending)):&lt;/strong>
رموز نهاية السطر تختلف بين ويندوز ولينكس (ويندوز يستخدم &lt;code>CRLF&lt;/code>، ولينكس يستخدم &lt;code>LF&lt;/code>). عند التطوير على WSL، تأكد من توحيد إعداد &lt;code>core.autocrlf&lt;/code> في Git وإعداد الملف الافتراضي في VS Code إلى &lt;code>LF&lt;/code>. سيؤدي الفشل في القيام بذلك إلى التسبب في أخطاء غامضة عند تشغيل نصوص الصدفة (Shell scripts) أو حاويات Docker.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># إعداد رمز نهاية السطر (Line Ending) لـ Git في WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global core.autocrlf input
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>أضف الإعدادات التالية إلى &lt;code>settings.json&lt;/code> الخاص بـ VS Code (الإعدادات عن بُعد).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;files.eol&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;terminal.integrated.defaultProfile.linux&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;zsh&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-تحسين-docker-desktop-وتكامله-مع-wsl2">7. تحسين Docker Desktop وتكامله مع WSL2
&lt;/h2>&lt;p>هناك طريقتان رئيسيتان لاستخدام Docker في بيئة WSL2.&lt;/p>
&lt;ol>
&lt;li>تثبيت &lt;strong>Docker Desktop لنظام ويندوز&lt;/strong> وتمكين ميزة تكامل WSL2.&lt;/li>
&lt;li>تثبيت &lt;strong>محرك Docker الأصلي (Docker Engine)&lt;/strong> مباشرة داخل WSL2 (مثل Ubuntu).&lt;/li>
&lt;/ol>
&lt;h3 id="النهج-1-docker-desktop-موصى-به">النهج 1: Docker Desktop (موصى به)
&lt;/h3>&lt;p>يُوصى بهذا النهج غالبًا لأنه يسهل الإدارة عبر واجهة المستخدم الرسومية (GUI) والوصول الشفاف إلى الحاويات (Containers) بين ويندوز و WSL. تحقق من التالي في إعدادات Docker Desktop (Settings).&lt;/p>
&lt;ul>
&lt;li>في &lt;code>General&lt;/code> -&amp;gt; ضع علامة اختيار على &lt;code>Use the WSL 2 based engine&lt;/code>.&lt;/li>
&lt;li>في &lt;code>Resources&lt;/code> -&amp;gt; &lt;code>WSL Integration&lt;/code> -&amp;gt; ضع علامة اختيار على &lt;code>Enable integration with my default WSL distro&lt;/code>، وقم بتشغيل مفتاح التبديل للتوزيعة التي تستخدمها (Ubuntu).&lt;/li>
&lt;/ul>
&lt;p>يسمح لك ذلك بتنفيذ أوامر &lt;code>docker&lt;/code> مباشرة من محطة WSL2، ويتم الاتصال ببرنامج Docker الخفي (Daemon) من خلال أجهزة افتراضية خفيفة الوزن مخصصة يديرها Docker Desktop (&lt;code>docker-desktop&lt;/code> و &lt;code>docker-desktop-data&lt;/code>).&lt;/p>
&lt;h3 id="النهج-2-التثبيت-المباشر-لمحرك-docker-الأصلي-native-docker-engine">النهج 2: التثبيت المباشر لمحرك Docker الأصلي (Native Docker Engine)
&lt;/h3>&lt;p>إذا كان هناك قيود على شبكة الشركة (مثل تجنب الإصدار المدفوع من Docker Desktop) أو كنت ترغب في تقليل عبء الأداء إلى أدنى حد ممكن، فقم بتمكين &lt;code>systemd&lt;/code> في &lt;code>/etc/wsl.conf&lt;/code> وقم بتثبيت Docker كخادم Ubuntu نقي.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># مقتطف من خطوات التثبيت الرسمية لـ Docker في WSL2 Ubuntu مع تفعيل systemd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install ca-certificates curl gnupg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo install -m &lt;span class="m">0755&lt;/span> -d /etc/apt/keyrings
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p">|&lt;/span> sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod a+r /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># إضافة المستودع (Repository)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;deb [arch=&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>dpkg --print-architecture&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>. /etc/os-release &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$VERSION_CODENAME&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34; stable&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># إضافة المستخدم الحالي إلى مجموعة docker (للتشغيل بدون sudo)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo usermod -aG docker &lt;span class="nv">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بعد إعادة التشغيل، سيعمل &lt;code>systemctl start docker&lt;/code> تمامًا كما هو الحال في بيئة لينكس الأصلية، مما يوفر أداءً عاليًا.&lt;/p>
&lt;hr>
&lt;h2 id="8-تكامل-مفاتيح-ssh-المصادقة-السلسة-بين-ويندوز-و-wsl">8. تكامل مفاتيح SSH: المصادقة السلسة بين ويندوز و WSL
&lt;/h2>&lt;p>تعد إدارة مفاتيح SSH المنفصلة على ويندوز و WSL لاستنساخ Git (Git clone) عبر SSH أو الاتصال بخوادم عن بُعد عبر SSH مهمة شاقة جدًا. لتحقيق التوازن بين الأمان والراحة، سنقوم بإعداد جسر (Bridge) لوكيل SSH (SSH Agent) الذي يعمل على جانب ويندوز (أو مدير كلمات مرور مثل 1Password) إلى جانب WSL.&lt;/p>
&lt;p>هنا، سنشرح الطريقة الأكثر أمانًا وحداثة باستخدام &lt;strong>ميزة وكيل SSH في 1Password&lt;/strong> أو &lt;strong>وكيل مصادقة OpenSSH في ويندوز (OpenSSH Authentication Agent)&lt;/strong>، وإعادة توجيهها إلى مقبس نطاق UNIX (UNIX domain socket) الخاص بـ WSL2 باستخدام &lt;code>npiperelay&lt;/code> أو &lt;code>socat&lt;/code>.&lt;/p>
&lt;h3 id="إعادة-توجيه-المقبس-socket-forwarding-لوكيل-ssh-agent">إعادة توجيه المقبس (Socket Forwarding) لوكيل ssh-agent
&lt;/h3>&lt;p>عادة، يجب تحويل وكيل SSH المقدم كأنبوب مسمى (Named Pipe) في ويندوز إلى ملف مقبس (Socket file) على جانب WSL. من السهل استخدام &lt;code>wsl-ssh-agent&lt;/code> أو الميزات المقدمة من 1Password.&lt;/p>
&lt;p>من شاشة إعدادات 1Password، قم بتمكين &amp;ldquo;Developer&amp;rdquo; (المطور) -&amp;gt; &amp;ldquo;Use SSH agent&amp;rdquo; (استخدام وكيل SSH).
بعد ذلك، أضف الإعدادات التالية إلى &lt;code>~/.zshrc&lt;/code> أو &lt;code>~/.bashrc&lt;/code> على جانب WSL لربط المقبس (Socket bind) تلقائيًا عند تسجيل الدخول.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># إضافة إلى ~/.zshrc (مثال عند استخدام وكيل SSH الخاص بـ 1Password)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">SSH_AUTH_SOCK&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$HOME&lt;/span>/.ssh/agent.sock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># إذا لم يكن المقبس موجودًا عند بدء تشغيل WSL، أو إذا لم تكن العملية مرتبطة (bind)، فاستخدم socat و npiperelay لإعادة التوجيه (forward)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ALREADY_RUNNING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>ps -aux &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> wc -l&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="nv">$ALREADY_RUNNING&lt;/span> -eq &lt;span class="m">0&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -S &lt;span class="nv">$SSH_AUTH_SOCK&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rm &lt;span class="nv">$SSH_AUTH_SOCK&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># تشغيل socat في الخلفية وتوصيل الأنبوب المسمى (Named Pipe) لجانب ويندوز بمقبس UNIX لجانب WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">(&lt;/span>setsid socat UNIX-LISTEN:&lt;span class="nv">$SSH_AUTH_SOCK&lt;/span>,fork EXEC:&lt;span class="s2">&amp;#34;npiperelay.exe -ei -s //./pipe/openssh-ssh-agent&amp;#34;&lt;/span>,nofork &lt;span class="p">&amp;amp;&lt;/span>&lt;span class="o">)&lt;/span> &amp;gt;/dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>※يتطلب هذا تثبيت &lt;code>npiperelay.exe&lt;/code> وإضافته إلى المسار (Path) على جانب ويندوز مسبقًا.&lt;/p>
&lt;p>بمجرد اكتمال هذا الإعداد، عند تشغيل &lt;code>ssh-add -l&lt;/code> من محطة WSL، سيتم عرض قائمة بالمفاتيح العامة (Public keys) المسجلة في 1Password أو على جانب ويندوز. يتيح لك هذا اجتياز المصادقة بأمان دون الحاجة إلى نسخ ملفات المفاتيح الخاصة (Private keys) إلى WSL.&lt;/p>
&lt;hr>
&lt;h2 id="9-الصيانة-تحسين-ضغط-ملفات-vhdx-المتضخمة">9. الصيانة: تحسين (ضغط) ملفات VHDX المتضخمة
&lt;/h2>&lt;p>أحد أكبر عيوب WSL2 هو أن &amp;ldquo;حجم ملف القرص الافتراضي على جانب ويندوز (.vhdx) لا يتقلص تلقائيًا حتى لو قمت بحذف صور Docker أو الملفات&amp;rdquo;. إذا واصلت التطوير لفترة طويلة، سيتضخم ملف ext4.vhdx إلى عشرات أو مئات الجيجابايت.&lt;/p>
&lt;p>لتحرير مساحة على القرص، يجب عليك تحسين (Compact) ملف VHDX من جانب ويندوز بانتظام.&lt;/p>
&lt;ol>
&lt;li>أولاً، قم بإيقاف تشغيل WSL بالكامل.
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-shutdown&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>افتح PowerShell بصلاحيات المسؤول، وقم بتنفيذ أمر &lt;code>diskpart&lt;/code> أدناه، أو أمر &lt;code>Optimize-VHD&lt;/code> من وحدة Hyper-V (يمكن استخدام الأخير فقط إذا تم تمكين Hyper-V).&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># إذا كانت وحدة Hyper-V متاحة&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Optimize-VHD&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$env:LOCALAPPDATA&lt;/span>&lt;span class="s2">\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&amp;#34;&lt;/span> &lt;span class="n">-Mode&lt;/span> &lt;span class="n">Full&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># في حالة استخدام diskpart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">diskpart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># أدخل بشكل تفاعلي داخل الموجه التالي&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">select &lt;/span>&lt;span class="n">vdisk&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="s2">&amp;#34;C:\Users\&amp;lt;اسم المستخدم&amp;gt;\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">attach&lt;/span> &lt;span class="n">vdisk&lt;/span> &lt;span class="n">readonly&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">compact&lt;/span> &lt;span class="n">vdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">detach&lt;/span> &lt;span class="n">vdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">exit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>من خلال إجراء هذه العملية بانتظام، يمكنك استعادة المساحة المستهلكة بلا داعٍ على محرك الأقراص C.&lt;/p>
&lt;hr>
&lt;h2 id="10-خاتمة">10. خاتمة
&lt;/h2>&lt;p>لقد تجاوز WSL2 تمامًا إطار كونه مجرد &amp;ldquo;لينكس إضافي يعمل على ويندوز&amp;rdquo;، وتطور ليصبح منصة تطوير قوية لا تقل أهمية عن نظام MacOS أو أجهزة لينكس الأصلية (Native)، بل وربما تتفوق عليها.&lt;/p>
&lt;p>من خلال تطبيق جميع الإعدادات الموضحة في هذا الدليل (تحسين الموارد باستخدام &lt;code>.wslconfig&lt;/code>، وتحسين المحطة الطرفية (Terminal) باستخدام Zsh + Powerlevel10k، والوصول الشفاف باستخدام VS Code Remote، بالإضافة إلى دمج SSH وصيانة VHDX)، ستحصل على &amp;ldquo;بيئة تطوير مطلوبة&amp;rdquo; خالية من التوتر، سريعة، وآمنة.&lt;/p>
&lt;p>على الرغم من أن إعداد البيئة يتطلب بعض الجهد، بمجرد الانتهاء من ضبط الإعدادات، ليس هناك شك في أن إنتاجيتك الهندسية ستتحسن بشكل كبير في المستقبل. لا تتردد في استكشاف المزيد من التخصيصات بناءً على هذا الدليل لتناسب مشاريعك وتفضيلاتك الخاصة.&lt;/p></description></item></channel></rss>