- โครงสร้าง subsystem ของ Windows NT เป็นการจัดวางระบบที่ทำหน้าที่เป็น ชั้นการแปลการเรียก API เพื่อรันโปรแกรมของระบบปฏิบัติการอื่น
- WSL1 สืบสานแนวทางนี้ โดยทำงานเป็น ชั้นแปลที่กะทัดรัด ที่แปลงการเรียก Linux ไปเป็นการเรียกของเคอร์เนล Windows
- WSL2 เปลี่ยนมาเป็น Linux VM แบบครบถ้วน บนพื้นฐาน Hyper-V เพื่อแก้ปัญหาประสิทธิภาพ และรัน เคอร์เนล Linux ตัวจริง
- WSL2 ให้ความ ผสานรวมสูงกว่า VM แบบทั่วไปผ่าน การจัดการหน่วยความจำแบบไดนามิก, การเมานต์ไดรฟ์ของ Windows, และ การรวม GUI ผ่าน WSLg
- แม้ยังมีข้อจำกัดด้านความไม่สะดวกในการจัดการไฟล์และการพึ่งพาอิมเมจดิสก์ แต่ความสำคัญคือความยืดหยุ่นในการเลือกใช้ ข้อดีและข้อเสียของ WSL1 กับ WSL2 ตามสถานการณ์
แนวคิดเรื่อง subsystem ของ Windows NT
- Subsystem (subsystem) ของ Windows NT หมายถึง ชุด API และชั้นการแปลการเรียก เพื่อรันโปรแกรมของระบบปฏิบัติการอื่น
- ในอดีต NT มี OS/2 Subsystem (OS2SS.EXE) , POSIX Subsystem (PSXSS.EXE) เป็นต้น
- CSRSS.EXE ทำหน้าที่เป็นชั้นแปลง Win32 API โดยบางฟังก์ชันถูกย้ายไปทำงานที่โหมดเคอร์เนล (
WIN32K.SYS)
- POSIX Subsystem เป็นการใช้งานขั้นต่ำเพื่อการรับรองของรัฐบาล และต่อมาถูกแทนที่ด้วย Windows Services for Unix ที่อิงบน Interix
WSL1: ชั้น Linux แบบแปลงคำสั่ง
- WSL1 (Windows Subsystem for Linux) เป็น ชั้นแปลบางส่วน ที่แปลง system call ของ Linux เป็นการเรียกของ Windows
- เมื่อตอนรัน
bash process จะใช้หน่วยความจำเพียงไม่กี่ MB และจะแสดงใน Task Manager เป็นโปรเซสปกติ
- root filesystem มีอยู่เป็นโครงสร้างไฟล์รายตัวบน NTFS จึงแทบไม่มีค่าใช้จ่ายด้านพื้นที่จัดเก็บ
- ข้อจำกัด
- ประสิทธิภาพ I/O ลดลง: ค่าใช้จ่ายจากการแปลงเนื่องจากความต่างของ Linux และ Win32 filesystem API
- เมื่อรัน GUI ต้องใช้ X server ภายนอก (เช่น X410)
- ไม่รองรับ Raw socket ทำให้รัน
traceroute, nmap, tcpdump ไม่ได้
WSL2: Linux VM บน Hyper-V
- ตามความต้องการของผู้ใช้ Microsoft จึงนำเข้ารูปแบบ Linux VM ที่ทำงานบน Hyper-V แบบครบถ้วน
- root filesystem ถูกจัดการเป็น ไฟล์ VHDX เดี่ยว
- โดยใช้คำสั่ง
wsl --set-version "Ubuntu" 2 เพื่อสลับระหว่าง WSL1 และ WSL2 ได้
- ลักษณะประสิทธิภาพ
- การบูตครั้งแรกช้ากว่า แต่สามารถรัน เคอร์เนล Linux แท้ ได้
- การใช้หน่วยความจำเป็นแบบไดนามิก และ ขยายได้สูงสุดถึงครึ่งหนึ่งของหน่วยความจำกายภาพ
- ผลทดสอบคำสั่ง
stress ระบุว่าหน่วยความจำเพิ่มตามภาระงานแล้วลดลงอัตโนมัติ
- เมื่อจำเป็นสามารถสั่งปิด VM ด้วยคำสั่ง
wsl --shutdown ได้
ความสามารถในการผสานรวมและข้อจำกัดของ WSL2
- WSL2 เสริมความผสานกับ Windows มากขึ้นเมื่อเทียบกับ VM แบบดั้งเดิม
- การเมานต์ไดรฟ์ของ Windows โดยอัตโนมัติ, เข้าถึงไดรฟ์ Linux ผ่านพาธ
\\wsl$\\, รันแอป GUI ผ่าน WSLg
- แอป GUI จะถูกสตรีมผ่าน Remote Desktop Protocol และการปรับสเกล DPI หรือข้อความอาจต้องตั้งค่าแยก
- ปัญหาการจัดการไฟล์
- ข้อมูลงานของ Linux ถูกเก็บไว้ในอิมเมจ
ext4.vhdx ทำให้เกิดความเสี่ยงด้านความพกพาและการกู้คืน
- เมื่อรัน
wsl --unregister Distro แล้ว ข้อมูลทั้งหมดจะถูกลบทันที
- การใช้ Windows drive (
/mnt/c) เผชิญการชะลอตัวจากโอเวอร์เฮดของ NTFS และ VM
- โปรโตคอลระบบไฟล์
- WSL1 ใช้
drvfs, WSL2 ใช้ โปรโตคอล 9p ของ Plan9
- มีการกล่าวถึงกรณีข้อบกพร่องจากกระบวนการแปลงที่เกิดค้างเกี่ยวกับ
drvfs
- ทางเลือก
- แนะนำให้สร้าง อิมเมจ VHDX แยก แล้วเมานต์ด้วย
wsl --mount --vhd เพื่อแยกข้อมูลงาน
.wslconfig ไม่สามารถตั้งค่าอัตโนมัติได้ ต้องจัดการผ่านสคริปต์
สรุป
- การออกแบบเชิงโมดูลของ Windows NT และ kernel ABI ที่เสถียร ช่วยคงความเข้ากันได้ของไดรเวอร์รุ่นเก่าไว้ได้
- WSL1 มีข้อดีคือใช้หน่วยความจำต่ำ ส่วน WSL2 ให้ความเข้ากันได้และประสิทธิภาพสูงขึ้นด้วยเคอร์เนล Linux ตัวจริง
- WSL2 เป็นโครงสร้างที่ ลดข้อเสียของ VM และเสริมการผสานกับ OS โฮสต์
- ตามคำจำกัดความแบบดั้งเดิมแล้ว WSL2 ใกล้เคียง VM แต่มีคุณค่าเพียงพอที่จะเรียกว่า “subsystem” ในฐานะ “สภาพแวดล้อมผสานที่กะทัดรัด”
3 ความคิดเห็น
ว้าว มีนักพัฒนาชื่อ Sseuk อยู่ด้วยนะ
ความเห็นจาก Hacker News
WSL2 ทำงานอยู่บน ส่วนย่อย ของ Hyper-V และโดยพื้นฐานแล้วก็เป็น VM บนไฮเปอร์ไวเซอร์
แต่ก็มีจุดที่ต่างจาก Hyper-V VM ทั่วไปอยู่ เช่น Linux distribution บน WSL2 สามารถใช้ GPU acceleration ได้แม้ในสภาพแวดล้อม X หรือ Wayland ผ่าน GPU partitioning (กล่าวคือ PCI/GPU passthrough) และการติดตั้งใช้งาน DirectX แบบพิเศษ
ฟีเจอร์แบบนี้ใน Hyper-V ทั่วไปก็พอทำได้ผ่านการแฮ็กด้วย PowerShell เป็นต้น แต่ในทางการรองรับเฉพาะบน Windows Server เท่านั้น
กำลังคิดอยู่ว่าจะเขียนโพสต์ใหม่เกี่ยวกับฟีเจอร์ด้านกราฟิกเหล่านี้ดีไหม
เพียงแต่การบอกว่า “X หรือ Wayland เป็นตัวเรนเดอร์” นั้นเป็นความเข้าใจผิด จริง ๆ แล้วตัวที่ใช้ GPU คือแอปพลิเคชันเอง และ X/Wayland ทำหน้าที่ประมาณ window compositing หลังเรนเดอร์เสร็จเท่านั้น
แม้จะมีงานซับซ้อนอย่างการแปลงสีก็จริง แต่ปริมาณการคำนวณไม่ได้มาก
WSL1 ใช้พื้นฐานแบบ pico process ซึ่งเป็นเทคโนโลยีที่แตกแขนงมาจากงานวิจัย Drawbridge
ดูวิดีโอที่เกี่ยวข้อง The Linux Kernel Hidden Inside Windows 10 และ WSL Pico Process Overview
เทคโนโลยี Drawbridge แบบเดียวกันนี้ยังถูกใช้ตอนรัน SQL Server บน Linux ด้วย
มีอธิบายไว้ละเอียดใน บทความ Ars Technica
เข้าใจเหตุผลที่เปลี่ยนไปใช้ WSL2 แต่ก็น่าเสียดายที่หยุดพัฒนา WSL1 ไปเลย
สภาพแวดล้อม CI ของเราส่วนใหญ่เป็น Linux แต่มี toolchain บางตัวที่ทำงานบน Wine ได้ไม่ดีนัก (เช่น MSVC)
เลยจำเป็นต้องมีสภาพแวดล้อมที่รัน Linux build บน Windows ได้อย่างราบรื่น WSL1 ทำแบบนั้นได้ แต่ WSL2 ไม่แชร์ process namespace หรือ file descriptor จึงต้องใช้ วิธีอ้อม หลายอย่าง
แม้ความเร็ว IO จะดีขึ้น แต่การแชร์ไฟล์ช้า จึงไม่เหมาะกับการใช้งานจริง
/mnt/cได้ผมเคยใช้วิธีนี้ build Python C extension module มาก่อน
WSL2 เป็น VM ที่ผสานรวมกับสภาพแวดล้อม Windows อย่างแนบแน่น
ที่บริษัทบังคับให้ใช้ Windows ตามนโยบาย เลยใช้งานมันทุกวันเพื่อพัฒนา และในกรณีส่วนใหญ่ก็ถือว่าใช้งานได้สบายพอสมควร
แต่อิงกับ RHEL8 เลยไม่สะดวกที่รองรับแค่สาย Debian อยากรู้เหมือนกันว่าช่วงนี้การรองรับแอปกราฟิกเป็นอย่างไรบ้าง
psหรือtopก็เห็นแค่โปรเซสใน VM เท่านั้นใช้
docker run -it ubuntuก็ให้ความสามารถคล้ายกันได้ เลยสงสัยว่าต่างกันตรงไหนสำหรับผมเอง workspace ที่แยกขาด นั้นใช้งานลำบากมาก
WSL2 ท้ายที่สุดก็คือ VM แบบ lightweight คล้ายแนวคิดของ Firecracker ที่เน้นบูตเร็วและใช้หน่วยความจำน้อย
แต่ถ้ารัน Docker หลายตัวพร้อมกัน ความต้องการหน่วยความจำก็จะสูงขึ้น อย่างน้อยควรมีเกิน 20GB ถึงจะใช้งานได้สบาย
โดยส่วนตัวผมว่า WSL1 มีประโยชน์กว่ามาก C++, .NET toolchain, ssh/scp และ เครื่องมือ CLI ส่วนใหญ่ทำงานได้ดี
ส่วน WSL2 แทบไม่มีประโยชน์เลย ถ้าต้องการ Linux VM ผมใช้ VMware
VMware มีฟีเจอร์ครบกว่า เช่น snapshot tree, 3D acceleration, การเชื่อมต่ออุปกรณ์ USB, การตั้งค่า virtual network และ GUI ก็ใช้งานสะดวก
ดิสก์ VM ภายใน WSL สามารถเข้าถึงได้ผ่านพาธ
\\wsl$ถ้าซอฟต์แวร์เก่าไม่รองรับพาธแบบ UNC ก็แก้ได้ด้วยการแมปเป็นอักษรไดรฟ์
มีปัญหาที่ไฟล์ VHDX โตขึ้นเรื่อย ๆ ต้อง compact เองด้วยมือ
systemd-trimดูประเด็นที่เกี่ยวข้องได้ที่ GitHub WSL #12103
ถ้ายังไม่พอ อาจใช้ วิธี optimize แบบ manual ได้
เพิ่มเติมคือ WSL โดยปกติจะ ข้ามกฎของ Windows Firewall ไปเลย ทำให้งงว่าทำไม Microsoft ถึงออกแบบแบบนี้
สงสัยว่าจะสามารถเมานต์พาร์ทิชัน ext4 จริงเพื่อลด การสูญเสียประสิทธิภาพ ที่เกิดจากการจำลอง block device แบบอิงไฟล์ image ได้หรือไม่
พอเริ่มใช้ WSL2 บ่อยขึ้น ช่วงที่การใช้งานลินุกซ์ค่อย ๆ น้อยลง ผมก็เริ่มคิดขึ้นมาว่า นี่ก็เป็น EEE เหมือนกันหรือเปล่า?
EEE - โอบรับ, ขยาย, และทำลายล้าง (Embrace, Extend, and Extinguish)