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.

Categories
Technical

Host ASP.Net WebApps On Linux

تكمن المشكلة في إنشاء موقع إلكتروني على الإنترنت في الإستضافة الخاصة بالموقع والتي تأتيك بين أحد الإختيارات التالية:

إستضافة Windows أم إستضافة Linux

وهل العميل على إستعداد للدفع مقابل هذه الإستضافة، وهذا كان هو التحدى لإي مبرمج يعمل بـ لغة ASP البرمجية لإنشاء وبرمجة المواقع

اليوم وبعد أن أصبح لدينا ASP vNext والذي أصبح منتح مفتوح المصدر بالكامل أصبح لدينا خوادم غير الـ IIS والتي كانت لا تعمل إلّا على خوادم Windows فقط

لم نكن نحلم في يوم من الأيام أن نستطيع عمل ASP.NET WebApp ونقوم بإنشاء إستضافة خاصة به على خادم Linux

الآن أصبح الأمر ممكنًا ومتاح للجميع، فمنذ فترة أعلنت شركة Microsoft عن ASP.NET vNext وأطلقت عليه الآن “ASP.Net 5” ويمكنك تطوير موقع كامل على خادم OSX و Linux ويمكنك إستضافة الموقع عليه

كيف يمكننا فعل ذلك؟ وماذا حدث بالظبط، وما هي الخطوات التي يجب أن اتخذها وما هي الـ vNext ؟

مبدأيًا: الـ ASP vNext جميعها مفتوحة المصدر يمكنك التعديل عليها بالكامل كما تحب وقراءة ومشاهدة الكود المصدري، بالإضافة إلى إرسال إقتراحات لـ شركة مايكروسوفت خاصة بتعديلاتك.

سوف تجد الـ repo على GitHub من هنا:

https://github.com/aspnet/home

يذكر أنّ شركة مايكروسوفت في الآونة الأخيرة بدأت تتحد مع فريق Mono فيمكننا في الفترة القادمة توقع ان اي تحديثات خاصة بالـ .NET سوف نجدها في الحال على Mono ولن نضطر للإنتظار بعد الآن بالإضافة إلى إن Mono كـ IDE سوف تتحسن بصورة كبيرة.

ما تم في ASP vNext كان ببساطة نقلة تاريخية لعدة أسباب:

١- الـ CSharp Compiler موجود مفتوح المصدر تحت اسم Roslyn.

٢- لسنا بحاجة إلى إستخدام الـ IIS Web Server بعد الآن فقد أصبح هناك Kestrel وبسببه يمكننا إستضافة المواقع على خوادم تعمل بـ Linux وكذلك OSX.

٣- أصبح الآن كل شئ على Nuget.

٤- بعد أن كان لدينا ملفين في المشروع الواحد، ملف خاص بملفات المشروع والثاني خاص بـ Nuget Packages أصبح الاثنين في ملف واحد تحت اسم Project.json

في هذه التدوينة سوف نتكلم عن كيف تبرمج Website بـاستخدام ASP vNext و و ما هي الخطوات اللازمة حتى تستضيف الموقع على Linux Machine ،الامثلة القادمة ستكون مرتبطة بتوزيعات لينكس المبنية على Debian.

مبدأيًا لكي تبرمجASP.Net Website على الويندوز فمن الممكن ان تستعملVisual Studio 2015 و هذا أسهل حل .. أيضًا ، من الممكن ان تستعمل اي محرر أخر.

فلنفترض الآن انك انتهيت من برمجة ال Website بالكامل و تريد استضافته على أحد خوادم Linux فما هي الخطوات اللازمة لذلك؟

اذا كنت تعتقد ان الخطوات القادمة من الصعب تنفيذها فلا تقلق ، فقد جهزنا لك Script سوف يقوم بكل هذه المهام من تلقاء نفسه.

1- تحتاج الى Mono و يكون أعلى من 3.4.1:

اكتب هذه الاوامر في ال Terminal لتحميل و تنصيب Mono 3.8.0

sudo apt-get install build-essential

wget http://download.mono-project.com/sources/mono/mono-3.8.0.tar.bz2

tar -xvf mono-3.8.0.tar.bz2

cd mono-3.8.0/

./configure –prefix=/usr/local

make

sudo make install

2- نحتاج الى تحميل SSL Certificates خاصة بميكروسوفت:

sudo certmgr -ssl -m https://go.microsoft.com

sudo certmgr -ssl -m https://nugetgallery.blob.core.windows.net

sudo certmgr -ssl -m https://nuget.org

sudo certmgr -ssl -m https://www.myget.org/F/aspnetvnext/

mozroots –import –sync

3- نحتاج الى KVM و KRE :

*اكتب ال UserName الخاص بـ السيرفر مكان {USER NAME}

(KRE (K Runtime Enviroment) , KVM (K Version Manager

sudo apt-get install curl
curl -sSL https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.sh | sh && source ~/.kre/kvm/kvm.sh
sudo -s
source /home/{USER NAME}/.kre/kvm/kvm.sh
kvm upgrade

4- الآن كل ما نحتاجه لتشغيل Kestrel Web Server اصبح جاهز ، و لكن Kestrel يعتمد على libuv فيجب تنصيبها له:

sudo apt-get install gyp

wget http://dist.libuv.org/dist/v1.0.0-rc2/libuv-v1.0.0-rc2.tar.gz

tar -xvf libuv-v1.0.0-rc2.tar.gz

cd libuv-v1.0.0-rc2/

./gyp_uv.py -f make -Duv_library=shared_library

make -C out

sudo cp out/Debug/lib.target/libuv.so /usr/lib/libuv.so.1.0.0-rc2

sudo ln -s libuv.so.1.0.0-rc2 /usr/lib/libuv.so.1

5- تحميل Template جاهز حتى نتأكد ان كل الخطوات السابقة تمت بطريقة صحيحة :

sudo apt-get install git

git clone http://github.com/aspnet/home

cd home/samples/HelloMvc

kpm restore

kpm build

من الممكن عمل build من خلال الأمر kpm build ، او اذا كنت تريد ان تشغل الserver نكتب k kestrel

الان لو كتبت k kestrel و رايت الرسالة Started اذا فمن الممكن تعاين الموقع من خلال الbrowser ادخل على

http://localhost:5004

ملحوظة: يتم كتابة الاوامر مثل k kestrel او kpm build بداخل ال Directory الخاصة بالموقع.

*اذا كنت لا تريد القيام بكل هذه الخطوات من الممكن تحميل ال Script:

https://gist.github.com/ShawkyZ/0b3831329a0372e33aef#file-kestrel-configuration

*اذا كنت تريد ان تستضيف ال Site على Azure VM مثلًا ، فمن الممكن ان تنشئ واحدة و تستخدم (Putty) مثلًا لكي تتصل بها و تبدأ بعمل كل الخطوات السابقة و عند الانتهاء لا تنسى ان تضبط اعدادات ال EndPoint الخاصة بال VM.