WSL2中踩的一些坑

發佈於 2021-08-26  379 次阅读


心血來潮裝了wsl2,本來覺著應該用起來和wsl1差不多,效率又高香的雅痞

最後發現——理想很豐滿,現實很骨感

先說說WSL吧,WSL的全稱是Windows Subsystem for Linux。唔... ...解釋起來還有點麻煩,總之簡單來說就是在你的windows系統中不用安裝虛擬機什麼的裝了一個linux系統。

這對於開發人員來講是十分方便的,畢竟有很多東西的生產環境都是需要linux的,開發環境有個方便的即開即用的能直接訪問windows下的目錄的shell還是很舒服的。

優點就不多說了,畢竟想裝的總會裝的。先說說wsl1和wsl2的區別和缺點吧。

WSL1和WSL2的最大區別在於wsl2集成了一個真正完整的linux4.x內核,並且使用虛擬化技術運行而wsl1則沒有集成完整linux內核。

這意味著什麼呢?意味著wsl2的體驗和真正的linux是相差無幾的,但同時也帶來另一個問題——嵌套虛擬化的問題。

原則上wsl2使用的是一個精簡版的“hyper-V”虛擬化平台,啟用了hyper v後會使硬件虛擬化,你的windows也會運行在啟用硬件虛擬化後的硬件上,這就會導致一個問題——大部分的虛擬機啊模擬器啊會因此無法啟動。當然,微軟也有給出解決方案 虛擬機監視平台;最新的vmware和virtualbox都通過這項技術實現了和hyper-v的共存,但是老實講這也相當於運行在windows之下的虛擬化了,並且vmware和vbox在啟用hyper-v機器上的嵌套虛擬化的問題至今沒有解決,感覺微軟解決問題只解決一半,屬實挺難受的。而且大部分的android模擬器用基本都是以舊版的vbox為基礎的,幾乎沒有支持hyper-v的模擬器(目前已知可以兼容的只有bluestacks hyper-v版,微軟vs集成的Android Emulator....好像就沒其他了?),模擬器玩家只能說句再見了。

還有io的問題,wsl1的時候大家都稱讚跨系統io速度一流速度快的一B。但是在wsl2中卻是反過來的,因為本質上運行在虛擬化硬件上,所以跨系統的io速度毀滅性打擊的慢...所謂有捨有得吧,為了使wsl更加的“原生”微軟犧牲了跨系統的io速度。

好,那先來聊聊踩的第一個坑吧。

WSL2下使用windows代理

以前的我使用wsl1的時候一切都很順利,也不需要特意去設置什麼就會直接走windows的系統代理。

但是wsl2就不一樣了,它和虛擬機一樣虛擬了一個網卡和wsl子機在同一塊局域網內,所以對於wsl的內部系統而言他和宿主機windows的網絡不是同一個網絡,網絡數據也是直接經由虛擬網卡轉發出去不會經過windows系統。

嘛...其實在家並不會遇上這個問題,畢竟家裡面是全家墻外的,只是人在外面的時候會出現...curl或wget從github拉東西的時候會連不上的奇妙問題。

其實解決方案也很簡單,在~/.zshrc(我是用的zsh,如果使用的是bash的話則是~/.bashrc)下添加http/https代理指向宿主機的虛擬網絡的ip和代理軟件的端口就好。獲取主機的ip可以使用下面這兩種方法獲取

然後在zshrc中添加代理(我這裡使用的是clash,代理端口在7890)

 

但關鍵問題點就在於每次重新啟動計算機後都會重新分配虛擬網絡的網段地址,也就是說每次重啟都得重新找一下宿主機的ip去更改,這顯然很麻煩,所以我偷了個懶,直接在zsh的配置中獲取主機ip每次啟動都會自動獲取主機ip並應用代理。

這樣一來就能順利的“自動”讓http請求和https請求直接走宿主機的clash了。

提示

如果這麼設置以後沒辦法使wsl正常訪問網絡那麼有可能是代理軟件沒有開放局域網接入,記得開啟代理軟件局域網接入(Clash的情況是allow LAN要打開)

如果還不能行那大概是因為開啟了windows 防火墻的緣故。我本身是沒有在開防火墻的,不過這裡也提供一個開放wsl網卡防火墻的命令(當然,你也可以選擇在策略管理器裡自己去添加wsl入站出站的策略....)

在windows下以管理員權限運行powershell,打入這個指令就可以了

結語

唔...不知不覺摸了一個多小時了,那踩的坑先放在這裡吧,還有一些坑看來只能等下次再介紹了。

其實吧,個人的體驗上wsl1反而用起來還比較舒服。雖然他沒有完整的內核有很多東西他都做不到,但是他給我的感覺反而更像是一個“子系統”

wsl2雖然從子系統的執行上來講更加的舒適和快速了,但是在我看來他更像是一個不用裝虛擬機軟件的虛擬機(好吧,他確實只是個運行效率挺高的虛擬機就是了...)對我來講唯一的優點可能就是我不再需要安裝一個虛擬機軟件,並且硬件資源上也不如傳統虛擬機開銷那麼大。當然,傳統虛擬機可以隨時回滾快照這一點是目前wsl2完全做不到的事,所以也不能說有了wsl2如果只有使用linux虛擬機的需求的就可以完全幹掉vmware,vbox什麼的。

總之,其實wsl這個東西我認為還是硬件資源比較緊張、開虛擬機硬件開銷可能太大的這些開發者比較適宜使用。當然,他和windows系統嵌在一起可以直接在windows下調wsl執行linux用的東西這件事很酷,但wsl2並不是完美嵌套在windows裡的,還有許多需要解決的東西。衷心希望未來微軟能讓wsl2實現像wsl1的那種嵌入程度,和windows之間的交互相融的更加融洽

Spread the love

公交車司機終於在眾人的指責中將座位讓給了老太太