WSL2(預覽版)體驗筆記


WSL2安裝

WSL2在今年5月份Microsoft Build大會上發布了,但至今Windows10一直沒收到更新推送,我想這么久過去就算沒進入正式,至少也到了RC版了吧,於是開始折騰准備體驗一把。

WSL2需要Windows10的18917或以上版本的支持,截止至2019-08-22,這個版本仍然處於內部預覽的狀態,如需要,得把系統設置的“Windows預覽體驗計划”作相應的修改,加入這個預覽體驗計划,然后就可以接收到Windows預覽版的更新內容了。——具體過程略,特別要注意的就是這個更新過程比較漫長,找個空閑時間來做吧。

在“啟用或關閉Windows功能”里打開這兩個功能

  1. 執行Linux程序的Windows子系統 (這個就是WSL了)
  2. 虛擬機平台 (WSL2需要這個,WSL1是不需要的,記得打開BIOS設置里的CPU虛擬化技術)

或者以管理員身份運行Powershell,然后執行:

>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
>Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

在Windows10的應用商店里裝個Ubuntu,或Ubuntu 18.04 LTS,或者別的發行版也行(咋沒有我熟悉的CentOS呢?)。然后在開始菜單上點擊運行,第一次運行會很慢,因為有個安裝的過程,耐心等待,完成后提示你輸入用戶名密碼,這個用戶名密碼和Windows的是無關的。

WSL2使用

打開命令行界面(cmd.exe),現在來熟悉幾條WSL2相關的配置命令:

>wsl -l --verbose

這條命令能列出當前安裝的的Linux發行版的名稱、狀態及其使用的WSL的版本,如:

NAME         STATE      VERSION
*Ubuntu      Running    1
Ubuntu-18.04 Running    2

前面的*表示wsl的默認發行版,從這還能看出Ubuntu使用的WSL為第一版,要將Ubuntu轉為使用WSL2可以使用這個命令:

>wsl --set-version Ubuntu 2

設置將來安裝的發行版都使用WSL2

>wsl --set-default-version 2

另外有wslconfig命令也可以控制發行版的運行,具體直接敲這個命令就能看到幫助信息。

WSL2和WSL的一個很大的不同點就是使用了虛擬磁盤,並不是像WSL那樣直接把文件存在Windows的文件系統中,WSL的磁盤的默認存放地方在:

%localappdata%\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState

這個目錄下有個擴展名為vhdx的大文件,這就是虛擬磁盤鏡像文件了。

之前的WSL,要在Windows訪問Linux是有些問題的,雖然使用的是同一個文件系統,但直接往Linux的文件目錄里扔文件似乎沒用,可能跟刷新有關,並且也不建議這么做,而現在方便了,在WSL里敲explorer.exe .,即可用Windows的資源管理器打開當前WSL的目錄,注意這個功能只能在WSL的窗口里執行,如果是SSH終端,那會提示explorer.exe找不到命令。

在部署完WSL之后,我發覺VMWare Workstation Pro已經不能用了,提示“VMware Workstation 與 Device/Credential Guard 不兼容”,搜索解決方案,在Windows組策略中關閉了“Device/Credential Guard”之后問題依舊。經過查閱資料,了解到WSL2的架構發生了較大的變化,它使用了一些虛擬化技術(但又不完全等同於VM,它啟動速度要比VM快得多,具體等我有了更多了解后再做分享),所以不難理解為什么WSL需得開啟“虛擬化平台”這個功能方可使用,WSL2也因此支持了Docker,這都說明了它已經是一套純正的Linux了,然而Windows的虛擬化技術跟VMWare所使用的虛擬化技術有很大不同,互不兼容,如果你之前使用過Hyper-V的話一定知道這事情。現在怎么辦呢?我的解決方案就是放棄VMWare,把原先的VMWare磁盤鏡像文件轉為Hyper-V磁盤鏡像的格式,使用Hyper-V虛擬機……呃,其實也算不上解決方案,VMWare的爽,誰用誰知道,所以我覺得這是WSL2最大的一個坑。

這里又引出一個問題了:WSL2還能稱得上WSL么?我覺得它更接近於一個運行在Windows環境下的經過了特殊優化的Linux虛擬機,而不再是一個Subsystem了。

如今的WSL2可以看做是一個獨立的虛擬機了(雖然技術上仍有些區別),它具有自己獨立的IP地址,通過虛擬路由器與Windows連接,雖然你在WSL2中部署的服務在Windows中也能用localhost訪問,但是我猜這是用了一些特殊的內部鏈路技術來實現的,不信你可以做這么一個簡單試驗:假如你在WSL2中部署並運行了redis,如果配置文件中僅僅bind到了127.0.0.1的話,Windows是無法用localhost或127.0.0.1來訪問WSL2中的redis服務的。要查看WSL2的ip地址,可以在WSL2中用ip addr命令或者ifconfig命令。另外我在使用中還發現用localhost這個地址無法訪問WSL2的ssh服務,我嘗試過關閉Windows防火牆,用netstat檢查過端口打開及綁定狀態,都是沒問題的,且只要把localhost換成WSL2的IP地址(通常是172.x.x.x)就可以了,與此同時,利用localhost地址訪問WSL2中的redis服務及PostgreSQL服務都是沒問題的,感覺挺奇怪。

還有值得注意的一點是:WSL2的IP地址是動態的,每次啟動后都會不一樣,所以也不好直接用指定IP地址的方式來訪問WSL2的ssh服務。

我還發現WSL1中的無法自動啟動sshd等問題如今仍然存在,雖然我可以通過一些小手段來解決,網上也有人給出了一些workaround,但總歸覺得不夠工整。

總結

現在其實一切都還沒最終發布,如果精力有限,我覺得還是先不要入這坑的好,我這么一番折騰下來,感覺不太值得……

2019-08-26更新:早上Windows更新至18965.1005,發覺WSL2聯網都成問題了,暫時沒空找解決方案,於是將WSL2降回WSL1繼續用,想想還是等它正式上線了再用比較好,太坑了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM