複製鏈接
請複製以下鏈接發送給好友

wsl

(適用於Windows的Linux子系統)

鎖定
Windows Subsystem for Linux(簡稱WSL)是一個在Windows 10\11上能夠運行原生Linux二進制可執行文件ELF格式)的兼容層。它是由微軟Canonical公司合作開發,其目標是使純正的UbuntuDebian等映像能下載和解壓到用户的本地計算機,並且映像內的工具和實用工具能在此子系統上原生運行。 [1-3] 
如果使用Windows 10 2004以上,可以通過WSL 2來窗口化運行桌面應用,也不需要另外安裝其他的X 服務器。
2022年9月22日,IT之家消息,微軟發佈了 Windows 11/10 的 Linux 子系統新預覽版版本號為 0.67.6。 [5] 
2022年11月16日,微軟 Win11/10 Linux 子系統 WSL 1.0.0 正式版發佈。 [7] 
軟件名稱
Windows Subsystem for Linux
軟件平台
Windows 10\11
軟件語言
英文
開發商
微軟

wsl簡介

WSL提供了一個微軟開發的Linux兼容內核接口(不包含Linux代碼),來自Ubuntu的用户模式二進制文件在其上運行。 [4] 
該子系統不能運行所有Linux軟件,例如那些圖形用户界面,以及那些需要未實現的Linux內核服務的軟件。不過,這可以用在外部X服務器上運行的圖形X Window系統緩解。
此子系統起源於命運多舛的Astoria項目,其目的是允許Android應用運行在Windows 10 Mobile上。此功能組件從Windows 10 Insider Preview build 14316開始可用。
2022年9月 22日,微軟發佈了 Windows 11/10 的 Linux 子系統新預覽版,微軟宣佈從該版本開始,WSL 已支持 systemd [6] 

wsl歷史背景

在設計之初,微軟就允許類似於Win32這種子系統運行於Windows NT內核之上,它可以為上層應用提供編程接口,同時避免應用去實現內核裏的一些調用細節。NT內核的設計在最開始就可以支持POSIXOS/2win32子系統。
早先的子系統是用户態模塊的實現,它封裝了NT系統的系統調用為應用程序提供編程接口。所有的應用程序都是PE/COFF(一些為子系統封裝NT系統調用的庫和服務)可執行的。當一個用户態的程序啓動的時候,啓動器就會基於可執行的頭部去引用適當的子系統來滿足應用程序的依賴。
後來版本的子系統替換掉了POSIX層,由用户態組件提供了Subsystem for Unix-based Applications (SUA),滿足:
1. 進程和信號管理
SUA的主要目的是為了鼓勵應用程序移植到Windows上,且儘可能少重寫代碼。這已經通過實現POSIX用户態API達到了。考慮到這些組件是用户態實現,很難跟內核態的系統調用(比如"fork()")在語義上和效率上完全相對應。因為這種模式需要程序重新編譯,它需要持續的功能移植,維護也是負擔。
隨着時間的演變,這些早先的子系統都退出歷史舞台了。但是因為Windows NT內核的架構允許新的子系統環境,微軟就基於這領域的原始積累進行擴展,在2016年發佈Windows Subsystem for Linux。

wsl包含內容

Windows Subsystem for Linux
WSL是一些組件的集合,允許原生的Linux ELF64二進制文件跑在Windows上。它同時包括了用户態和內核態組件,主要包含以下部分:
1. 用户態會話管理服務處理Linux實例的生命週期
2. Pico provider drivers (lxss.sys, lxcore.sys)“翻譯”系統調用,以模擬Linux內核
3. Pico 進程管理原生的用户態Linux(比如/bin/bash)
奇蹟就發生於用户態的Linux二進制文件和Windows內核組件之間。通過將未經修改的Linux二進制文件放置於Pico進程中,我們把Linux系統調用直接導入Windows內核中。lxss.sys, lxcore.sys驅動將Linux系統調用翻譯為NT APIs,來模擬Linux內核。

wslPico進程

作為Project Drawbridge的一部分,Windows內核引入了Pico進程和Pico驅動的概念。Pico進程和驅動提供了Windows Subsystem for Linux的基礎。可執行的ELF二進制文件被加載到Pico進程的地址空間,並在系統調用的Linux兼容層上執行。

wsl系統調用

WSL基於Windows NT內核虛擬了Linux內核接口,這允許它執行未經修改的Linux ELF64二進制文件。一類內核接口是系統調用。系統調用是內核為用户態程序提供的一種服務。Linux內核和Windows NT內核都為用户態程序提供了幾百個系統調用,但是他們有不同的語義,並且一般來説並不直接兼容。比如Linux提供fork, openkill,Windows NT提供相兼容NtCreateProcess, NtOpenFileNtTerminateProcess
Windows Subsystem for Linux 包含內核態驅動(lxss.sys和 lxcore.sys),以協調Linux系統調用的請求與Windows NT內核。驅動不包含Linux內核代碼,但是是一個全新實現的Linux兼容的內核接口。在原生的Linux上,用户態程序請求一個系統調用,系統調用請求由Linux內核處理。在WSL,當一個系統調用由同一個可執行文件請求時,Windows NT內核把請求發送給lxcore.sys。 當可能時,lxcore.sys將Linux系統調用翻譯成等價的Windows NT的調用,由它來完成繁重的工作。當沒有可能的等價轉換時,Windows內核態驅動需要直接處理請求。
比如説,Linux中的 fork() 系統調用沒有直接的等價的windows版本。當一個fork系統調用由Windows Subsystem for Linux產生時,lxcore.sys需要做一些複製進程的準備工作,然後調用Windows NT內核APIs來產生一個進程來正確實現fork操作,完成為新進程複製額外的數據。

wsl文件系統

WSL支持的文件系統需要滿足兩個目標。
1. 提供一個完全支持Linux文件系統的環境
2. 能夠與Windows上的設備和文件互通
Windows Subsystem for Linuxt提供與真實Linux內核類似的虛擬文件系統。在用户的系統上,我們提供了兩個文件系統:VolFs 和 DriveFs。

wslVolFs

VolFs提供了完整的Linux文件系統特性的支持,包括:
1. Linux權限管理訪問權限可以通過如chmod和chroot來改變
2. 文件的符號鏈接
3. 文件名可以包含一些Windows上不合法的符號
4. 大小寫敏感
包含Linux系統的目錄,應用程序文件(/etc, /bin, /usr等)和用户Linux家目錄都使用的是VolFs。
與Windows應用和文件的互用在VolFs裏並不支持。

wslDriveFs

DriveFs是為了和windows互用的文件系統。它需要所有的文件名是合法的windows文件名,使用Windows安全策略,並不完整地支持所有的Linux文件系統特性。文件名是大小寫敏感的,用户不允許創建僅僅是大小寫不同的兩個文件。
所有的Windows磁盤使用DriveFs被掛在到/mnt/,/mnt/d等等下面。用户從這裏可以訪問所有Window下的文件。這允許用户用他們喜歡的Windows編輯器比如Visual Studio Code來編輯文件的同時,通過Bash裏的一些開源工具來修改文件。
參考資料