- Kiến trúc subsystem của Windows NT từ lâu đã được cấu thành như một lớp chuyển đổi lời gọi API để chạy chương trình dành cho các hệ điều hành khác
- WSL1 tiếp nối truyền thống đó, hoạt động như một lớp dịch nhẹ chuyển lời gọi Linux sang lời gọi nhân Windows
- WSL2 được chuyển thành một VM Linux hoàn chỉnh dựa trên Hyper-V để giải quyết vấn đề hiệu năng, đồng thời chạy nhân Linux thực sự
- WSL2 cung cấp mức độ tích hợp cao hơn VM thông thường nhờ quản lý bộ nhớ động, gắn kết ổ đĩa Windows, tích hợp GUI qua WSLg
- Dù có những giới hạn như bất tiện trong quản lý tệp và phụ thuộc vào ảnh đĩa, điều quan trọng là sự linh hoạt khi có thể chọn lọc ưu và nhược điểm của WSL1 và WSL2
Khái niệm subsystem của Windows NT
- Subsystem của Windows NT là tập API và lớp chuyển đổi lời gọi dùng để chạy chương trình cho các hệ điều hành khác
- Trước đây NT từng có subsystem OS/2 (OS2SS.EXE), subsystem POSIX (PSXSS.EXE), v.v.
- CSRSS.EXE là lớp chuyển đổi Win32 API, và một phần chức năng sau này được chuyển sang chế độ nhân (
WIN32K.SYS)
- Subsystem POSIX chỉ là mức triển khai tối thiểu nhằm phục vụ chứng nhận của chính phủ, và về sau được thay thế bằng Windows Services for Unix dựa trên Interix
WSL1: lớp Linux dựa trên dịch lệnh gọi
- WSL1 (Windows Subsystem for Linux) là một lớp dịch mỏng chuyển các system call của Linux thành lời gọi của Windows
- Khi chạy, chỉ tiến trình
bash dùng vài MB bộ nhớ, và được hiển thị như một tiến trình bình thường trong Task Manager
- Root filesystem tồn tại dưới dạng cấu trúc tệp riêng lẻ trên NTFS, nên gần như không có overhead về dung lượng lưu trữ
- Hạn chế
- Hiệu năng I/O suy giảm: chi phí chuyển đổi do khác biệt giữa API filesystem của Linux và Win32
- Cần X server bên ngoài để chạy GUI (ví dụ: X410)
- Không hỗ trợ raw socket, nên không thể chạy
traceroute, nmap, tcpdump, v.v.
WSL2: VM Linux dựa trên Hyper-V
- Theo nhu cầu của người dùng, Microsoft đã đưa vào một VM Linux hoàn chỉnh chạy trên Hyper-V
- Root filesystem được quản lý bằng một tệp VHDX duy nhất
- Có thể chuyển đổi giữa WSL1↔WSL2 bằng lệnh
wsl --set-version "Ubuntu" 2
- Đặc tính hiệu năng
- Khởi động ban đầu chậm hơn, nhưng chạy nhân Linux native
- Mức sử dụng bộ nhớ là động và có thể mở rộng tới tối đa một nửa bộ nhớ vật lý
- Kết quả thử nghiệm
stress cho thấy mức sử dụng bộ nhớ tăng theo tải rồi tự động thu hẹp lại
- Khi cần có thể tắt VM bằng lệnh
wsl --shutdown
Tính năng tích hợp và giới hạn của WSL2
- Không giống VM truyền thống, WSL2 tăng cường khả năng tích hợp với Windows
- Tự động mount ổ đĩa Windows, truy cập ổ đĩa Linux qua đường dẫn
\\wsl$\, chạy ứng dụng GUI qua WSLg
- Ứng dụng GUI được stream qua giao thức Remote Desktop, còn DPI hay text scaling thì cần cấu hình riêng
- Vấn đề quản lý tệp
- Dữ liệu làm việc trên Linux được lưu bên trong ảnh
ext4.vhdx, nên tồn tại rủi ro về tính di động và khôi phục
- Khi chạy
wsl --unregister Distro, toàn bộ dữ liệu sẽ bị xóa ngay lập tức
- Khi dùng ổ đĩa Windows (
/mnt/c), hiệu năng giảm do overhead của NTFS + VM
- Giao thức filesystem
- WSL1 dùng
drvfs, còn WSL2 dùng giao thức 9p của Plan9
- Có nhắc đến trường hợp phát sinh lỗi khiến
drvfs còn sót lại trong quá trình chuyển đổi
- Giải pháp thay thế
- Khuyến nghị tạo ảnh VHDX riêng rồi mount bằng
wsl --mount --vhd để tách riêng dữ liệu làm việc
- Không thể cấu hình tự động trong
.wslconfig, nên cần xử lý bằng script
Kết luận
- Thiết kế mô-đun và ABI nhân ổn định của Windows NT giúp duy trì khả năng tương thích với các driver cũ
- WSL1 có ưu điểm là dùng ít bộ nhớ, còn WSL2 cung cấp khả năng tương thích và hiệu năng cao hơn nhờ nhân Linux thực sự
- WSL2 là một kiến trúc giảm thiểu nhược điểm của VM và tăng cường tích hợp với hệ điều hành host
- Theo định nghĩa truyền thống thì nó gần với VM, nhưng với tư cách một môi trường tích hợp nhẹ, nó vẫn xứng đáng được gọi là một “subsystem”
2 bình luận
Wow, có cả dev Ssuk ở đây nữa
Ý kiến Hacker News
WSL2 chạy trên một tập con của Hyper-V, và về cơ bản là một VM nằm trên hypervisor
Tuy nhiên, nó có điểm khác với VM Hyper-V thông thường. Ví dụ, bản phân phối Linux trong WSL2 có thể dùng tăng tốc GPU ngay cả trong môi trường X hoặc Wayland thông qua phân vùng GPU (tức PCI/GPU passthrough) và một triển khai đặc biệt của DirectX
Những tính năng này cũng có thể thực hiện trên Hyper-V thường bằng cách tinh chỉnh qua PowerShell, nhưng chính thức chỉ được hỗ trợ trên Windows Server
Tuy vậy, nói rằng “X hay Wayland đảm nhiệm việc render” là hiểu nhầm. Thực tế chính ứng dụng mới là thứ dùng GPU, còn X/Wayland chỉ đảm nhiệm compositing cửa sổ sau khi render xong
Cũng có những tác vụ phức tạp như chuyển đổi màu sắc, nhưng khối lượng tính toán không lớn
WSL1 dựa trên pico process, là công nghệ phát sinh từ nghiên cứu Drawbridge
Có thể xem video liên quan The Linux Kernel Hidden Inside Windows 10 và WSL Pico Process Overview
Công nghệ Drawbridge này cũng được dùng khi chạy SQL Server trên Linux
Bài viết Ars Technica có giải thích chi tiết
Tôi hiểu lý do họ chuyển sang WSL2, nhưng vẫn tiếc vì đã ngừng hẳn việc phát triển WSL1
Môi trường CI của chúng tôi phần lớn dựa trên Linux, nhưng một số toolchain lại không chạy tốt trong Wine, chẳng hạn như MSVC
Vì vậy chúng tôi cần một môi trường có thể chạy build Linux mượt mà ngay trên Windows. WSL1 làm được điều này, nhưng WSL2 không chia sẻ namespace tiến trình hay file descriptor nên phải dùng nhiều cách lách khác nhau
Tốc độ IO đã nhanh hơn, nhưng chia sẻ tệp lại chậm nên không phù hợp để dùng thực tế
/mnt/cTrước đây tôi từng build mô-đun mở rộng C cho Python bằng cách này
WSL2 rốt cuộc là một VM được tích hợp rất chặt với môi trường Windows
Do chính sách công ty bắt buộc phải dùng Windows nên tôi sử dụng nó hằng ngày để phát triển, và trong đa số trường hợp trải nghiệm khá ổn
Tuy nhiên hệ thống dựa trên RHEL8 nên việc chỉ hỗ trợ hệ Debian khá bất tiện. Không biết dạo này hỗ trợ ứng dụng đồ họa thế nào
pshaytopchỉ thấy tiến trình của VM.Với
docker run -it ubuntucũng có thể có trải nghiệm tương tự, nên tôi tò mò điểm khác biệt là gì.Cá nhân tôi thấy không gian làm việc tách biệt quá bất tiện
WSL2 cuối cùng vẫn là một VM nhẹ. Khái niệm này tương tự Firecracker, hướng tới khởi động nhanh và dùng ít bộ nhớ
Nhưng nếu chạy nhiều Docker thì nhu cầu bộ nhớ sẽ tăng mạnh. Phải có ít nhất hơn 20GB mới dùng thoải mái
Cá nhân tôi thấy WSL1 hữu ích hơn nhiều. Hầu hết công cụ CLI như C++, toolchain .NET, ssh/scp đều chạy tốt
Trong khi đó WSL2 gần như không có ích gì với tôi. Nếu cần VM Linux thì tôi dùng VMware
VMware có rất nhiều tính năng như cây snapshot, tăng tốc 3D, kết nối thiết bị USB, cấu hình mạng ảo, và GUI cũng tiện lợi
Có thể truy cập đĩa VM bên trong WSL qua đường dẫn
\\wsl$Nếu phần mềm cũ không hỗ trợ đường dẫn UNC thì có thể ánh xạ sang ký tự ổ đĩa để giải quyết
Có vấn đề là file VHDX cứ tiếp tục phình to. Phải compact thủ công
systemd-trimXem issue liên quan tại GitHub WSL #12103
Nếu vẫn không được thì có thể dùng cách tối ưu thủ công
Nhân tiện, WSL mặc định bỏ qua các quy tắc tường lửa Windows. Không hiểu vì sao Microsoft lại thiết kế như vậy
Tôi tự hỏi liệu có thể mount phân vùng ext4 thật để giảm mất hiệu năng do mô phỏng block device dựa trên file image hay không