Sat Jun 06 2020

WSL2 にした

ちょうど先週に Windows build version 2004 をインストールして, WSL2 が使える環境になった.

PowerShell から

PowerShell> wsl --list -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         1

> wsl --set-version Ubuntu 2

(数十分待つ)

PowerShell> wsl --list -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2

人によって "Ubuntu" のところは "Ubuntu-18.04" だったり. 同じコマンドで 1 に戻すことも出来る. この変換の作業は数分掛かるとメッセージに表示されるがこれは嘘で, 数十分だと思ったほうがいい. そのイメージのサイズによる. まっさらな入れたての Ubuntu イメージなら1分掛からないから.

これを先週の金曜日にやったのだが, WSL内 Ubuntu18.04 から外の世界にネットワークにつながらない問題が発生した. インターネットはおろか, Windows にも繋がらないので, 例えば X サーバとのやりとりが出来なくて困った.

今日またトライしたら今は動いた. 正直原因が分からない. 先週から今日までで, やったこととしては

  1. 今 2 にした WSL/Ubuntu を 1 に戻した
  2. Windows 自体の再起動
  3. WSL/Ubuntu-20.04 イメージのインストール
  4. WSL/Ubuntu をまた 2 にしてみた

怪しいのは Windows の再起動か, あるいは WSL2 への変換を何度かやると上手く行くときと上手く行かないときとがある? とかか.

何はともあれ動いた. いくつか設定は変える必要がある.

追記 (2020/06/08 12:36)

ネットワークが死ぬ原因が今分かった. 会社のVPNに接続するのに "Cisco AnyConnect ナンタラ Client" というのを使ってるんだけど, これで VPN に繋いでる間は死んでた. VPN 接続をやめたら解消された. 設定で Allow local (LAN) access を許可し, Block connections to untrusted servers をオフにしたら問題が解決した!!

docker

Windows に Docker Desktop を入れるのがいい. 最新のものは WSL2 Integration なんてものがあるのでそのあたりの設定を全てオンにする. すると, WSL2/docker と WSL2/docker-data というイメージが追加されて起動される. WSL2/Ubuntu からは Docker Desktop の方が見えるようになっており, シームレスに利用できる. このとき DOCKER_HOST といった環境変数は消しておくこと. apt で入れていたかもしれない docker-ce は不要なので紛らわしくないように消す. クライアントコマンドとして docker-ce-cli は引き続き必要なので残す.

unset DOCKER_HOST
sudo apt remove docker-ce
sudo apt install docker-ce-cli

シームレスに使えることもだけど, 問題の一つであった, Windows から WSL が見えないので volume が出来ない問題も普通に解決されている

docker run -v $(pwd):/hoge --rm -it python:3.7.7-slim ls /hoge

X11

Xサーバとして VcXsrv を使う. 外にもあるだろうが知らない.

VcXsrv の設定は qiita.com/ryoi084/items/0dff11134592d0bb895c これを参考にする.

WSL2 からXサーバの接続先を教えるのに環境変数 DISPLAY をセットする必要がある. 今までの WSL1 では単に DISPLAY=:0 とか DISPLAY=:0.0 で良かったが, WSL2 からは Windows の IP を教える必要がある. これもさっきの Qiita にも書いてあることだけど

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

とすればok.