Windows Virtualization Internals (חלק 3) — VMs שעולות בשניות: WSL2, Windows Sandbox ו-containers

· עודכן בתאריך: · · Windows, virtualization, WSL2, Windows Sandbox, containers, Hyper-V

היסטוריית עדכונים (גרסה ראשונה, פורסמה בתאריך 22 Aug 2026)
פרסום ראשון
לצטט את המאמר הזה(DOI (ארכיון רשום): 10.5281/zenodo.22176903)

מזהי ה־DOI שלהלן מפנים לגרסאות שנשמרו בעבר בארכיון, ועשויים שלא להתאים לטקסט הנוכחי. להפניה לטקסט הנוכחי, השתמשו בכתובת של דף זה.

Go Komura (2026). Windows Virtualization Internals (חלק 3) — VMs שעולות בשניות: WSL2, Windows Sandbox ו-containers. KomuraSoft LLC. https://comcomponent.com/he/blog/windows-virtualization-internals-wsl2-sandbox-containers/

DOI (ארכיון רשום)
10.5281/zenodo.22176903
DOI (הגרסה האחרונה שנרשמה)
10.5281/zenodo.22176904

VM מלא כבד, אז למה WSL2 ו-Windows Sandbox קלים? הפרק האחרון בסדרה מסביר את ההבדל לא רק מ”מה מבודד” אלא מ”מה לא חייבים לשכפל”.

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

היסוד בכל המקרים הוא ה-Windows hypervisor שראינו בחלק 1. בחלק 2 אישרנו שהיסוד הזה יכול לבנות בידוד חזק מה-kernel. המאמר הזה מסתכל בנפרד על ההתמחות של WSL2, השיתוף של Sandbox, ומצבי הבידוד של containers.

“Windows Virtualization Internals” — כל 3 החלקים

מסתכלים על אותו Windows hypervisor בסדר יסוד → בידוד אבטחה → יישום ל-VMs קלות.

חלק השאלה המרכזית
חלק 1: ה-hypervisor ו-partitions איפה Windows המארח רץ?
חלק 2: VBS, HVCI ו-Credential Guard איפה שמים סוד שאפילו ה-kernel לא יכול לקרוא?
חלק 3: WSL2, Windows Sandbox ו-containers (המאמר הזה) למה אפשר להיות קל תוך שמירה על הבידוד?

הנחות המאמר הזה

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

איך לקרוא את המאמר הזה

מה רוצים לדעת סעיפים לקרוא
מה שונה בין VM מלא ל-VM קלת-משקל קו הבסיס בסעיף 2 → WSL2 בסעיף 3 → Sandbox בסעיף 4
file I/O ושימוש בזיכרון של WSL2 מיקום קבצים בסעיף 3.2 → זיכרון בסעיף 3.3
אבטחת containers ואיזה מצב לבחור מצבי בידוד בסעיף 5 → קריאות שגויות ואזהרות בסעיף 7
לצפות בהבדלים במכונה שלכם איך בודקים בסעיף 6

1. קודם המסקנה

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

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

שלושת סוגי השיתוף מאחורי VMs קלותה-OS image ש-VM מלא שכפל נחתך בשיתוף ב-Sandbox ובכיווץ ב-WSL2, זיכרון שהוא הקצאה קבועה כברירת מחדל (תצורות Dynamic Memory הן החריג) הופך להשאלה ולהחזרה דינמית עם המארח, וה-startup מוחלף ב-kernel קל ובתצורה מינימלית, ונשאר רק גבול הבידודמוחלף במוחלף במוחלף במקור המשקל של VM מלא הוא שכפולדיסק: OS image כפולזיכרון: הקצאה קבועה כברירת מחדלstartup: עוד boot מלאשיתוף (Sandbox) או כיווץ (WSL2)מושאל ומוחזר דינמית עם המארחמקוצר ב-kernel קל ובתצורה מינימלית

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

להלן מסתכלים על WSL2, Windows Sandbox ו-containers בסדר הזה, ועל איזה שכפול כל אחד מהם חותך.

ב-diagram, solid line מציינת relation שתמיד מתקיים ו-dashed line מציינת relation מותנה (התנאים מופיעים בהסבר של כל relation ב-detail page). הרשימה המלאה של ה-relations (סה”כ 19, כולל evidence ו-certainty) וההגדרות של ה-concepts המרכזיים נמצאות ב-detail page של ה-knowledge map (ביפנית). Data: JSON-LD / Turtle

2. מה VM מלא נושא

כקו בסיס להשוואה, הנה מה ש-VM מסורתי נושא.

  • OS image עצמאי. הוא מחזיק כל קובץ של ה-guest OS בתוך virtual disk. גם אם המארח רץ על אותו Windows, שום דבר אינו משותף.
  • הקצאת זיכרון גסה. VM מסורתי מקצה זיכרון מארח בגודל סטטי כברירת מחדל. יש מנגנונים כמו Hyper-V Dynamic Memory שגדלים ומתכווצים את ההקצאה בתוך טווח מוגדר, אבל אמצעי ההתאמה לשינויי ביקוש מוגבלים.2
  • boot מלא לשימוש כללי. firmware, boot loader ו-services עולים באותו רצף כמו במכונה פיזית.
שלושת העומסים ש-VM מלא נושאVM מלא נושא OS image עצמאי, הקצאת זיכרון שהיא סטטית כברירת מחדל, ו-boot מלא לשימוש כללי, ואלה מופיעים כעלויות בדיסק, ב-RAM ובזמן עלייהVM מלאOS image עצמאיהקצאת זיכרון סטטית כברירת מחדלboot מלא לשימוש כלליצורך דיסק בשביל הכפילנוטה להחזיק RAM שאינו בשימושלוקח עשרות שניות לעלות

איור 2: כל פריט בפירוק העלות של VM מלא משולם עבור כלליות ושכפול, לא עבור בידוד.

אלה אינם פגמים; הם מחיר הכלליות של היכולת לשים כל דבר באורח. לשימוש כמו להריץ Linux ישן ליד Windows Server, הכלליות הזו היא בדיוק הערך. אבל כשהצורך הוא “להריץ את אותו OS כמו המארח (או קבוע) עכשיו, לפיתוח או לאימות”, רוב זה משקל מת. VMs קלות מורידות את המטען הזה בצמצום המטרה.

3. WSL2 — utility VM שנושא kernel שנבנה למטרה

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

3.1. מבנה: VM מנוהלת וההפצות שבתוכה

WSL2 הוא מנגנון שמריץ Linux kernel אמיתית בתוך utility VM קלת-משקל.3 יש שלוש נקודות.

ה-kernel אמיתי, אבל מתמחה

זה Linux kernel ש-Microsoft בונה מענף Stable, מכוונן בגודל ובביצועים ל-WSL2. בסטנדרט הנוכחי, WSL שמופץ דרך Microsoft Store, ה-kernel מתעדכן יחד עם חבילת WSL עצמה ומוחל ב-wsl --update (ההפצה הישנה in-box קיבלה אותו דרך Windows Update).4

כי זה kernel אמיתי, תאימות system-call מלאה, וכלים כמו Docker רצים כמו שהם.

ה-VM נשאר מאחורי הקלעים

WSL מנהל יצירה, עלייה ועצירה של ה-VM; המשתמש רק פותח מעטפת. אין מסך הגדרות VM ואין המתנה מורגשת ל-boot.4

ההפצות הן containers בתוך ה-VM

כל הפצה, כמו Ubuntu או Debian, רצה כ-container מבודד בתוך VM מנוהלת אחת. הן חולקות את network namespace ואת ה-kernel, בעוד namespaces כמו PID, mount ו-user מופרדים.3

ארכיטקטורת WSL2Windows המארח ו-utility VM קלת-משקל יושבים זה לצד זה על ה-hypervisor, Linux kernel שבנתה Microsoft רץ בתוך ה-VM, וכל הפצה רצה כ-container מבודד בתוכהinterop (פקודות, קבצים, רשת)hypervisorWindows המארחutility VM קלת-משקלLinux kernel (build של Microsoft, מתעדכן ב-wsl --update)Ubuntu (container)Debian (container)

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

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

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

איור 4: ההמתנה אינה אלא עליית VM מינימלית, וכאן משתלם להוריד את המטען של boot מלא.

3.2. File I/O: באיזה צד הקבצים חיים עושה את כל ההבדל

איפה קבצים ממוקמים עולה בכל דיון על ביצועי WSL2.

  • פעולות על קבצים בצד Linux (ה-virtual disk מסוג ext4) מהירות. Linux kernel מטפל במערכת הקבצים שלו ישירות, ודווחו האצות של עד 20x מעל WSL1 לחילוץ tarball ו-2 עד 5x ל-git clone ול-npm install.4
  • פעולות על קבצים בצד Windows (/mnt/c וכדומה) איטיות יותר כי הן עוברות דרך שיתוף קבצים שחוצה את גבול ה-OS. ביצועים בין מערכות קבצים של OS הם התחום הגדול האחד שבו WSL2 נשאר מאחורי WSL1.4

לכן הכלל הוא: שימו קובצי פרויקט באותו צד OS כמו הכלים שעובדים עליהם.4 מאגר שמטופל בכלי build של Linux הולך לצד Linux; solution שנבנה ב-Visual Studio הולך לצד Windows.

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

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

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

שימוש הזיכרון של WSL2 (נראה כ-process vmmem ב-Task Manager) אינו שמירה קבועה; הוא גדל ומתכווץ עם השימוש.

החזרת זיכרון ש-processes שחררו

זיכרון ש-processes שחררו מוחזר ל-Windows אוטומטית תחת ההגדרה pageReporting, שמופעלת כברירת מחדל.5

תביעת file cache בחזרה

דפים שמוחזקים כ-file cache פעם לא חזרו ל-Windows עד שה-VM נסגרה.4 ב-WSL הנוכחי, ההגדרה הניסיונית autoMemoryReclaim ב-.wslconfig (ברירת מחדל dropCache) תובעת גם את ה-cache אוטומטית.5

בסביבות שבהן ההגדרה הזו היא disabled, או ב-WSL ישן יותר, ה-cache מסשן ארוך יכול להישאר עד שה-VM נסגרת וללחוץ על זיכרון המארח.

איך זיכרון WSL2 גדל, מתכווץ ומוחזרביקוש גדל בתוך WSL2 מעלה את שימוש הזיכרון של ה-VM, זיכרון ש-processes שחררו מוחזר ל-Windows תחת pageReporting שמופעל כברירת מחדל, ה-file cache נתבע אוטומטית על ידי autoMemoryReclaim כברירת מחדל, אבל עם אלה מושבתים או ב-WSL ישן הוא נשאר עד שה-VM נסגרת, ו-wsl shutdown מחזיר הכולשוחרר על ידי process (עם pageReporting מופעל)מוחזק כ-file cacheביקוש הזיכרון גדל בתוך WSL2שימוש vmmem גדלהאם הדף הזה שוחרר?מוחזר ל-Windows אוטומטיתנתבע אוטומטית על ידי autoMemoryReclaim (ברירת מחדל)נשאר עד שה-VM נסגרת אם מושבת או ב-WSL ישןwsl --shutdown מחזיר הכול

איור 6: מה שנראה כמו “זה רק גדל” הוא בעיקר ה-cache (עם pageReporting מושבת, גם זיכרון ש-processes שחררו נשאר), לכן לומדים את נתיבי ההחזרה לפני שקוראים לזה leak.

קביעת תקרת זיכרון

אם רוצים תקרה מפורשת, %UserProfile%\.wslconfig שולט בזיכרון, במספר המעבדים וב-swap של ה-VM כולה.5

# %UserProfile%\.wslconfig
[wsl2]
memory=8GB
processors=4
swap=2GB

אחרי שינוי ההגדרות, מפעילים מחדש את ה-VM ב-wsl --shutdown כדי שייכנסו לתוקף. ההקצאה הדינמית הזו, שבה הגדרה מחליטה על התקרה והביקוש מחליט על השימוש בפועל, נלקחת עוד צעד קדימה על ידי Windows Sandbox, שבא בהמשך.

4. Windows Sandbox — להשתמש ב-Windows של המארח עוד פעם אחת

הקלות של Sandbox מתפרקת לשלושה חלקים: שיתוף קובצי OS בדיסק, שיתוף דפי OS ב-RAM, ו-תיאום הקצאת זיכרון עם המארח.

4.1. Dynamic base image: Windows שלם ב-500 MB

Windows Sandbox הוא desktop Windows חד-פעמי שמבודד על ידי ה-hypervisor. סוגרים אותו והכול נעלם; בפעם הבאה הוא עולה בשניות ממצב נקי.1

החידה הראשונה היא הדיסק. הוא יכול לעשות boot ל-Windows שלם, ובכל זאת ה-base image של Sandbox הוא רק כ-500 MB אחרי התקנה ו-30 MB דחוס להפצה.2 הסוד הוא ה-dynamic base image.

  • רוב קובצי ה-OS בלתי-משתנים ואפשר לשתף אותם כמו שהם מהמארח.
  • רק המספר הקטן של קבצים משתנים אינו ניתן לשיתוף, ולכן נשמר עותק נקי שלהם בתוך ה-base image.
  • בעלייה, הקבצים הבלתי-משתנים של המארח והעותקים המקומיים של הקבצים המשתנים מורכבים ל-image Windows שלם.2

כלומר, Sandbox אינו מוריד ואינו מאחסן עותק של Windows; הוא עולה ב-שימוש חוזר ב-Windows שכבר מותקן במארח.

איך ה-dynamic base image מורכבקובצי ה-OS הבלתי-משתנים של Windows המארח משותפים, רק הקבצים המשתנים נשמרים כעותק נקי ב-base image, ושניהם מורכבים ל-image Windows השלם של Sandboxמשותפים כמו שהםעותק נקי נשמרWindows השלם של המארחקובצי OS בלתי-משתנים (הרוב המכריע)קובצי OS משתנים (מעטים)image העלייה של Sandboxעולה כ-Windows שלםרק כ-500 MB צריך לאחסן

איור 7: לא “לשמור עוד Windows” אלא “להרכיב אחד מ-Windows של המארח” הוא איך נראה ויתור על שכפול דיסק.

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

שימו לב שמה שנזרק הוא המצב המקומי בתוך Sandbox.

אם ממפים תיקייה ברת-כתיבה מהמארח בקובץ התצורה .wsb, שינויים שנעשו שם נשארים בצד המארח.6

מחזור החיים של Windows Sandboxעלייה מכינה Windows נקי בשניות, אחרי אימות אפליקציה או ניסויים סגירה זורקת את כל המצב בתוך Sandbox כך שהעלייה הבאה נקייה שוב, אבל שינויים לתיקיית מארח שממופה כברת-כתיבה נשאריםעלייה הבאהעלייה (שניות)Windows נקיאימות אפליקציה או ניסוייםסגירהזריקת כל המצב בתוך Sandboxשינויים בתיקייה ברת-כתיבה שממופה נשארים במארח

איור 8: הוא יכול לחזור למצב נקי בכל פעם כי החלק המשתנה הוא עותק חד-פעמי, וזריקתו היא חלק מהתכנון.

4.2. Direct map: אותו ntdll.dll הוא אותו דף פיזי

לא רק הדיסק אלא גם RAM משותף. כי Sandbox מריץ את אותו OS image כמו המארח, משתמשים בטכניקה שנקראת “direct map” כך של-OS binaries הוא משתמש ב-אותם דפי זיכרון פיזיים כמו המארח. כש-ntdll.dll נטען לזיכרון בתוך Sandbox, הוא מצביע לאותם דפים פיזיים כמו אותו binary שנטען במארח.

זה משיג memory footprint קטן בהרבה מ-VM מסורתי בלי לחשוף את סודות המארח לסיכון.2

“לשתף את אותו דף פיזי בין כמה משתמשים” הוא אותו רעיון כמו שיתוף DLL דרך section objects, שעקבנו אחריו בחלק 3 של סדרת הזיכרון (“Windows Memory Internals (חלק 3) — Section objects ו-Copy-on-Write”). המנגנון ההוא שיתף בין processes; Sandbox עושה זאת מעבר לגבול ה-VM.

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

איור 9: Direct map לוקח את רעיון שיתוף הדפים ששימש זמן רב בין processes ומחיל אותו מעבר לגבול ה-VM.

4.3. השאלת זיכרון והחזרתו: יותר כמו process מאשר כמו VM

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

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

איור 10: כשמדובר בשיתוף זיכרון, Sandbox עומד בצד של processes ולא של VMs, ומוותר על זיכרון כשהמארח בלחץ.

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

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

5. Containers — איפה למתוח את קו הבידוד

כאן לא שופטים בטיחות לפי השם “container” לבדו; בודקים אם ה-container חולק את ה-kernel עם המארח או שיש לו kernel משלו.

5.1. Process isolation ו-Hyper-V isolation

ל-Windows containers יש שני מצבי בידוד בזמן ריצה. ה-image זהה; בוחרים את המצב ב-flag בעלייה.7

  • Process isolation: כמה containers חולקים את ה-kernel עם המארח ומבודדים בווירטואליזציה לפי namespace של מערכת הקבצים, registry, פורטי רשת, מרחב process ID, Object Manager namespace וכדומה. זו כמעט אותה גישה כמו Linux containers.
  • Hyper-V isolation: כל container רץ בתוך VM ממוטב מאוד ויש לו מה שהוא בפועל kernel ייעודי. נוכחות ה-VM שמה בידוד ברמת חומרה בין containers וביניהם לבין המארח.7

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

בידוד תהליכים מול בידוד Hyper-Vתחת process isolation, containers חולקים את ה-kernel עם המארח ומבודדים ב-namespaces, ואילו תחת Hyper-V isolation לכל container יש kernel ייעודי בתוך VM ממוטבבידוד Hyper-Vבידוד תהליכיםkernel ייעודי (בתוך VM ממוטב)מיכל Ckernel ייעודי (בתוך VM ממוטב)מיכל Dkernel משותף עם המארחמיכל Aמיכל B

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

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

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

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

בחירת בידוד לפי עד כמה אפשר לסמוך על הקודעומס מהימן לוקח צפיפות וביצועים עם process isolation, בעוד קוד לא מהימן או קוד של מישהו אחר מקבל גבול hypervisor כמו Hyper-V isolated container, Windows Sandbox מוקשח עם רשת וכדומה כבויים, או VM מבודדכןלא, או קוד של מישהו אחראפשר לסמוך על הקוד הזה?Process isolation (צפיפות ומהירות קודם)לבחור גבול hypervisorHyper-V isolated containerSandbox מוקשח או VM מבודד

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

הערה: בתוך VM, בדקו את דרישות nested virtualization

הרצת Hyper-V isolated containers בתוך Hyper-V VM פירושה שתי שכבות hypervisor: nested virtualization.

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

הרצת WSL2 בתוך VM נתמכת באותו אופן.9 אם אפשר להשתמש ב-WSL2 או ב-Docker על VM פיתוח בענן תלוי גם כן אם גודל ה-VM והתצורה הזו חושפים nested virtualization.

מבנה nested virtualizationVM בענן יושב על ה-hypervisor של המארח הפיזי, ובתוכו hypervisor נוסף (הקינון נתמך לרמה אחת בלבד) רץ כדי לתמוך ב-WSL2 וב-Hyper-V isolated containersה-hypervisor של המארח הפיזיVM בענן (מכונת פיתוח)hypervisor בתוך ה-VM (רמת הקינון הראשונה)WSL2Hyper-V isolated containerהקינון נתמך לרמה אחת בלבד

איור 13: הסיבה ש-wsl רץ בתוך VM בענן היא ש-nested virtualization נתמך רשמית בדיוק לרמה אחת.

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

סידור כל מה שכוסה עד כאן על ציר אחד נותן את הבא.

הספקטרום של חוזק בידוד וקלותcontainers ב-process isolation הם הקלים ביותר אבל חולקים את ה-kernel, WSL2, Sandbox ו-Hyper-V isolated containers הם VMs קלות עם kernel ייעודי (Sandbox הוקל בשיתוף מארח, WSL2 ב-kernel שנבנה למטרה), ו-VM מלא הוא הכבד ביותר אבל לשימוש כלליקל ← → כבדProcess-isolated container (kernel משותף)WSL2, Sandbox, Hyper-V isolation (VMs קלות עם kernel ייעודי)VM מלא (מריץ הכול, מחזיק כל שכפול)גבול: namespacesגבול: hypervisorגבול: hypervisor + עצמאות מלאה

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

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

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

6.1. זמן עלייה של WSL2 וגידול והתכווצות זיכרון

עם Task Manager פתוח, נסו את הבא.

# תחושת זמן העלייה (בהרצה הראשונה ה-VM עולה; בהרצות הבאות זה מהיר יותר)
Measure-Command { wsl -e true }

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

# מכבים את כל ה-VM ורואים את הזיכרון חוזר
wsl --shutdown

מריצים build גדול או פעולת קבצים בתוך WSL2 ו-vmmem גדל; wsl --shutdown מחזיר הכול בבת אחת, ואפשר לראות את זה קורה.

6.2. הבדלי מהירות ממיקום קבצים ב-WSL2

שמים את אותו מאגר בצד Linux (~/repo) ובצד Windows (/mnt/c/repo), משווים את הזמן שלוקחים git status או חילוץ, וההבדל מסעיף 3.2 עולה כמספרים.

6.3. עליית זיכרון בצד המארח כש-Sandbox עולה

מפעילים Sandbox וצופים בעליית הזיכרון ב-Task Manager של המארח. זה שנשאר קטן בהרבה ממה ש”Windows שני שלם” היה מציע הוא אפקט השיתוף.

כדי לחפור הלאה בפירוק הזיכרון בצד המארח, מאמר כלי Sysinternals שמכסה איך להשתמש ב-RAMMap וב-VMMap (“Process Explorer / Handle / VMMap בפועל”) הוא הפניה שימושית.

אלה, עם זאת, כלים לסיווג processes וזיכרון פיזי בצד המארח; הם אינם צופים ישירות בשיתוף עם האורח עצמו.

6.4. הבדלים בין מצבי בידוד של Windows containers

אם יש סביבת Windows container, מעלים את אותו image ב-docker run --isolation=process וב---isolation=hyperv, ואז משווים את זמן העלייה ומה ש-Task Manager מראה (תחת process isolation, ה-processes בתוך ה-container מופיעים ברשימת ה-processes של המארח) כדי לקבל תחושה איפה קו הבידוד יושב.7

Process isolation, עם זאת, דורש שגרסאות המארח וה-image יתאימו, וב-OS לקוח הוא מוגבל לשימוש פיתוח ובדיקה. Hyper-V isolation מתיר טווח רחב יותר של שילובים, לכן עושים את ההשוואה עם זוג תואם.10

7. שלוש קריאות שגויות להימנע מהן בפועל

7.1. “WSL2 איטי”

מה שאיטי אינו WSL2 אלא נתיב ה-file I/O שחוצה את גבול ה-OS. במקרים רבים, פשוט העברת הפרויקט לצד Linux משנה את החוויה.4 ולהפך, מיקום קבצים שכלי Windows נוגעים בהם בצד Linux הוא חיסרון מאותה סיבה. מחליטים לפי “לשים באותו OS כמו מי שמשתמש בזה”.

7.2. “vmmem שגדל גדול הוא memory leak”

זיכרון WSL2 גדל ומתכווץ עם הביקוש, וזיכרון משוחרר מוחזר. ב-WSL הנוכחי, autoMemoryReclaim (ברירת מחדל dropCache) תובע גם את ה-file cache אוטומטית, כך ש”זה נשאר גדול” בדרך כלל נפתר מעצמו עם הזמן.5

אם זה עדיין נשאר, בודקים ש-autoMemoryReclaim אינו disabled וש-pageReporting, שמחזיר זיכרון משוחרר, לא כובה (ושאינכם על WSL ישן); ואז או קובעים תקרה מפורשת עם memory ב-.wslconfig או מחזירים הכול עם wsl --shutdown בסוף סשן.

הגישה להחלטה אם זו leak זהה לזו שבחלק המבוא של סדרת הזיכרון, “מה באמת אומר Memory Usage ב-Windows”.

7.3. “זה ב-container, אז זה בטוח”

containers ב-process isolation חולקים את ה-kernel, ולפי הסטנדרט של Microsoft הם אינם גבול אבטחה.8 להרצת קוד לא מהימן או דגימות, בוחרים בידוד שיש לו גבול hypervisor: Hyper-V isolated container, Windows Sandbox, או VM ייעודי.

גבול hypervisor, עם זאת, אינו כרטיס חופשי אוניברסלי.

הגדרות ברירת המחדל של Windows Sandbox כוללות רשת מופעלת, מה שיכול לחשוף אפליקציה לא מהימנה לרשת הפנימית שלכם.1 אם משתמשים בו להרצת דגימות, או מחזקים את הבידוד בכיבוי רשת והפניית clipboard בקובץ התצורה .wsb, או משתמשים ב-VM ייעודי ברשת מבודדת.

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

נקודות המפתח של חלק 3.

  • הקלות של VMs קלות היא תוצאה של “הפסקת שכפול”, לא של “החלשת בידוד”.
  • WSL2 מריץ Linux kernel אמיתית ב-utility VM מנוהלת קלת-משקל, וההפצות מבודדות כ-containers בתוך ה-VM הזו.3 כלל הביצועים הוא לשים קבצים ב-OS שמשתמש בהם; הזיכרון גדל ומתכווץ דינמית, ו-.wslconfig שולט בתקרה.45
  • Windows Sandbox משתף את קובצי ה-OS הבלתי-משתנים של המארח דרך dynamic base image ואת הדפים הפיזיים של OS binaries רלוונטיים דרך direct map, כך שהוא אינו מחזיק עותק של Windows שלם.2 כ-500 MB של קבצים משתנים וזיכרון האפליקציות שמריצים בתוכו עדיין נדרשים בנפרד.
  • מצב בידוד של container נבחר בעלייה, והצד שאפשר לקרוא לו גבול אבטחה הוא Hyper-V isolation.78

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

  • חלק 1: מתחת ל-Windows יש שכבת hypervisor, ו-OS המארח עצמו רץ כ-root partition. השכבה הזו מתווכת CPU וזיכרון (SLAT) ישירות, ו-I/O ל-synthetic devices מתווך על ידי ה-root partition (VSP) בקצה הרחוק של VMBus.
  • חלק 2: השכבה הזו משמשת לא רק לבידוד VMs זה מזה אלא גם למתוח גבול חזק מה-kernel (VTL) בתוך אותו OS. אבטחת ברירת המחדל של Windows 11 בנויה מעליה.
  • חלק 3: על אותה שכבה, חיתוך שכפול הוא מה שמאפשר “virtual machine שעולה בשניות”. קו הבידוד נשמר, וזה הפך לכלי יומיומי.
כל הסדרה בתמונה אחתה-hypervisor ישירות על החומרה הוא חלק 1, הפרדת VTL0 ו-VTL1 בתוך Windows המארח היא חלק 2, והקלות של WSL2, Sandbox ו-Hyper-V isolation על אותה שכבה היא חלק 3, עם containers ב-process isolation שחולקים את kernel המארח, Sandbox שהוקלה בשיתוף, ו-WSL2 ב-kernel שנבנה למטרהחומרהhypervisor (חלק 1)Windows המארח (הפרדת VTL היא חלק 2)WSL2, Sandbox, Hyper-V isolation (חלק 3)Process-isolated container (kernel משותף)Sandbox הוקל בשיתוף, WSL2 ב-kernel שנבנה למטרה

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

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

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

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

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

קישורים

  1. Microsoft Learn, Windows Sandbox. על כך ש-Windows Sandbox עולה בשניות כ-VM חד-פעמי וזורק הכול בסגירה; על כך שהוא מריץ kernel נפרד על Microsoft hypervisor כדי לבודד אותו מהמארח; ועל כך שהרשת מופעלת כברירת מחדל וניתנת לכיבוי בקובץ התצורה. ↩ ↩2 ↩3

  2. Microsoft Learn, Windows Sandbox architecture. על כך שה-dynamic base image מרכיב image Windows שלם מקובצי OS בלתי-משתנים משותפים של המארח ועוד עותק נקי של הקבצים המשתנים (כ-500 MB אחרי התקנה); על כך שה-container מקצה זיכרון דינמית בתיאום עם המארח, בניגוד להקצאת זיכרון סטטית של VM מסורתי, כך שהמארח יכול לתבוע זיכרון; ועל כך ש-direct map גורם ל-OS binaries כמו ntdll.dll להשתמש באותם דפים פיזיים כמו המארח. ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  3. Microsoft Learn, What is the Windows Subsystem for Linux?. על כך ש-WSL2 מריץ Linux kernel בתוך utility VM קלת-משקל, ועל כך שכל הפצה רצה כ-container מבודד שחולק את network namespace ואת ה-kernel תוך הפרדת namespaces כמו PID, mount ו-user. ↩ ↩2 ↩3

  4. Microsoft Learn, Comparing WSL Versions. על כך ש-kernel של WSL2 נבנה על ידי Microsoft מענף Stable; על כך ש-WSL שמופץ ב-Store מקבל עדכונים כחבילה מנותקת מ-OS image ומחיל אותם ב-wsl --update (ההפצה הישנה in-box עברה דרך Windows Update); על דוגמאות ביצועים כמו עד 20x לחילוץ tarball; על כך ש-WSL1 מהיר יותר בין מערכות קבצים של OS, ולכן יש לשים קבצים ב-OS שמשתמש בהם; ועל כך שהזיכרון גדל ומתכווץ עם זיכרון משוחרר שמוחזר, בעוד ה-cache עשוי לא לחזור עד שה-VM נסגרת. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  5. Microsoft Learn, Advanced settings configuration in WSL. על כך שהסעיף [wsl2] ב-.wslconfig קובע את תקרת הזיכרון, מספר המעבדים, swap ו-pageReporting (מופעל כברירת מחדל; מזהה ומחזיר זיכרון לא בשימוש) ל-VM של WSL2 כולה, ועל כך שההגדרה הניסיונית autoMemoryReclaim ברירת המחדל שלה dropCache כך שזיכרון cache נתבע אוטומטית. ↩ ↩2 ↩3 ↩4 ↩5

  6. Microsoft Learn, Use and configure Windows Sandbox. על כך ש-MappedFolders בקובץ התצורה .wsb משתף תיקיית מארח לקריאה בלבד או לכתיבה. ↩

  7. Microsoft Learn, Isolation Modes. על כך ש-process isolation ב-Windows containers חולק את ה-kernel עם המארח ומבודד ב-namespaces; על כך של-Hyper-V isolation יש מה שהוא בפועל kernel ייעודי בתוך VM ממוטב; ועל כך שאותו image ניתן להרצה בכל אחד מהמצבים דרך flag בעלייה. ↩ ↩2 ↩3 ↩4

  8. Microsoft Learn, Secure Windows containers. על כך שרק containers שמבודדים ב-hypervisor מטופלים כגבול אבטחה, על כך ש-containers ב-process isolation אינם נחשבים לגבול אבטחה חזק, ועל כך ש-hypervisor isolation הוא הבחירה ל-multi-tenancy עוין. ↩ ↩2 ↩3

  9. Microsoft Learn, What is Nested Virtualization?. על כך שהרצת Hyper-V isolated containers בתוך Hyper-V VM (רמת קינון אחת) נתמכת בייצור; על כך שהדרישות הן מארח Windows Server 2016 / Windows 10 ואילך למעבדי Intel ומארח Windows Server 2022 / Windows 11 ואילך למעבדי AMD, ועוד גרסת תצורת VM מתאימה בכל מקרה; על כך שההגדרה שחושפת את הרחבות הווירטואליזציה ל-VM החיצוני (ExposeVirtualizationExtensions) היא דרישה מוקדמת; ועל כך שהרצת WSL2 בתוך Hyper-V VM נתמכת. ↩

  10. Microsoft Learn, Windows container version compatibility. על כך ש-process isolation דורש שגרסאות המארח ו-container image יתאימו; על כך ש-Hyper-V isolation יכול להריץ image של גרסת OS שונה מהמארח; ועל כך ש-process isolation ב-OS לקוח מוגבל לשימוש פיתוח ובדיקה. ↩

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

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

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

שאלות נפוצות

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

האם WSL2 הוא virtual machine?
כן. WSL2 מריץ Linux kernel אמיתית שבונה Microsoft בתוך utility VM קלת-משקל. ה-VM מנוהלת על ידי WSL מאחורי הקלעים, כך שהתכנון לעולם לא גורם למשתמש לחשוב על הגדרות VM או על המתנה ל-boot. כל הפצת Linux רצה כ-container מבודד בתוך ה-VM המנוהלת הזו.
למה פעולות קבצים תחת /mnt/c איטיות ב-WSL2?
כי גישה מ-Linux kernel של WSL2 למערכת הקבצים בצד Windows עוברת דרך שיתוף קבצים שחוצה גבול OS. פעולות על מערכת הקבצים של Linux (virtual disk מסוג ext4) מהירות, ולכן הכלל הוא לשמור קובצי פרויקט בצד ה-OS שבו הכלים שעובדים עליהם נמצאים.
האם שימוש גדול בזיכרון של process vmmem הוא leak?
ברוב המקרים זו אינה leak. זיכרון WSL2 גדל ומתכווץ עם השימוש, וזיכרון ש-processes שחררו מוחזר ל-Windows תחת ההגדרה pageReporting, שמופעלת כברירת מחדל. גם דפי file cache נתבעים בחזרה אוטומטית על ידי WSL הנוכחי דרך autoMemoryReclaim ב-.wslconfig (ברירת המחדל היא dropCache). בסביבות שבהן ההגדרות האלה הושבתו, או ב-WSL ישן יותר, הזיכרון יכול להישאר עד שה-VM יוצאת; במקרה כזה קבעו תקרה עם ההגדרה memory, או החזירו אותו עם wsl --shutdown.
איך Windows Sandbox יכול לאתחל Windows שלם מכמה מאות MB של דיסק?
דרך מנגנון שנקרא dynamic base image. הוא משתף את קובצי ה-OS הבלתי-משתנים מ-Windows שכבר מותקן במארח, ושומר עותק נקי רק של המספר הקטן של קבצים משתנים. זה מאפשר להרכיב image שלמה וברת-boot בלי לאחסן עותק מלא של Windows.
האם containers בטוחים יותר מ-virtual machines?
זה תלוי במצב הבידוד. containers ב-process isolation חולקים את ה-kernel עם המארח, ו-Microsoft לא מחשיבה זאת כגבול אבטחה חזק. כשמטפלים בקוד עוין, צריך Hyper-V isolation, שנותן לכל container kernel ייעודית משלו.

פרופיל הכותב

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

Go Komura

מנהל KomuraSoft LLC

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

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

חזרה לבלוג