Microsoft最近宣布了將Linux Bash與Windows 10進行集成的意圖,通過這種集成,Windows 10用戶將能在操作系統中原生運行Linux ELF64二進制程序。為避免對該技術的實現方法產生錯誤的猜測,Windows Subsystem for Linux團隊主管Deepu Thomas詳細介紹了在Windows上運行Linux的技術細節。
為了解釋在Windows上運行Linux的方法,首先需要介紹一些相關技術和功能:
Windows用戶模式。是CPU的一種運行模式,可對普通應用程序進行隔離和保護。每個以這種模式啟動的應用程序都有自己專用、無法被其他應用程序修改的虛擬地址空間。此外如果一個應用程序崩潰,其他應用程序不會受到波及。
Windows內核模式。主要由(內核模式的)驅動程序之類的操作系統核心組件使用的一種CPU運行模式。與計算機硬件進行的所有交互都是在這種模式下處理的。為盡可能避免崩潰,Windows內建並以該模式運行的組件需要進行全面的測試,因為這種層面的崩潰會危及整個操作系統。這篇MSDN文章詳細介紹了這兩種Windows模式之間的差異。
Windows NT子系統。Windows NT問世之初就在應用程序所能調用的API和內核層之間進行了隔離。這樣Windows NT便可支持多種子系統,例如POSIX、OS/2以及Win32。這些子系統最初的用途是簡化UNIX和OS/2應用程序向Windows移植的工作。雖然POSIX和OS/2子系統已被取消,但它們的架構依然保留了下來。
Pico進程和驅動。DrawBridge項目引入的Pico進程和相應的驅動提供了一種基於過程的容器。這是一種不包含操作系統服務的輕量級解決方案,系統調用是由一對Pico驅動處理的。
用戶模式Linux。通過這種方式可將Linux作為應用程序在其他Linux宿主機基礎之上運行。此時來賓Linux內核無需直接訪問硬件,而是將系統調用轉發至宿主機Linux,由其代為訪問。
為了運行Linux,Microsoft創建了Windows Subsystem for Linux (WSL),這個子系統的整體架構如下圖所示:
當用戶以用戶模式啟動bash.exe時,會同時啟動相關服務以及LX會話管理器。這個服務在用戶通過命令提示符輸入的bash命令和待執行的相關原生ELF64二進制程序之間承擔了中介的角色。這裡的Linux二進制程序是Canonical提供的用戶模式Ubuntu 14.04系統的組成部分,以Pico進程的形式啟動並在用戶模式下運行。此時由lxss.sys和lxcore.sys這兩個驅動負責模擬Linux內核並攔截系統調用。大部分情況下,相應的驅動會將Linux內核調用映射為對應的Windows內核調用,但也有些情況可能缺乏對應的Windows內核調用。例如fork(),Thomas解釋了其中的原理:
根據記錄,Linux fork() syscall沒有直接對等的Windows調用。當針對Windows Subsystem for Linux進行fork系統調用時,lxcore.sys會執行一些前期工作為進程的復制做准備。隨後它會調用內部的Windows NT內核API以使用相應語意創建進程,並為新建的進程完成額外數據的復制。
WSL提供了兩種可被Linux訪問的文件系統:VolFs和DriveFs。前者在各方面都非常類似於常規的Linux文件系統,包括權限支持、 symbolic鏈接、大小寫敏感,以及Windows文件系統中不允許使用的字符。後者提供了與Windows互操作的能力,使得用戶能夠在Linux 中看到所有Windows卷。
這個功能與虛擬化無關,Linux二進制程序也沒有為了在WSL中運行而移植或重編譯。這種方式運行的Linux命令可以像Windows應用程序一樣訪問本地主機,無需使用虛擬化的網絡。
根據Thomas的介紹,針對WSL進行性能評測後發現,性能表現非常接近用相同硬件直接運行Linux的性能,這證明WSL在性能方面的表現很出色。
Microsoft團隊曾在WSL上運行過Python和Ruby,並像其他Linux用戶那樣使用gcc編譯過程序,大部分情況下都可以正常工作,但也有一些小問題:sudo無法完全正常使用,文件系統需要進行一定的調整,運行MySQL會遇到一些小問題等。有些用戶提到無法運行Java、 Semaphores或共享內存。目前UserVoice WSL頻道中最需要的三個特性分別是:在兩個環境中使用slash,通過Bash啟動Windows進程,以及將WSL開源。
Microsoft提供的在Windows上運行Linux的能力可以幫助運維團隊,尤其是負責運維雲實例的團隊無需更換計算機或使用虛擬化解決方案,便可直接從一台Windows/Linux計算機管理自己的所有系統。雲中運行的很多計算機都運行了Linux,這個功能可以讓運維人員的工作變得輕松一些。
更多詳情推薦閱讀MSDN WSL概述以及Channel 9 視頻 :WSL:架構概述。
更多詳情推薦閱讀MSDN WSL概述以及Channel 9視頻:WSL:架構概述。