9 điểm bởi GN⁺ 2025-12-02 | 2 bình luận | Chia sẻ qua WhatsApp
  • 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

 
crawler 2025-12-02

Wow, có cả dev Ssuk ở đây nữa

 
GN⁺ 2025-12-02
Ý 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

    • Tôi cứ nghĩ GPU passthrough cũng hoạt động trên Windows 11 mặc định, nhưng chưa xem kỹ. Dù vậy đây vẫn là một tính năng khá ấn tượng
    • Xét cho cùng thì nó vẫn chỉ là VM bình thường, nhưng phần tự động hóa là điểm hay
      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
    • Có phải cả WSL2 và kernel WinNT đều chạy gần như ở cùng một mức trên Hyper-V không? Tất nhiên kernel NT có nhiều quyền truy cập phần cứng hơn
    • Nghĩ đến cảnh phải mua và cài giấy phép Windows Server chỉ để chạy Linux thì khá buồn cười
    • Tích hợp đồ họa của WSL2 làm tôi thất vọng hơn mong đợi. Thiết lập X-server ngày xưa còn tốt hơn. Nhưng X không hỗ trợ các API hiện đại nên các nhà phát triển ngày càng ít quan tâm. Hy vọng khi hỗ trợ WSL2 tăng lên thì mọi thứ sẽ cải thiệ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 10WSL 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ế

    • Trong WSL2 vẫn có thể truy cập file Windows qua /mnt/c
    • Một cách khác là kết hợp clang-cl với xwin thay cho MSVC.
      Trướ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

    • Tôi đang làm việc trong VM do công ty cấp, nhưng hiệu năng ngày càng ngột ngạt. Tôi đang cân nhắc chuyển sang WSL2.
      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
    • Nghe nói là “tích hợp chặt”, nhưng thực tế trong ps hay top chỉ thấy tiến trình của VM.
      Với docker run -it ubuntu cũ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

    • May là giờ laptop RAM 32GB không còn đắt như trước nữa
    • WSL2 khởi động cực nhanh, chỉ 1~2 giây, nên tôi tò mò họ triển khai kiểu gì. Bỏ qua màn hình BIOS thì dễ hiểu, nhưng có vẻ còn thêm một số tối ưu khác
  • 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

    • Bật sparse VHD sẽ giúp phần nào. Không hoàn hảo nhưng có thể xử lý một phần bằng dịch vụ systemd-trim
      Xem 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
    • Dù có tính năng tự động thu nhỏ, đôi khi nó lại gây thêm vấn đề
  • 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

    • Thật vậy sao? Tôi luôn rất khổ sở vì kết nối ssh trong WSL không ổn định
  • 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