Windows Subsystem for Linux 概述

之前的一篇文章,我曾經寫過【Bash On Windows】在 Windows Subsystem for Linux(WSL) 上運行任何桌面環境(已達可用階段),有很多人對這方面的內容比較感興趣。因此,在微軟官方的網站上找到了一些關於 Windows Subsystem for Linux 的介紹文檔。

本文主要對 WSL(Windows Subsystem for Linux )進行概述。

內容由微軟實習生@戴秉璋 翻譯,出自微軟官方:原文鏈接

在設計之初,微軟就允許類似於Win32這種子系統運行於windows NT內核之上,它可以為上層應用提供編程介面,同時避免應用去實現內核里的一些調用細節。NT內核的設計在最開始就可以支持POSIX,OS/2和win32子系統。

早先的子系統是用戶態模塊的實現,它封裝了NT系統的系統調用為應用程序提供編程介面。所有的應用程序都是PE/COFF(一些為子系統封裝NT系統調用的庫和服務)可執行的。當一個用戶態的程序啟動的時候,啟動器就會基於可執行的頭部去引用適當的子系統來滿足應用程序的依賴。

後來版本的子系統替換掉了POSIX層,由用戶態組件提供了Subsystem for Unix-based Applications (SUA),滿足:

1. n進程和信號管理

2. n終端管理

3. n系統服務請求和進程間通信

SUA的主要目的是為了鼓勵應用程序移植到Windows上能盡量少的重寫。這已經通過實現POSIX用戶態API達到了。考慮到這些組件是用戶態實現,很難跟內核態的系統調用(比如fork())在語義上和效率上完全相對應。因為這種模式需要程序重新編譯,它需要持續的功能移植,維護也是負擔。

隨著時間的演變,這些早先的子系統都退出歷史舞台了。但是因為WIndows NT內核的架構允許新的子系統環境,我們就基於這領域的原始積累進行擴展,發展Windows Subsystem for Linux。

Windows Subsystem fornLinux

WSL是一些組件的集合,允許原生的Linux ELF64二進位文件跑在Windows上。它同時包括了用戶態和內核態組件,主要包含以下部分:

1. n用戶態會話管理服務處理Linux實例的生命周期

2. nPico provider drivers (lxss.sys, lxcore.sys)「翻譯」系統調用,以模擬Linux內核

3. nPico 進程管理原生的用戶態Linux(比如/bin/bash)

奇蹟就發生於用戶態的Linux二進位文件和Windows內核組件之間。通過將未經修改的Linux二進位文件放置於Pico進程中,我們把Linux系統調用直接導入Windows內核中。lxss.sys, lxcore.sys驅動將Linux系統調用翻譯為NT APIs,來模擬Linux內核。

Pico進程

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

系統調用

WSL基於WindowsnNT內核虛擬了Linux內核介面,這允許它執行未經修改的LinuxnELF64二進位文件。一類內核介面是系統調用。系統調用是內核為用戶態程序提供的一種服務。Linux內核和Windows NT內核都為用戶態程序提供了幾百個系統調用,但是他們有不同的語義,並且一般來說並不直接兼容。比如Linux提供fork, open和kill,WindowsnNT提供相兼容NtCreateProcess, NtOpenFile和 NtTerminateProcess。

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 Subsystemnfor Linux產生時,lxcore.sys需要做一些複製進程的準備工作,然後調用Windows NT內核APIs來產生一個進程來正確實現fork操作,完成為新進程複製額外的數據。

文件系統

WSL支持的文件系統需要滿足兩個目標。

1. n提供一個完全支持Linux文件系統的環境

2. n能夠與Windows上的設備和文件互通

Windows Subsystem for Linuxt提供與真實Linux內核類似的虛擬文件系統。在用戶的系統上,我們提供了兩個文件系統:VolFs 和 DriveFs。

VolFs

VolFs提供了完整的Linux文件系統特性的支持,包括:

1. nLinux許可權管理,訪問許可權可以通過如chmod和chroot來改變

2. n文件的符號鏈接

3. n文件名可以包含一些Windows上不合法的符號

4. n大小寫敏感

包含Linux系統的目錄,應用程序文件(/etc,n/bin, /usr等)和用戶Linux家目錄都使用的是VolFs。

與Windows應用和文件的互用在VolFs里並不支持。

DriveFs

DriveFs是為了和windows互用的文件系統。它需要所有的文件名是合法的windows文件名,使用Windows安全策略,並不完整地支持所有的Linux文件系統特性。文件名是大小寫敏感的,用戶不允許創建僅僅是大小寫不同的兩個文件。

所有的Windows磁碟使用DriveFs被掛在到/mnt/c,/mnt/d等等下面。用戶從這裡可以訪問所有Window下的文件。這允許用戶用他們喜歡的Windows編輯器比如VisualnStudio Code來編輯文件的同時,通過Bash里的一些開源工具來修改文件。

文章如有錯誤,請各位專家評論「指點」,必將第一時間更正。


推薦閱讀:

迅雷又抽風了?Windows 平台上還有這些好用的下載工具
罪魁禍首竟然是它!——螃蟹?
擁抱亞克力,可能是今年最後一次更新了……

TAG:Linux | Windows10 | 操作系统 |