WSL 2.0 ארכיקטורה והתקנה

פוסט בנושא WSL 2.0 – ארכיקטורה, איך מתקינים ועוד.

להתקין הפצת לינוקס לצד Windows 10 זה אתגר מעניין ולעבוד עם שתי המערכות יחדיו הוא אתגר מעניין לא פחות, וזאת מבלי לגרום באופן כלשהוא לבעיה באחת מן המערכות בדרך.

בעבר היה נפוץ להתקין לינוקס לצד Windows על אותה חומרה, ומאז אותם ימים בהם החומרה הפכה להיות פחות יקרה, ובמקביל מערכות וירטואליות הפכו להיות נפוצות בכל סביבה, התוצאה היא אחת – קל ופשוט יותר להתקין מערכת ספציפית אחת על חומרה ייעודית.

ישנם מצבים מסוימים שבהם ניתן לעבוד עם הפצת לינוקס על Windows 10 והפעם באמצעות WSL, או ליתר דיוק עם הגרסה המעודכנת והיא הגרסה WSL 2.0.

סביבת WSL

הגרסה החדשה של סביבת WSL 2 זמינה בגרסת Windows 10 עם בילד 18917 ומעלה וניתנת להתקנה מתוך Optional Feeatures. בנוסף לכף WSL 2 תהיה זמינה מתוך  development builds בגרסת Windows 10 20H1 (הגרסה תהיה זמינה לקראת אפריל 2020).

סביבת WSL (הגרסה הראשונה)

הסביבה אשר קיימת בגרסאות Windows 10 בילד 1607 ומעלה היא סביבת WSL 1 שיצאה בגרסתה הראשונה, ומתנהגת באופן מעט שונה מאשר סביבת WSL 2.

סביבת WSL 1 בגרסתה הראשונה רצה על רכיב פנימי שנקרא LXSS Manager ולכן בתחילת דרכה הפקודות היו מבוססות בעיקר על lxrun.exe, החל מגרסת Windows 10 1803 נעשה שינוי ברכיב (ללא כל קשר לסביבת WSL 2) והפקודות מתבססות בעיקר על wsl.exe.

הרכיב LXSS Manager Service מתקשר באמצעות הדרריברים של lxss.sys ושל lxcore.sys מול Bash ואחרים אך לא מול הפצות לינוקס, ולכן ישנו API שעובד מול לינוקס קרנל ומבצע תשאולים ותרגומים

לדצ זה ישנם הרשאות ספצפיות לקבצים ותיקיות בכדי שלא יהיה צורך ביצירת Partition של לינוקס, ובכדי שקבצים בינאריים של לינוקס לא ירוצו על Windows שלא מותקנת בה סביבת WSL.

בכל ריצה של WSL 1 ישנו Instance של לינוקס אשר נפתח בופאן אוטומטי ברמת משתמש ובכל סיום אותו לינוקס Instance נסגר באופן אוטומטי.

הפקודה wsl.exe מאפשרת לנהל הפצות לינוקסף לתחזק את אותן הפצות, להתקין ולהסיר הפצות לינוקס, לבצע פעולות בינאריות וכן הלאה. בנוסף לכך ניתן להריץ את wsl.exe מתוך ממשק CMD או מתוך ממשק PowerShell.

לסביבת WSL 1 ישנם חסרונות רבים למרות הפעולות הרבות שניתן ליישם איתה, כי היא עדיין אינה יכולה לבצע פעולות כמו של אמולציה לחומרה, אין אפשרות להתקין ולעבוד עם כלל האפשרויות של הפצות לינוקס והביצועים הם איטיים.

סביבת WSL2

סביבת WSL 2 מגיעה בגרסאות Windows 10 בילד 18917 ומעלה, ובפעם הראשונה מביאה Linux Kernel אמיתי אל Windows 10.

סביבת WSL 2 מגיעה עם ארכיטקטורה חדשה המאפשרת להריץ ELF64 (ליתר דיוק Linux binaries) וכתוצאה מכך הארכיטקטורה החדשה משנה את הצורה שבה לינוקס עובד מול אותה גרסת Windows ומול החומרה שעליה הוא רץ.

גרסת Linux Kernel בנויה ומותאמת מול WSL 2 על סמך גרסת Linux Kernel 4.19 ותקבל עדכונים שוטפים באמצעות Windows Update, כלומר כל העדכונים שייצאו ברמת Linux Kerenl יעודכני בהתאם מול WSL 2.

מכיוון שמדובר על קוד פתוח אז כל הקונפיגורציה של WSL 2 זמינה באתר GitHub ולכן ניתן לעבוד עם הקופיגורציה ולבצע התאמות במידת הצורך.

בסביבת WSL 2 ישנם מספר שינויים משמעותיים ברמת ביצועים, ארכיטקטורה, אפשרויות פיתוח והתאמה, הצורה שאיתה ניתן לעבוד וכמובן כל היכולות אשר זמינות בסביבת WSL 1.

ארכיקטורה

סביבת WSL 2 מריתה לינוקס בינארי מבוסס ELF64 על גבי Windows 10 (בילד 18917) והמטרה שלו היא שיפור ביצועים ותאימות מול המארח, ולכן הארכיקטורה החדשה מציעה את כל אותם שינויים ולצד זה שומרת על חווית השימוש של WSL 1.

בהפצות לינוקס מסוימות ניתן לשדרג ולעדכן (או לשנמך) בכל מצב בין הסביבות, ובנוסף לכך ניתן להריץ את סביבת WSL 1 לצד WSL 2 ללא קונפליקטים בינהם.

לינוקס בתוך Windows – בסביבת WSL 2 ישנה מכונה (VM) המבוסס על מאפיינים של Hyper-V, אך עדיין לא מדובר על מכונה של ממש אלא VM אשר מותאם רק לטובת הפעלת Linux.

מטרת המכונה היא לטעון גרסת Linux עם דרייברים ולהפעיל את סביבת המשתמש בלינוקס עם תאימות מלאה מול המארח (על גבי Windows 10), מכיוון שמדובר בכל זאת על מכונה (אומנם לא סטנרדטית) אבל עדיין מדובר על מאפיינים של Hyper-V.

מהיכן נעשית התאימות של סביבת WSL 2 ועליה Kernel Linux מול המכונה הפיסית? וכאן בא לידי ביטוי VPCI או יותר נכון מנגנון Virtual PCI שמגיע מתחום Hyper-V Security, כלומר האפשרות לבצע תאימות או יותר נכון paravirtualized.

למעשה paravirtualized נכנס לפעולה כאשר מכונה וירטואלית עולה ולאחר מכן מבצע טעינה עם אותו Kernel ייעודי שלה ולגשת לכל אותם משאבים שיש במכונה הפיסית ללא מגבלות. מידע נוסף בנושא Fuzzing para-virtualized devices in Hyper-V

ביצועים – מכיוון שמדובר על מערכת שיש לה גישה מלאה אל החומרה אנו מקבלים באופן אוטומטי ביצועים טובים יותר, ולצורך הענין ניתן לעבוד עם קבצים מקומיים בצורה הרבה יותר מהירה והתקנות שונות כדוגמת Git או NPM גם כן עובדות בצורה מהירה.

מצב משתמש – לינוקס Kernel מספק מספר רכיבים ואת UserSpace שם מתרחשות מספר פעולות. UserSpace הוא כל הפעולות אשר מתבצעות מחוץ לאותו Kernel בין אם ברמת אפליקציות או גישה להגדרות בינאריות.

בסביבת WSL 2 האזור של UserSpace בינאריים אשר נעשים בצורת Sideload ונוצרים במהלך התקנה והגדרת Distro, ולצד זה UserSpace מתשאל את Linux Kernel במידת הצורך.

פעולות בינאריות – הפעולות הבינאריות של לינוקס מבצעות קריאות מערכת על גבי אותו Linux Kernel ועם גישה מלאה למערכת בכדי לבצע פעולות רבות ולהפעיל פונקציות שונות, למשל גישה לזכרון, יצירת תהליכים וכן הלאה.

הארכיקטורה של סביבת WSL2 בנויה בצורה כזאת שהיא מאפשרת לקרנל של לינוקס יחד עם Linux ELF64 שלא עבר שינוי להיות מעל הקרנל של Windows.

סביבת WSL 2 מתרגמת קריאות ושאילתות מתוך Linux Kernel ומעבירה את אותם קריאות אל Windows בכדי לעבד את המידע והפעולות בצורה מהירה, ולכן צורת העבודה של סביבת WSL 2 מזכירה במעט (ממש במעט) את Wine שמאפשר להריץ פעולות Windows על Linux.

ועכשיו עולה השאלה האם יש גישה לרכיבים כדוגמת GPU? עדיין לא אבל בקרוב תהיה גישה לרכיבים כודגמת GPU + USB בצורה מלאה, ולצורת הענין יהיה אפשר להפעיל Password Cracking מתוך סביבת WSL 2 או על גבי הפצת KALI שהיא חלק ממנה (ובמידה והיא מותקנת).

הפצות Linux

ישנם הפצות לינוקס אשר נתמכות בסביבת WSL 2 ? וישנם הפצות מותאמות מול WSL במצריכות הגדרות ידניות

הפצות נתמכות

Ubuntu
Debian
OpenSUSE / SUSE Enterprise Linux
Kali Linux
Fedora
Pengwin

הפצות מותאמות WSL

בהפצות שאינן נתמכות צריך לבצע מספר הגדרות ידניות בהתאם לכל הפצה

miniwsl
ArchWSL
AlpineWSL
WSLInstall
wsldl
WSL-Distribution-Switcher
acme-wsl

למי מיועד WSL 2

רכיב WSL שנמצא בגראסות Windows 10 השונות מאפשר להריץ הפצות לינוקס שונות לצד Windows 10 וללא הפרעה בין שתי המערכות.

WSL נועדה לאנשי פיתוח ואנשי אבטחת מידע שמעוניינים לבצע פעולות שונות מתוך אותה מערכת, ומבלי להתקין עוד מערכת נוספת או להפעיל מצב של שתי מערכות הפעלה על אותה מכונה.

למשל הפצת KALI Linux, במידה ומתקינים את הפצת KALI על גבי WSL, לאחר מכן ניתן לעבוד עם כלי האבטחה המוכרים (כל החבילות והכלים) מתוך אותה מערכת הפעלה ולשלב אותה עם כלים נוספים כדוגמת VSCode.

הסיבה להעדפת WSL על פני מכונה ייעודית של לינוקס היא מהסיבה הפשוטה ביותר של עבודה עם מערכת אחת שיודעת לבצע פעולות לינוקס למינהם (כולל פיתוח) והאפשרות של אינטגרציה עם כלי פיתוח נוספים ושפות שונות וללא צורך בהתאמות אינסופיות.

למה WSL 2 מתאים?

  • ביצוע פעולות פיתוח שונות ומגוונות
  • ליצירת אוטומציה באמצעות שפות פיתוח שונות כדוגמת Python או .NET
  • כלי תקיפה לאנשי אבטחה (בעיקר KALI אבל אפשר לשלב עם Black Arch)
  • אינטגרציה ופיתוח מול Dokcer
  • פיתוח מול AI כגון קוגניטיב וכן האלה
  • אינטגרציה עם כלים ושפות שונות, כדוגמת VSCode או PowerShell (יכול להיות חלק מפיתוח משולבעם שפות נוספות)

למה אינו מתאים?

  • אינטגרציה עם כלי תקשורת או שימוש של Low-Level
  • אין גרפיקה או שמע (לא בתמיכה מלאה אבל ישנם כלים שעובדים)
  • תמיכה ברכיבי GPU
  • עדיין (בדגש על עדיין) אינו מחליף גרסת לינוקס מלאה

כלים

אז כמו בכל מוצר תמיד מחפשים כלים נוספים לעבוד עם סביבת WSL 2 וישנם המון כאלה, בין היתר כמה כלים מסוימים:

WSLGit – כלי המאפשר להריץ פעולות שונות מתוך BASH ומתפקד כפלאגין של VSCode בתוך סביבת WSL.

WSLTools – ניהול סביבות WSL בארגון מתוך ממשק אחד ומאפשר לבצע התקנות של הפצות לינוקס, הפעלה של רכיבים מסוימים בתוך WSL ואפשרויות ניהול נוספות.

WSL Docker Git – סט של סקירפטים שנועד להתקין ולאפשר שימוש של Docker על גבי WSL

איך מתקינים WSL 2

בכדי להתקין סביבת WSL 2 באופן הבסיסי ביותר יש להכין מספר דרישות, לבצע התקנה ספציפית  ולהכין את הסביבה עם מספר פקודות.

דרישות

  • גרסת Windows 10 עם בילד 18917
  • תמיכה של וירטואליזציה Hyper-V

התקנת WSL 2

בכדי להתקין סביבת WSL 2 יש לבצע את הפעולות הבאות:

הפעלת WSL ברמת Windows 10 – התקנת רכיב WSL בתחנה מתוך ממשק PowerShell יש להריץ את הפקודה הבאה:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

הפעלת Virtual Machine Platform – הפעלת רכיב VM בתחנה מתוך ממשק PowerShell באמצעות הפקודה הבאה:

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

התקנת לינוקס Distro – ישנם מספר גרסאות אשר נתמכות באופן רשמי ע"י Microsoft וניתן להתקין אותם ישירות מתוך Microsoft Store או מתוך PowerShell, ולאחר מכן להפעיל את אותה הפצה שהותקנה בצורה הבסיסית בלבד.

בכדי להתקין הפצת לינוקס יש לגשת לכתובת https://aka.ms/wslstore ומשם להמשיך בהתקנה, לדוגמה התקנת KALI על גבי Windows 10.

הגדרת WSL 2 – בסיום התקנת Distro נבצע מספר הגדרות בסביבת WSL 2 מתוך ממשק PowerShell באמצעות הפקודות הבאות:

לפני שנגדיר WSL נוודא שאכן ישנה הפצה מותקנת מתוך ממשק PowerShell באמצעות הפקודה הבאה:  wsl –list

לאחר מכן נוודא שאותה הפצה מוגדרת עם סביבת WSL 2 מתוך ממשק PowerShell באמצעות הפקודה הבאה:

wsl –set-version Ubuntu 2

ולסיום נוודא שסביבת WSL 2 היא הסביבה הדיפולטית מתוך ממשק PowerShell באמצעות הפקודה הבאה:

wsl –set-default-version 2

בסיום התקנה והגדרת סביבת WSL 2 נוכל לעבוד עם לינוקס Distro ועם כלים שונים כדוגמת VSCode, להגדיר סביבות פיתוח שונות מתוך WSL כדוגמת Python ועוד.

לסיכום

סביבת WSL 2 מביאה איתה בשורה משמעותית בהשוואה לסביבת WSL 1 עם Linux Kernel אמיתי ומותאם, ובגלל הארכיקטורה של סביבת WSL 2 ניתן לקבל ביצועים טובים יותר וגישה לחומרה המקומית ועל סמך האפשרויות הנ"ל לבצע פעולות לינוקס על גבי Windows.

במאמר הבא, איך להתאים את WSL מול VSCode מול PowerShell ומול Python.

מה דעתך?

אתר זה עושה שימוש באקיזמט למניעת הודעות זבל. לחצו כאן כדי ללמוד איך נתוני התגובה שלכם מעובדים.