Categories
Technical

Windows Subsystem For Linux

الطريقة التليقيدية لأي حد كان بيحب يشغل اي Linux Binary او اي شيء لو علاقة بعالم Linux و هو شغال على Windows بصورة أساسية كانت انه يشتغل على Virtual Machine و جوة ال Virtual Machine دي كان بيشتغل على توزيعته المفضلة.

لحد النهردة ناس كتير بتشتغل بالطريقة دي (و انا لحد فترة قصيرة كنت بعمل نفس الموضوع)، لحد سنة ٢٠١٦ Microsoft أعلنت عن ما يسمى بنظام ويندوز الجزئي للينكس Windows Subsystem For Linux او ما يسمى بالـ WSL.

الهدف منه باختصار تمكين نظام تشغيل ال Windows من فهم و ترجمة و تشغيل اي Linux based Binaries.

في ٢٠١٦ كان اول اصدار من WSL، دي صورة لـ Ubuntu Bash بيشتغل من Windows Machine من غير اي Virtualization

Windows Subsystem for Linux: Here's where it's going next ...

مع اول اصدار من WSL كنت تقدر تعمل حاجات كتيرة تقدر تعملها من Windows كأنك شغال مع Virtual Machine من غير ما تلاحظ اي فرق.

Architecture

Windows Subsystem For Linux – Vegibit

  • في الاول فيه الLinux Distros و دي ممكن تنزلها من ال Windows Store زي اي Store App.
  • و انت شغال مثلًا على Ubuntu WSL، و Ubuntu هتحتاج انها تعمل اي System Operation زي، Memory Management او IO.
  • ال System Calls هتعدي على Translation Layer، ال Layer ده هيترجم ال System Calls للمقابل ليها من ال Windows System Call.
  • بعد كده ال Call دي هتروح لل NT Kernel.
  • لما الNT Kernel تبعت ال Response بتاعها هيتم ترجمته للمقابل ليها لل Linux Kernel.

Limitations

التحدي لMicrosoft كان ان كل System Call بتحصل لازم يتم ترجمتها لما يقابلها لل Linux.

المشكلة ان في بعض الأحيان Windows و Linux بينهم اختلافات جذرية.

مثال:

في الصورة موضح عملية بسيطة و الاختلاف بين ال Windows و ال Linux في طريقة التعامل مع هذه العملية.

لما بنيجي نعمل Rename ل Folder ف Windows و ال Folder ده جواه ملف مفتوح، نظام تشغيل Windows بيرفض العملية دي تمامًا و لكن في Linux العملية بتكون مقبولة بصورة عادية.

طبعًا كان فيه مشاكل تانية كتيرة، مش هنقدر نحصرها ولا نعدها، دي صورة من ال Github Issues اللي كانت موجودة، و مكنتش Microsoft قادرة تحلها بسبب الاختلافات الجذرية اللي اتكلمنا عليها، و بسبب برضه انهم مش قادرين يدعموا System Calls معينة.

كان فيه مشاكل أخرى زي بطئ ملحوظ في عمليات الIO و مشاكل مع Docker.

WSL 2

في النسخة التانية من WSL حصل تغيير جذري، مبقاش فيه Translation Layer زي ف WSL1 ، و لكن الفرق كان ان Microsoft عملت Linux Kernel خاصة بيها، و خلت ال Kernel دي تشتغل بداخل Lightweight Virtual Machine.

WSL 2 Architecture and Lifecycle

  1. ال Entry Point هي ال wsl.exe، بيتم استخدامه عشان نشوف ايه التوزيعات اللي متنصبة و ايه اللي شغال منها، و ممكن ننهي او نشغل اي توزيعة منهم من خلاله.
  2. Lxss Manager Service هي المسؤولة عن التعامل المباشر مع ال WSL.
  3. Host Compute Service هي المسؤولة عن انشاء ال Lightweight VM.
  4. بعد انشاء ال VM تقوم WSL بعمل Mapping لـ الLinux Distro File System في الحالة دي ممكن يكون Ext4 File System.
  5. بعدها بيتم تشغيل Init Process الل بدورها هتبدأ bash shell.
  6. بيتم عمل delegation للـ stdin/stdout calls من ال VM الى Windows و العكس من خلال vSockets او HPSockets.

WSL Interactions with Windows Files

بعد ما ال WSL Distro Bash Shell هتشتغل هنلاحظ اننا واقفين على /mnt/C و دي network mapping للـ Windows C Partition.

ده من خلال ال 9P Protocol و هو File Server موجود على Windows لتمكين عمليات ال IO من ال WSL مع الملفات الموجودة على Windows.

فيه برضه File Server موجود على Distro عشان يمكننا من التعامل مع ملفات نظام تشغيل ال Linux.

 

Shared Enviroment Variable $WSLENV

واحدة من المزايا القوية من وجهة نظري هي وجود Enviroment Variable مشترك بين ال WSL VM و ال Windows Host.

ده بيمكننا من تشغيل اي Windows Executable من داخل ال bash shell.

مثال: ممكن و انت بداخل ال bash shell تكتب code . وهيتم تشغيل VS Code من ال Windows Host و هيكون بصورة اوتامتيك على ال Remote Debugging Mode و ده هيمكنك بسهولة انك تكتب و تـ debug الكود بتاعك من خلال VS Code على الويندوز و الكود نفسه بداخل ال Linux Distro.