面向開發者的 WSL2 安裝指南

爲什麼要使用 Windows 做開發

一直以來 macOS 以類 unix 的特性,獲得了程序員的青睞,但是近幾年 Apple 在硬件領域少有讓人耳目一新的產品,加上取消 Esc、使用蝶式鍵盤、基本爲0的硬件可升級性、系統權限的收緊等騷操作,讓 Mac 從軟件到硬件都不如以前適合編程。另一方面,PC 陣營在軟件層面保持開放的基礎上,硬件體驗也逐步趕上甚至超越 Mac,我也不想在用 Mac 做開發,用 PC 玩遊戲,希望用一臺電腦兼顧遊戲和開發,所以選擇回到了 PC 陣營。

隨着微軟擁抱開源領域,Windows 也開始變得程序員友好。Windows 10 2004 發佈後,WSL2 也可以在正式版 Windows 10 中使用,相比於 macOS,WSL2 是一個原生 Linux 環境而非類 unix 環境,甚至可以在 App 商店中選擇所需要的發行版。而相比於 WSL1,WSL2 採用了 HyperV 虛擬機的方式,解決了 WSL1 不能安裝 Docker 等問題。

WSL1 和 WSL2

相比於 WSL1,WSL2 通過虛擬機的方式帶來了更完整的 Linux 內核,但這種方式也引入了一些問題,微軟給出了下面的圖表來展示這些不同:

WSL2 不能和 VMWarework Station、VirtualBox 同時運行這一條已經過時了,VirtualBox 和 VMWare Workstation 都發布了支持 WSL2 和 Hyper-V 的新版。

WSL2 跨 OS 的磁盤性能的確低的令人髮指,尤其是小文件,安裝一個 Python 依賴可能需要等幾分鐘,安裝一個 NodeJS 依賴...當我沒說...相關 ISSUE 底下有無數吐槽,不過目前還沒有人出來解決,在這裏:https://github.com/microsoft/WSL/issues/4197)。不過微軟在文檔裏也說了,有很多方式可以避免跨 OS 使用文件系統,比如使用 VSCode 的 remote deployment 功能,我認爲這也是更好的實踐,並且也這麼做了。當然,如果你必須跨 OS 使用文件系統,還是乖乖留在 WSL1 吧(WSL1 太渣了,還是留在 VirtualBox 吧)。

除了表格裏說的,我認爲 WSL2 最大的問題在於...資源佔用太大了...我是一臺 16G 內存的電腦,使用 WSL2 後開機就要喫掉 11G 的內存,雖然可以使用 wsl --shutdown 關閉虛擬機釋放資源,但是相比於 VirtualBox 和 WSL1,WSL2 的資源佔用可以說翻倍了。

微軟提供了限制 WSL2 資源的方式,參見https://docs.microsoft.com/en-us/windows/wsl/release-notes#build-18945

要做些什麼

好了,搞清楚 WSL2 是什麼之後接下來的問題就是怎麼做了,這篇文章會指導你完成如下的安裝流程:

  • 升級 Windows 10 到 2004
  • 啓用 WSL2 並安裝 Linux

以及一些最佳實踐:

  • 網絡互通
  • 文件系統互通
  • 使用 Docker

最後會聊聊 WSL2 的未來。

升級 Windows 10 2004

升級到 Windows 10 2004 有多種方法,最靠譜的還是從設置 - 更新和安全裏進行 OTA 升級,但是 Windows 的更新是分批推送的,2004 更新有可能等到一兩個月後纔會出現在你的更新界面中。

另一種更快速的方法是從官方地址下載鏡像升級,訪問這個地址下載運行就可以升級到最新的版本 https://www.microsoft.com/software-download/windows10,需要注意的是,發佈初期可能 bug 含量會高一些,介意的還是再等等。

啓用 WSL2

升級 Windows 10 的過程不會碰到太多問題,升級後還需要進行一些配置纔可以使用 WSL2,首先要啓用 Windows 子系統功能,使用管理員權限打開一個 PowerShell 窗口,輸入以下命令,並重啓系統:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

重啓後,Windows 默認啓用的是 WSL1,還需要再啓用虛擬機平臺功能,在 PowerShell 中輸入以下命令,並再次重啓系統:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重啓後,在 PowerShell 中輸入以下命令,將 WSL 默認版本改爲 WSL2:

wsl --set-default-version 2

接下來在 Microsoft Store 中找一個 Linux 發行版進行安裝,安裝後在 PowerShell 中執行 wsl -l -v 可以看到當前的發行版是否跑在 WSL2 中,如果顯示版本是1...請重複上面的安裝步驟。

設置 WSL 版本爲 WSL2 報錯時,請訪問 https://docs.microsoft.com/en-us/windows/wsl/wsl2-kernel 下載 WSL2 Kernel。

網絡互通

WSL2 不和 Windows 共享一個 localhost,所以不像 WSL1 中 Linux 和 Windows 有無感知的網絡互通性。

Windows 訪問 WSL2 啓動的網絡服務,可以直接使用 localhost,但是 Linux 訪問 Windows 啓動的網絡服務這種方式就不行了,可以使用如下腳本獲取 Windows 的 IP,並使用 IP 訪問 Windows:

ip route | grep default | awk '{print $3}'

文件系統互通

WSL2 訪問 Windows 文件系統依然通過掛載分區的方式,Windows 下的磁盤會被掛載在 /mnt 下,例如 /mnt/c

相比於 WSL1,這次增加了 Windows 訪問 Linux 分區的能力,可以在資源管理器中輸入 \\wsl$\<子系統名> 訪問對應的子系統分區,爲了方便也可以在資源管理器中把 Linux 分區掛載成一個磁盤。

更加方便的一個方式是,在 Terminal 中,使用 explorer.exe . 可以直接調用資源管理器打開當前目錄,有點類似 Mac 下的 open .

使用 Docker

WSL2 帶來了完整的 Linux 內核,所以可以參照 Docker 在 Linux 上安裝的過程安裝 Docker,並且可以正常使用,但是會有一個小瑕疵。WSL2 的 systemd 吧...還不是原生的,也就是在 WSL1 上就有的無法啓動服務守護進程的問題依然存在,Docker 服務自然也不能倖免。

解決這個問題有三種方案:

  • 可以讓 Windows 執行開機腳本,通過腳本啓動 WSL2 中的 Docker,參見https://blog.csdn.net/XhyEax/article/details/105560377,這種方案在 WSL1 時代就有,我自己使用過沒碰到過問題。

  • 第二種方案是使用第三方工具運行 systemd,參見 https://github.com/arkane-systems/genie,原理是提供了一個單獨的 namespace 跑 systemd。

  • 第三種方案是使用 Docker Desktop,2.3.0.2 以上版本已經支持 WSL2 和 Hyper-V,免去一些折騰。

GPU 支持

Build 2020 發出消息說 WSL2 要支持 GPU,Nvidia 也發出了 CUDA on WSL2 的預覽版,在這裏:https://developer.nvidia.com/cuda/wsl

這意味着以後可以直接在 Windows 上使用 GPU 加速訓練模型了,雖然支持成都還很有限,但是相比於 Mac 可領先了一個身位都不只了。

總結

在體系結構上 WSL2 沒有太大的創新,本質就是一臺跑在 Hyper-V 上的虛擬機,你可以使用 VMWare Workstation 或 VirtualBox,經過簡單的配置實現其 100% 的功能,並且會有更高的性能,更少的資源佔用,但是畢竟 WSL2 是一項原生功能,其配置上的便利性和兼容性,大大減少了使用者花在配置上的精力,最大程度的實現開箱即用,這也是 Apple 一直以來吸引開發者的主要原因。在這個時間點,使用 Windows + WSL2 來構建開發環境已經可以滿足大部分的需求。

參考

https://github.com/microsoft/WSL/issues/4197

https://docs.microsoft.com/en-us/windows/wsl/wsl2-kernel

https://docs.microsoft.com/en-us/windows/wsl/install-win10

https://github.com/arkane-systems/genie

https://docs.microsoft.com/en-us/windows/wsl/release-notes#build-18945

https://developer.nvidia.com/cuda/wsl

https://devblogs.microsoft.com/directx/directx-heart-linux/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章