Windows 10 自帶 WSL,那麼 Linux 什麼時候可以自帶 Windows 子系統?


子系統的概念存在很久了,WINE一直都可以算作是一個Linux下的Windows子系統,不過模擬的層級只到了API層面,而WSL 1是把Linux Kernel也模擬了出來,可以響應syscall,相比API層面模擬可以提供更多的功能。

但是WSL1依然涉及到模擬的問題,例如下圖,ls和dir分別是linux和windows下的文件列出命令:

可以看出,WSL1就是在NT內核上跑一個模擬+翻譯機制(Lxss.sys)使得Linux的syscall可以被翻譯成NT的syscall然後執行。這樣的實現雖然說在高性能需求時會效率比較低,但是因為輕量、按需,所以在個人PC上跑一些不那麼重性能的應用時效果也挺不錯。而且還可以隨用隨開,統一調配系統資源,像超極本之類的設備還能維持比傳統虛擬機方案更好的續航。

換句話說,比起傳統虛擬機方案,WSL 1提供了下列優勢:

  • 高度的Windows和Linux互相集成,可以互相調用
  • 相比傳統虛擬機而言快得多的啟動速度
  • 很小的額外資源佔用量,並且在很多時候更加節能
  • 不需要額外配置和管理虛擬機

而代價就是在一些heavy syscall的場景可能會出現性能大幅下跌,最常見的場景就是出現大量IO時,此時Lxss會非常繁忙,性能下降會十分明顯。

////

而WSL2嚴格來說已經不算是子系統了,因為過去人們對子系統的定義是不包括虛擬化方案的。但是WSL2就是一個下放自Azure和Xbox的輕量高集成虛擬機(你沒看錯,還有Xbox哦)+微軟自家定製的精簡版Linux Kernel。該Kernel開源並根據最新LTS版本剪裁構建,精簡但是全功能。

在Windows現在的虛擬化圖景里沒有真正的host,所謂的host其實也只是個地位特殊點的guest而已,大家都跑在虛擬化平台上。而新的下放技術允許Windows使用非常輕量的預配置或自動配置虛擬機,並且還擁有比傳統虛擬機更高的集成度,甚至可以允許像WSL 1那樣的互相調用。這套東西其實在Xbox上很早以前就用到了,系統UI一個vm,遊戲一個vm,系統UI接收到了多人遊戲邀請以後能傳送給遊戲,遊戲也能從系統UI獲取賬號信息blah blah blah……

因此,傳統的api subsystem + syscall翻譯方案已經沒有必要了,新的輕量虛擬化做的比之前的翻譯方案更好,對新的CPU特別是支持虛擬化加速的CPU而言性能更是高出一大截。

////

所以其實類似的事情,*nix平台也不是沒有干過。比如說CrossOver/WINE可以算是API層面子系統,只是兼容的不是很完整,性能也有待商榷;而虛擬化方案的話,像parallel desktop那樣的提供了一些高級集成功能的平台也不是沒有。只不過就是做得都比較挫,用起來比較蛋疼而已。

至於你問我為什麼*nix不自己實現一個類NT core?當然是因為NT不開源,逆向起來麻煩啊……你看ReactOS,搞了這麼多年(雖然說只有幾個開發者在搞),也才搞了個勉強能用的程度……


我開一個KVM跑win 10,算不算搞了一個子系統?

或者,我開了一個type-1的hypervisor,然後分別跑一個linux和一個win,再搞一搞這兩個虛擬機的互通,算不算搞了一個子系統?

再或者,我把wine整合到內核里,又算不算搞了一個子系統?


質疑虛擬機算不運算元系統的,請自行把微軟發布的視頻看一遍,了解一下什麼是wsl2


NT 內核不開源,例如 Native API 這種連文檔都沒有。即使在 Linux Kernel 的基礎上實現一個 NT 內核也是極為困難的。

所以,什麼時候會有 Linux 上的 Windows 子系統?大概是 Windows 開源的時候吧。


為什麼 WSL 不開源?無非是實現級別太低,不能暴露 NT 內核的太多細節。即便開源也沒意義,因為你們編譯不出來。

還有重要的是,取決於你怎麼定義子系統。如果你認為 WSL1 才運算元系統,那麼 Wine 也不能被看做子系統的。


微軟子系統?我估計你想說的是Windows子系統吧?

很早之前不就有了么?wine不就是么?一個Windows系統中間層的開源實現。

實際上到了今天,大多數Windows軟體,包括遊戲是可以在Linux下運行的。

當然因為Windows不開源,各種系統調用得得重新做一遍,費力效果又有限。Linux開源,改一個Windows下能用的內核相對容易。不過微軟還是決定出個wsl2,這次徹底改成虛擬機方式了。


寄希望於微軟出個新的Linux髮型版或者別的方案,做到lsw。


推薦閱讀:

TAG:操作系統 | Linux | Windows10 | WSLWindowsSubsystemforLinux |