WSL2在今年5月份Microsoft Build大會上發佈了,但至今Windows10一直沒收到更新推送,我想這麼久過去就算沒進入正式,至少也到了RC版了吧,因而開始折騰準備體驗一把。redis
WSL2須要Windows10的18917或以上版本的支持,截止至2019-08-22,這個版本仍然處於內部預覽的狀態,如須要,得把系統設置的「Windows預覽體驗計劃」做相應的修改,加入這個預覽體驗計劃,而後就能夠接收到Windows預覽版的更新內容了。——具體過程略,特別要注意的就是這個更新過程比較漫長,找個空閒時間來作吧。shell
在「啓用或關閉Windows功能」裏打開這兩個功能架構
或者以管理員身份運行Powershell,而後執行:app
>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
>Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatformssh
在Windows10的應用商店裏裝個Ubuntu,或Ubuntu 18.04 LTS,或者別的發行版也行(咋沒有我熟悉的CentOS呢?)。而後在開始菜單上點擊運行,第一次運行會很慢,由於有個安裝的過程,耐心等待,完成後提示你輸入用戶名密碼,這個用戶名密碼和Windows的是無關的。優化
打開命令行界面(cmd.exe),如今來熟悉幾條WSL2相關的配置命令:ui
>wsl -l --verbosespa
這條命令能列出當前安裝的的Linux發行版的名稱、狀態及其使用的WSL的版本,如:命令行
NAME STATE VERSION *Ubuntu Running 1 Ubuntu-18.04 Running 2
前面的*表示wsl的默認發行版,從這還能看出Ubuntu使用的WSL爲初版,要將Ubuntu轉爲使用WSL2可使用這個命令:code
>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繼續用,想一想仍是等它正式上線了再用比較好,太坑了。