מעמקי הווירטואליזציה של Windows (חלק 3) — מכונות וירטואליות שעולות בשניות: למה WSL2, Windows Sandbox וקונטיינרים כל כך קלים

· · Windows, וירטואליזציה, WSL2, Windows Sandbox, קונטיינרים, Hyper-V

כשיוצרים מכונה וירטואלית של Windows במנהל Hyper-V, לוקח לה עשרות שניות להתחיל והיא מונופולזת כמה גיגה-בתים של זיכרון. ובכל זאת באותו מחשב, הקלדת wsl מחזירה מעטפת Linux תוך כמה שניות, ו-Windows Sandbox פותח שולחן עבודה חד-פעמי בכמה שניות גם הוא.1

שניהם נשענים על אותו היפרווייזור של Windows (חלק 1, “היכן Windows שלכם באמת רץ?”). בחלק 2 ראינו שהיסוד הזה יכול ליצור בידוד חזק מהליבה. אז למה האחד כבד והאחר קל?

השאלה שהפרק האחרון של הסדרה עונה עליה היא אחת בלבד.

מכונות וירטואליות מלאות כבדות — אז למה WSL2 ו-Windows Sandbox כל כך קלים?

קהל היעד הוא מפתחות, מפתחים ומפעילים שמשתמשים ב-WSL2, ב-Windows Sandbox ובקונטיינרים של Windows לפיתוח ולאימות, ורוצים להבין את הקלילות ואת האילוצים שלהם מהמנגנונים ומעלה. דרישות מוקדמות הן Windows 10/11; מעבר על סעיף Windows Sandbox דורש מהדורת Pro, Enterprise או Education (ל-Home ול-Windows Server אין את התכונה הזו). ידע רקע הוא מושג המחיצות מחלק 1. רמת הקושי היא בינונית.

1. השורה התחתונה קודם

מכונה וירטואלית קלת-משקל שומרת על קו הבידוד (ליבה ייעודית וגבול היפרווייזור) ומקלה את “העותק של מערכת הפעלה אורחת שלמה”. Sandbox משתף את Windows של המארח עצמו; WSL2 מחליף את האורח ב-Linux קטן וייעודי; ובשני המקרים הזיכרון אינו שמורה קבועה אלא מושאל ומושאל בחזרה באופן דינמי עם המארח.

מקור המשקל של מכונה וירטואלית מלאה אינו הבידוד עצמו אלא שכפול. עוד תמונת מערכת הפעלה בדיסק, עוד שווי מערכת הפעלה של דפים ב-RAM, ועוד אתחול מלא בכל פעם שמתחילים. מכונות וירטואליות קלות חותכות את השכפול הזה בשתי מדיניות: “שתפו מה שבטוח לשתף” (Sandbox) ו”אם אי אפשר לשתף, בנו מחדש בקטן” (WSL2).

שלושה סוגי שיתוף שתומכים במכונות וירטואליות קלותתמונת מערכת ההפעלה שמכונה וירטואלית מלאה נהגה לשכפל נחתכת בשיתוף ב-Sandbox ובכיווץ ב-WSL2; זיכרון שהוא הקצאה קבועה כברירת מחדל (זיכרון דינמי הוא החריג) הופך להשאלה והחזרה דינמית עם המארח; האתחול מוחלף בליבה קלה ובהקמה מינימלית; רק גבול הבידוד נשארמוחלף במוחלף במוחלף במכונה מלאה: שכפולדיסק: עותק תמונת מערכתזיכרון או אתחול?זיכרון: ברירת מחדל קבועהאתחול: אתחול מלאשיתוף(Sandbox)או כיווץ(WSL2)השאלה דינמית מהמארחליבה קלה + מינימום

איור 1: שלד התשובה ל”אותו היפרווייזור, ובכל זאת קל” הוא שהם הפסיקו לשכפל, לא שהם הפסיקו לבודד.

להלן מסתכלים על 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
ארכיטקטורת WSL2Windows מארח ומכונה וירטואלית שירותית קלת-משקל יושבים זה לצד זה על ההיפרווייזור; ליבת Linux שבונה Microsoft רצה בתוך המכונה הווירטואלית; וכל הפצה רצה כקונטיינר מבודד בתוכהInterop (פקודות, קבצים, רשת)היפרווייזורWindows המארחמכונה שירותית קלת-משקלליבת Linux (בניית Microsoft; מתעדכנת עם wsl --update)Ubuntu (קונטיינר)Debian (קונטיינר)

איור 3: התשובה ל”האם WSL2 הוא מכונה וירטואלית?” היא “כן, אבל מכונה וירטואלית מנוהלת מאחורי הקלעים”, וגם אם מתקינים כמה הפצות עדיין יש מכונה וירטואלית אחת.

ברגע שמקלידים wsl, הצד האחורי נראה כך.

מהרצת הפקודה wsl עד שמעטפת חוזרת בכמה שניותאם המכונה הווירטואלית השירותית לא רצה כשמריצים wsl, המכונה הקלה וליבת Linux מתחילות; אם היא כבר רצה הן ממוחזרות; ומעטפת חוזרת בקונטיינר של ההפצהלאכןהריצו wslהאם המכונה השירותית כבר רצה?הפעלת המכונה הקלה וליבת Linux (כמה שניות)שימוש חוזר במכונה שכבר רצהמעטפת חוזרת בתוך הקונטיינר

איור 4: ההמתנה היא רק הפעלת מכונה וירטואלית מינימלית, וכאן מתבטאת הנחת מטען האתחול המלא.

3.2. I/O של קבצים: באיזה צד שמים את זה הופך את זה לדבר אחר

הנושא שתמיד עולה בשיחה על ביצועי 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.

ההתפצלות בנתיבי I/O של קבצים ב-WSL2גישה לדיסק הווירטואלי ext4 בצד Linux היא ישירה מליבת Linux ולכן מהירה; גישה לקבצים בצד Windows עוברת דרך שיתוף קבצים שחוצה גבול מערכת הפעלה ולכן איטיתצד Linux (home וכדומה)צד Windows (/mnt/c וכדומה)פעולות קבצים בתוך WSL2באיזה צד הקובץ?I/O ישיר לדיסק הווירטואלי ext4דרך שיתוף שחוצה גבול מערכתמהיר (דוגמאות של עד פי 20 מול WSL1)נוטה להיות איטיתיקון: שימו את הקובץ במערכת שמשתמשת בו

איור 5: מה שאיטי הוא הנתיב, לא WSL2, כך ששינוי מקום הקבצים לעיתים קרובות גורם לבעיית הביצועים להיעלם.

3.3. זיכרון: הוא גדל, הוא מתכווץ, אבל הוא לא תמיד מחזיר הכול

שימוש הזיכרון של WSL2 (רואים אותו כתהליך vmmem במנהל המשימות) אינו שמורה קבועה; הוא גדל ומתכווץ עם השימוש. זיכרון שתהליכים שחררו מוחזר אוטומטית ל-Windows תחת ההגדרה pageReporting, שמופעלת כברירת מחדל.5 דפים שמוחזקים כמטמון קבצים נהגו לא לחזור ל-Windows עד שהמכונה הווירטואלית יצאה.4 ב-WSL הנוכחי, ההגדרה הניסיונית autoMemoryReclaim ב-.wslconfig (ברירת המחדל היא dropCache) תובעת בחזרה גם את המטמון אוטומטית.5 בסביבות שבהן ההגדרה הזו היא disabled, או ב-WSL ישן יותר, מטמון של סשן ארוך יכול להישאר עד שהמכונה הווירטואלית יוצאת וללחוץ על זיכרון המארח.

איך זיכרון WSL2 גדל, מתכווץ ומוחזרגידול ביקוש בתוך WSL2 מעלה את שימוש הזיכרון של המכונה הווירטואלית; דפים שתהליך שחרר מוחזרים ל-Windows תחת pageReporting, שמופעל כברירת מחדל; מטמון קבצים נתבע בחזרה אוטומטית על ידי autoMemoryReclaim כברירת מחדל; אבל בהגדרה מושבתת או ב-WSL ישן הוא נשאר עד שהמכונה יוצאת, ו-wsl --shutdown מחזיר הכולתהליך שחרר (כש-pageReporting דולק)מוחזק כמטמון קבציםביקוש הזיכרון גדל בתוך WSL2שימוש vmmem גדלהאם הדף הזה שוחרר?מוחזר אוטומטית ל-WindowsautoMemoryReclaim תובע בחזרה אוטומטית (ברירת מחדל)בהגדרה מושבתת או ב-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 המבודד על ידי ההיפרווייזור. סוגרים אותו והכול נעלם; בפעם הבאה, הוא עולה בכמה שניות ממצב נקי.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 דרך אובייקטי section, שעקבנו אחריו בחלק 3 של סדרת הזיכרון (“אובייקטי Section ו-Copy-on-Write”). המנגנון ההוא היה שיתוף בין תהליכים; Sandbox עושה זאת מעבר לגבול מכונה וירטואלית.

שיתוף דף פיזי דרך direct mapיישום במארח ויישום בתוך ה-Sandbox חולקים את אותו דף זיכרון פיזי לקבצים בינאריים של מערכת ההפעלה כמו ntdll, ומקטינים את השימוש בזיכרוןיישום במארחכתובת וירטואלית בצד המארחיישום בתוך ה-Sandboxכתובת וירטואלית בצד ה-Sandboxאותו דף פיזי (קבצים בינאריים כמו ntdll.dll)אין צורך לשכפל שווי מערכת של RAM

איור 9: Direct map הוא רעיון שיתוף הדפים ששימש בין תהליכים, מיושם מעבר לגבול מכונה וירטואלית.

4.3. השאלה והחזרה של זיכרון: יותר כמו תהליך מאשר כמו מכונה וירטואלית

מול הקצאת הזיכרון הסטטית של מכונה וירטואלית מסורתית, טכנולוגיית הקונטיינרים ש-Sandbox יושב עליה מחליטה על הקצאת משאבים באופן דינמי בשיתוף פעולה עם המארח. אם המארח מתקצר בזיכרון, הוא יכול לתבוע בחזרה זיכרון מהקונטיינר באותו אופן שהוא תובע אותו מתהליך רגיל.2 גם Hyper-V Dynamic Memory מגדיל ומקטין הקצאה של מכונה וירטואלית בתוך טווח מוגדר, אבל Sandbox הולך רחוק יותר: ההבדל הוא שהוא משאיל ומושאל באותו שדה כמו ניהול הזיכרון של המארח.

שיתוף פעולה בזיכרון בין המארח ל-Sandboxברירת המחדל של מכונה וירטואלית מסורתית היא הקצאה בלעדית בגודל סטטי עם אמצעי התאמה מוגבלים; Sandbox הופך ליעד תביעה בחזרה בתגובה ללחץ זיכרון במארח ומשאיל ומושאל זיכרון באותו שדה כמו תהליכים רגיליםלחץ הזיכרון במארח עולהמאיפה תובעים בחזרה?Working Sets של תהליכים רגיליםהשימוש של ה-Sandbox (הקונטיינר)זיכרון פנוי מובטחלמכונה מסורתית אמצעי התאמה מוגבלים

איור 10: בהשאלה ובהחזרה של זיכרון, Sandbox עומד בצד התהליך ולא בצד המכונה הווירטואלית, ומציע זיכרון כשהמארח בצרה.

בחלק 1 אמרנו “ביצועי מכונה וירטואלית תלויים גם בצד המארח”, אבל עם מכונות וירטואליות קלות לוקחים עוד צעד: הקצאת הזיכרון עצמה היא עבודה משותפת עם המארח. הסיבה שאפשר להשתמש ב-Sandbox בתחושה של “עוד יישום” ולא של “מוצר וירטואליזציה כבד” היא שיתוף הפעולה הזה.

ההליך הקונקרטי לשימוש ב-Sandbox לאימות יישום עסקי מכוסה במאמר הקודם “איך להאיץ אימות יישומים עם Windows Sandbox”. המאמר הזה הוא המנגנון שמתחת לזה.

5. קונטיינרים — היכן משרטטים את קו הבידוד

5.1. בידוד תהליך ובידוד Hyper-V

לקונטיינרים של Windows יש שני מצבי בידוד בזמן ריצה. התמונה משותפת; בוחרים עם דגל בהפעלה.7

  • בידוד תהליך: כמה קונטיינרים חולקים את הליבה עם המארח ומבודדים דרך וירטואליזציה לפי-מרחב-שמות של מערכת הקבצים, הרישום, פורטי רשת, מרחב מזהי תהליכים, מרחב השמות של Object Manager וכדומה. זו בעצם אותה גישה כמו קונטיינרים של Linux.
  • בידוד Hyper-V: כל קונטיינר רץ בתוך מכונה וירטואלית ממוטבת מאוד ויש לו מה שבפועל ליבה ייעודית. נוכחות המכונה הווירטואלית שמה בידוד ברמת חומרה בין הקונטיינרים למארח.7

בידוד דרך מרחבי שמות אפשר לתאר כגרסה יסודית של הטכניקה שראינו במאמר וירטואליזציית הרישום (“הפניה מחדש ווירטואליזציה של הרישום ב-Windows”) — “להראות מציאות אחרת תחת אותו API”.

בידוד תהליך מול בידוד Hyper-Vתחת בידוד תהליך, קונטיינרים חולקים את הליבה עם המארח ומבודדים דרך מרחבי שמות; תחת בידוד Hyper-V, לכל קונטיינר יש ליבה ייעודית בתוך מכונה וירטואלית ממוטבתבידוד Hyper-Vבידוד תהליךליבה ייעודית (בתוך מכונה ממוטבת)קונטיינר Cליבה ייעודית (בתוך מכונה ממוטבת)קונטיינר Dליבה משותפת עם המארחקונטיינר Aקונטיינר B

איור 11: גם עם אותה תמונת קונטיינר, האם משרטטים את קו הבידוד מעל הליבה או מפצלים את הליבה עצמה הוא בחירה שעושים בהפעלה.

5.2. איזה מהם אפשר לקרוא “גבול אבטחה”

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

גם ה-VBS שראינו בחלק 2 היה תכנון שמניח “הליבה יכולה להיפרץ” ונסוג לגבול היפרווייזור. אותו קריטריון חל בעולם הקונטיינרים. הקו שכולא קוד לא מהימן משרטט בגבול ההיפרווייזור, לא בתוך ליבה משותפת.

איך לבחור בידוד לפי כמה סומכים על הקודאם עומס העבודה מהימן, לוקחים צפיפות וביצועים עם בידוד תהליך; אם הקוד לא מהימן או של מישהו אחר, בוחרים גבול היפרווייזור כמו קונטיינר מבודד-Hyper-V, Windows Sandbox מוקשח עם רשת כבויה, או מכונה וירטואלית מבודדתכןלא / קוד של מישהו אחראפשר לסמוך על הקוד הזה?בידוד תהליך (עדיפות לצפיפות ומהירות)בחירת גבול היפרווייזורקונטיינרים מבודדי Hyper-VSandbox מוקשח או מכונה מבודדת

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

אגב, הרצת קונטיינר מבודד-Hyper-V בתוך מכונה וירטואלית של Hyper-V הופכת את ההיפרווייזור לשתי שכבות עמוק — וירטואליזציה מקוננת. רמה אחת של קינון נתמכת בייצור בסביבות שעומדות בתנאים (מעבד Intel עם מארח Windows 10 / Windows Server 2016 ואילך, או מעבד AMD עם מארח Windows 11 / Windows Server 2022 ואילך, וגרסת תצורת המכונה הווירטואלית המתאימה בכל מקרה), ודרישה מוקדמת נוספת היא הגדרה שחושפת הרחבות וירטואליזציה למכונה הווירטואלית החיצונית (ExposeVirtualizationExtensions ב-Set-VMProcessor ב-Hyper-V). הרצת WSL2 בתוך מכונה וירטואלית נתמכת באותו אופן.9 האם אפשר להשתמש ב-WSL2 או ב-Docker במכונת פיתוח בענן מוכרע גם על ידי השאלה אם גודל המכונה והתצורה הזו חושפים וירטואליזציה מקוננת.

המבנה של וירטואליזציה מקוננתמכונה וירטואלית בענן יושבת על ההיפרווייזור של המארח הפיזי, ובתוכה רץ היפרווייזור אחר (קינון נתמך הוא רמה אחת) כדי לתמוך ב-WSL2 ובקונטיינרים מבודדי Hyper-Vההיפרווייזור של המארח הפיזימכונה בענן (מחשב פיתוח)היפרווייזור בתוך המכונה (רמת קינון 1)WSL2קונטיינר מבודד-Hyper-Vקינון נתמך הוא רמה אחת

איור 13: הסיבה ש-wsl רץ בתוך מכונה וירטואלית בענן היא שווירטואליזציה מקוננת נתמכת רשמית לרמה אחת בלבד.

5.3. הספקטרום של בידוד וקלילות

סידור השחקנים עד כאן על ציר אחד נראה כך.

הספקטרום של חוזק בידוד וקלילותקונטיינרים מבודדי-תהליך הם הקלים ביותר אבל חולקים את הליבה; WSL2, Sandbox וקונטיינרים מבודדי Hyper-V הם מכונות קלות עם ליבה ייעודית (Sandbox מקל בשיתוף, WSL2 בליבה ייעודית); מכונה מלאה היא הכבדה ביותר אבל למטרות כלליותקל ← → כבדקונטיינרים מבודדי-תהליך (ליבה משותפת)WSL2, Sandbox, בידוד Hyper-V (מכונות קלות עם ליבה ייעודית)מכונה מלאה (מריצה הכול; מחזיקה עותק שלם)גבול: מרחבי שמותגבול: היפרווייזורגבול: היפרווייזור + עצמאות שלמה

איור 14: קבוצת המכונות הקלות היא פתרון האמצע ששמר על גבול ההיפרווייזור וחתך שכפול; הדרך שבה הם חותכים מתפצלת לשיתוף ב-Sandbox ולליבה ייעודית ב-WSL2.

6. ראו זאת בעצמכם

קלילות ושיתוף הם דברים שאפשר לצפות במחשב מולכם.

זמן הפעלה ועלייה וירידה של זיכרון (WSL2). עם מנהל המשימות פתוח, נסו את הבאים.

# זמן הפעלה מורגש (ההרצה הראשונה מפעילה את המכונה; השנייה ואילך מהירות עוד יותר)
Measure-Command { wsl -e true }

# שימוש הזיכרון של מכונת WSL2 (vmmem / Virtual Machine Memory)
Get-Process -Name vmmem* | Select-Object Name, WorkingSet64

# סיימו את כל המכונה וצפו בזיכרון חוזר
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 אלא נתיב ה-I/O של קבצים שחוצה גבול מערכת הפעלה. יש מקרים רבים שבהם פשוט העברת הפרויקט לצד 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 להרצת קוד לא מהימן או דגימה, בחרו בידוד שיש לו גבול היפרווייזור, כמו קונטיינר מבודד-Hyper-V, Windows Sandbox או מכונה וירטואלית ייעודית. גבול היפרווייזור, עם זאת, אינו פטור כולל. להגדרות ברירת המחדל של Windows Sandbox יש קישוריות רשת מופעלת, והן יכולות לחשוף יישום לא מהימן לרשת הפנימית.1 אם משתמשים בו להרצת דגימה, חזקו את הבידוד בהשבתת רשת והפניית לוח בלוח בקובץ התצורה .wsb, או השתמשו במכונה וירטואלית ייעודית ברשת מבודדת.

8. סיכום — סגירת הסדרה

נקודות חלק 3.

  • הקלילות של מכונה וירטואלית קלת-משקל היא תוצאה של “הפסקת שכפול”, לא של “החלשת בידוד”.
  • WSL2 מריץ ליבת Linux אמיתית במכונה וירטואלית שירותית קלת-משקל מנוהלת, והפצות מבודדות כקונטיינרים בתוך המכונה הווירטואלית הזו.3 כלל הביצועים הוא לשים קבצים במערכת ההפעלה שמשתמשת בהם, והזיכרון גדל ומתכווץ באופן דינמי, עם תקרה שניתן לשלוט בה ב-.wslconfig.45
  • Windows Sandbox משתף את קובצי מערכת ההפעלה הבלתי-משתנים של המארח דרך תמונת בסיס דינמית וגם משתף את הדפים הפיזיים של קבצי מערכת היעד דרך direct map, כך שהוא לא מחזיק עותק של Windows שלם.2 עדיין צריך כ-500 מגה-בתים לקבצים המשתנים, ועוד את הזיכרון של היישומים שמריצים בתוכו.
  • מצב בידוד הקונטיינר נבחר בהפעלה, והצד שאפשר לקרוא לו גבול אבטחה הוא בידוד Hyper-V.78

ואם שמים את כל הסדרה על דף אחד, זה נראה כך.

  • חלק 1: יש שכבת היפרווייזור מתחת ל-Windows, ומערכת ההפעלה המארחת עצמה רצה כמחיצת השורש. בוררות המעבד והזיכרון (SLAT) נעשית ישירות על ידי השכבה הזו, ו-I/O של התקנים סינתטיים מתווך על ידי מחיצת השורש (VSP) מעבר ל-VMBus.
  • חלק 2: השכבה הזו משמשת לא רק לבידוד מכונות וירטואליות זו מזו אלא גם לשרטוט גבול חזק מהליבה (VTL) בתוך אותה מערכת הפעלה. אבטחת ברירת המחדל של Windows 11 בנויה מעל זה.
  • חלק 3: על אותה שכבה, חיתוך שכפול הוא מה שמאפשר “מכונה וירטואלית שעולה בשניות”. קו הבידוד נשמר, והוא הפך לכלי יומיומי.
תמונה אחת של כל הסדרהההיפרווייזור ישירות על החומרה הוא חלק 1; פיצול VTL0 ו-VTL1 בתוך Windows המארח הוא חלק 2; הקלילות של WSL2, Sandbox ובידוד Hyper-V על אותה שכבה היא חלק 3; קונטיינרים מבודדי-תהליך חולקים את ליבת המארח; Sandbox מקל בשיתוף, WSL2 בליבה ייעודיתחומרההיפרווייזור (חלק 1)Windows המארח (בידוד VTL הוא חלק 2)WSL2, Sandbox, בידוד Hyper-V (חלק 3)קונטיינרים מבודדי-תהליך (ליבה משותפת)Sandbox משתף; WSL2 מקל עם ליבה ייעודית

איור 15: ערמו את שלושת הפרקים ויש לכם את התמונה הכוללת של הקרקע מתחת ל-Windows הנוכחי.

וירטואליזציה כבר אינה טכנולוגיית חדר שרתים, ולא טכנולוגיה רק למי שמקימים מכונות וירטואליות. בקרקע מתחת ל-Windows שלכם, היא תומכת בשקט גם באבטחה וגם בחוויית הפיתוח — זה המקום שבו אנחנו נמצאים עכשיו.

מאמרים קשורים

תחומי ייעוץ קשורים

KomuraSoft LLC מטפלת בהקמת סביבות פיתוח שמשתמשות ב-WSL2 ובקונטיינרים, בתכנון סביבות אימות ליישומי Windows, ובחקירת ביצועים ותאימות בסביבות וירטואליות.

קישורים

  1. Microsoft Learn, Windows Sandbox. על כך ש-Windows Sandbox עולה בכמה שניות כמכונה וירטואלית חד-פעמית וזורק הכול בסגירה; על כך שהוא מריץ ליבה נפרדת עם ההיפרווייזור של Microsoft כדי לבודד אותו מהמארח; ועל כך שקישוריות רשת מופעלת כברירת מחדל וניתן להשביתה בקובץ התצורה.  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. על כך שרק קונטיינרים מבודדי-היפרווייזור מטופלים כגבול אבטחה; על כך שקונטיינרים מבודדי-תהליך לא נחשבים לגבול אבטחה חזק; ועל כך שבידוד היפרווייזור הוא מה שצריך לבחור בתרחיש רב-דייר עוין.  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 יכול להריץ תמונה של גרסת מערכת הפעלה שונה מהמארח; ועל כך שבידוד תהליך במערכת הפעלה לקוח מוגבל לשימוש בפיתוח ובבדיקה. 

מאמרים עדכניים עם אותן תגיות, להעמקה בנושאים קרובים.

העמודים האלה ממקמים את הנושא בהקשר רחב יותר של שירותים והחלטות.

המאמר קשור ישירות לשירותים הבאים.

שאלות נפוצות

שאלות נפוצות בפניות בנושא המאמר.

האם 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, שנותן לכל קונטיינר ליבה ייעודית משלו.

פרופיל הכותב

עמוד היכרות עם כותב המאמר.

Go Komura

מנהל KomuraSoft LLC

מתמחה בפיתוח תוכנה עבור Windows, ייעוץ טכני וחקירת תקלות, בעיקר בפרויקטים עם מערכות קיימות ובאגים שקשה לשחזר.

קישורים ציבוריים

חזרה לבלוג