Windows 10 2004がリリースされ、WSL2が利用可能になったので、WSLのUbuntu LinuxをWSL2に変更してみた。
まず、このページのリンクから、wsl_update_x64.msiをダウンロードして実行。
その後、コマンドプロンプト等で、wslコマンドを使用して、WSLのバージョンを変更する。
まず、下記コマンドを実行して現在のバージョンを見てみよう。
C:\>wsl -l -v
NAME STATE VERSION
* openSUSE-Leap-15-1 Running 1
Ubuntu Running 1
次に、バージョンを2に変更したいディストリビューションを指定して、下記コマンドを実行する。今回はUbuntuをバージョン2にしてみる。
C:\>wsl --set-version Ubuntu 2
実行が終わると、指定したディストリビューションはWSL2で動作するようになる。
WSL2に変換後、使用してみて、ちょっと困った点がいくつか。
まず、WSL2はVMとして動作するので、今までは、Windowsと同じIPで動作していたものが、別IPとなる点。(仮想アダプタが作成され、Windows側とWSL側に別IPが振られる)
これは、WSL上のプログラムとWindowsのプログラムでポートがバッティングしなくなるので悪い点ばかりではないが、例えば、WSL上でasp.dotnet coreのアプリをdotnet run等で動かしてWindows側からブラウザでテストしようとした場合、launchsettings.jsonのIPを直さないと、Windows側からアクセスできない。
(デフォルトではhttps://localhost:5001;http://localhost:5000が指定されているため。)
後、デフォルト設定では名前解決が出来ない場合がある。これは、/etc/resolv.confの内容がクライアント(Windows)の仮想IPアドレスに設定されているので、Windows側に名前解決機能がないと、ホスト名等が解決されず、dotnet new等も失敗する。
(nuget.orgが解決できないため)
そういう場合は、/etc/resolv.confの内容をクライアント(Windows)のDNSサーバ設定に合わせる必要がある。
私の場合は以下のようなアドレスが振られていた。
イーサネット アダプター vEthernet (WSL):
接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::bdb1:e7a4:4e3:46c4%45
IPv4 アドレス . . . . . . . . . . . .: 172.23.240.1
サブネット マスク . . . . . . . . . .: 255.255.240.0
デフォルト ゲートウェイ . . . . . . .:
eth0 Link encap:Ethernet HWaddr 00:15:5d:5d:24:31
inet addr:172.23.251.65 Bcast:172.23.255.255 Mask:255.255.240.0
inet6 addr: fe80::215:5dff:fe5d:2431/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12294 errors:0 dropped:0 overruns:0 frame:0
TX packets:2691 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:15734461 (15.7 MB) TX bytes:6991441 (6.9 MB)
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /e
tc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.23.240.1 # ←Windows側のIPアドレスが設定されている
速度に関してはVMになったことで、動作が遅くなるかと心配したが、普通に使う分には問題なさそうだ。
ちなみに、複数のディストリビューションをWSL2にしてみたところ、全て同じVMを共有しているようだ。
名前解決ができなかったのは、どうも、この間乗換えたアンチウィルスソフトの影響だったようだ。
クライアントマシンの内向け接続を全て拒否られてた・・・
ちなみに、/etc/wsl.confを作成して、下記を記述しておかないと、
generateResolvConf = false
resolv.confはwslが再起動されるたびに上書きされるので注意!!