Hyper-VからWSL2へ乗り換えた

これまで仕事で使っているRailsの開発環境はWindows10でHyper-V上にUbuntu 18.04のVMを構築して使っていたのですが、先週WSL2に乗り換えました。

Windows10の20H1アップデートで一般提供が予定されているのでそれを待っても良かったのですが、ふと「昨今の状況次第では20H1が延期になる可能性もゼロではないな」と思い、Windows Insiderプレビューのスローリングに切り替えて20H1よりちょっと先にWSL2に踏み切ったという次第です。その翌日に以下のような状況になっていたので、きっとなにか脳が受信したんでしょう。

WSL2についてはすでに発表後から話題ですので、Hyper-VからWSL2自体への詳細は書かず「実際に移行してみてどうだったか」を書いてみます。利用しているPCは ThinkPad X1 Carbon 2018で、CPUはi7-8650U 1.9GHz、メモリは16GBで、ゲストOSはどちらもUbuntu 18.04で、Dockerは今の所Windows版ではなくLinux版を使っています。実は最初Docker for WindowsのbetaでWSL2連携使ったんですが、すぐ落ちてしまってその後起動しなくなっちゃったんで諦めました。。

体感速度が上がっている

今回はHypver-VのVMからWSL2への移行ということで、どちらもHyper-V上で動作していることに変わりはないことから、正直速度面では期待をしていなかったのですが、驚いたことに体感できるレベルで速度向上を実感しました。特に apt-get upgrade や dockerの動作などが全般的に向上していました。流石にMSがLinux kernelに手を入れているだけはある、というところでしょうか。

また、開発は以前からVSCodeでRemote exntensionを使って行っているのですが、今回 Remote - SSH から Remote -WSL に変更となり、こちらも若干早くなったかな、という印象です。

スイッチングは重い時がある

WSL2である程度作業してるときにWindows側でブラウザ等を操作するとしばらく動きが鈍いときがあります。仕組み上、仕方ないことだとは思うのですが、通常のWindowsアプリに比べるとスイッチングのコストは高いため、Windowsアプリだけ使っている場合の重くなり方とはちょっと違う、というように覚えておくといいかもしれません

localhost127.0.0.1

WSL2上でIPのポートをlitstenしている場合、 localhost で参照が可能になっています。が、WSl1と違ってWSL2はHyper-V 上のVMであるため、Hyper-VのNATを経由してホストであるWindowsからアクセスしています。そのため、Windowsからはlocalhostで参照できるけどIPは127.0.0.1、という知らないとハマること間違いなしな状況になっています。

WSL2のIPは毎回(起動時?)に変わる

さらに厄介なことに、WSL2のIPはWindowsが再起動する度に変わります。これはWSL2というよりはHyper-Vの仮想スイッチの仕様なのかバグなのかわからない挙動によるものです。以前、自分もハマったのでQiitaに記事を書いたときに解説を入れました。

qiita.com

これが問題になるのは開発時に LinuxMacで /etc/hostsを使っている場合です。たとえば、

127.0.0.1 myapp.dev

のようにしていますが、WSL2利用時にこれをやろうとすると WSL2上で割り当てられているIPを ip a s eth0 などとしてIPを調べて、以下のようにそのIPを記載する必要があります。

172.26.34.111 myapp.dev

毎回やるのは実にかったるいです。Hyper-Vでやっていたときは仮想スイッチを新規に作って割り当てるという手段で回避できたのですが、WSL2でそれができるかはまだ試していません。なぜかWSL2のVMHyper-Vマネージャーでは見えないのですが、WSL2に使っていると思われる WSL という名前のついた仮想スイッチはあるので、もしこれを名前だけで参照しているのであれば、新しいスイッチを作って名前を変えるだけでいけるかもしれません。が、そうでなかった場合にWSL2が全くネットワークにつながらなくなる、という切ない状況になる可能性もあるため、躊躇しています。。

なお、このように仮想スイッチがHyper-Vマネージャーから見えることにより、Hyper-V VMからのデータ移行は同じ仮想スイッチにVMをつなぎ直して同一ネットワーク上で重複しない固定IPをs設定することで、WSL2 <-> Hyper-V VM 間ではrsyncでファイルコピーができました。これはVMwareVirtualBoxからWSL2へ移行する場合にHyper-V VMを経由するというルートが取れることになるため、移行を検討している場合には候補の1つとして覚えておくといいかもしれません1

遭遇した既知のバグなど

Error: spawn cmd.exe ENOENT using WSL since 9.0.0 · Issue #7251 · facebook/create-react-app

なぜかWSL2上で create-react-app で作ったプロジェクトで yarn start すると Error: spawn cmd\.exe ENOENT という謎のエラーが出ます。issueの内容見ても自分にはよくわからなかったのですが、.env もしくは .env.local

BROWSER=none

と一行入れることで回避できます。

WSL2 Set static ip? · Issue #4210 · microsoft/WSL

WSL2が固定IPではない問題はいくつかissueがあるようですが、上のissueはまだ閉じられていないので今後が気になるならwatchしておいてもいいのかもしれません。


  1. VirtualBoxの仮想ディスクを変換してHyper-V VMにアタッチすることが可能なため。自分はこの方法でVirtualBox から Hyper-Vに移行しました。