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