Windows 10 20H1 Build 18917のWSL2を使ってみた

# Windows 10 20H1 Build 18917のWSL2を使ってみた

　Build 18917でWSL2が使えるようになったようなので、早速動かしてみました。

※7/6追記
　[WSL2のコロコロ変わるIPをMyDNSで何とかする](https://qiita.com/SoraKumo/items/388a1315a6bdc16b4d2e)で、WSL2の動的プライベートIPに対する対策記事を書きました。
　MyDNSのDirectIP機能を使って、ドメインと結びつけます。

※6/15追記
　WSL1に関しては少々前に[こちら](https://croud.jp/?p=553)に書いたので参照してください。

　その後、使ってみて面倒だと思ったのがIPアドレスがらみです。
　WSL2を起動すると、Windows側にブリッジ用の仮想nicが作成され、クラスBやクラスCのプライベートIPがランダムに割り当てられます。これはWindowsを再起動すると削除され、次回起動時に再作成されます。
　そのブリッジを利用して、そのネットワークのIPをLinuxのnicに割り当てるのですが、**wsl --shutdown**してから起動し直すと、毎回違うIPが割り当てられます。これを固定する方法を模索しましたが、再起動で削除されるのでどうにもなりませんでした。

- Windows [vEthernet (WSL)]  
　WSL2起動時に作成され、Windowsをシャットダウンすると削除
　IPはあらゆるプライベートIPからランダムで、クラスBやクラスCなどのサブネットすら定まらず、割り当て方があまりにダイナミック
- Ubuntu [eth0]  
 vEthernet (WSL)のネットワーク内からdhcpで割り当てられ、WSLをシャットダウンし、再び起動するとIPは変更される。**ip addr change**で無理矢理IPを割り当てることは可能だが、vEthernet (WSL)のIPが変わってしまうので意味を成さない

　開発者の話だとnicに関しては、Windows側からlocalhostでアクセスできるようにするという話なので、現時点ではお試し版と言うことで我慢するしかありません。
　このあたりを回避するにはddnsでプライベートIPを無理矢理通知するぐらいしか手が浮かびません。この通知も、プライベートIPを抽出してダイレクトに設定しなければいけないので、それなりに面倒です。

　ちなみにWindowsからLinuxファイルへは、\\wsl$\Ubuntu のようなUNCパスでアクセスできるようになっています。どうもSambaとは違う感じのようです。

## １．インストール

### ディストリビューションのインストール
　基本はWSL1と同じです。
　WSLを有効にしたらMicrosoftStoreなどでLinuxのディストリビューションをインストールします。
　WSL2で動作させる前に、一度起動してインストールを完了させておく必要があります。

### WSL1からWSL2への変換と起動

　条件が揃ったら、以下のコマンドを入力。

- HyperVの有効化(要管理者権限)

```
> Dism /online /Enable-Feature /FeatureName:HypervisorPlatform
展開イメージのサービスと管理ツール
バージョン: 10.0.18917.1000

イメージのバージョン: 10.0.18917.1000

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
```

- パッケージの確認

```
> wsl --list --quiet
Ubuntu
```

- 変換

```
> wsl --set-version Ubuntu 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。
```

- 起動

起動は一瞬、待ち時間は存在しないらしいです。

```
> wsl
guest@pc:/mnt/c/Users/guest$
```

## ２．状態の確認

- nicがどうなっているのか

Hyper-Vで仮想化している都合上、ホストとipは共有されません。

```
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 8a:f1:77:37:c1:b6 brd ff:ff:ff:ff:ff:ff
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:61:25:af brd ff:ff:ff:ff:ff:ff
    inet 192.168.18.92/24 brd 192.168.18.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe61:25af/64 scope link
       valid_lft forever preferred_lft forever
```

## ３．nginxを入れて動かしてみる

```
$ sudo su -
# apt -y install nginx    
# service nginx start   
```

普通に仮想マシンで動いているだけなので、eth0に割り当てられているipにWindowsのブラウザからアクセスすればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267629/cfdc5aba-28d6-b9bf-ab6e-acc2f2da717a.png)

## ４．メモリの状態

- Linux

```
# free
              total        used        free      shared  buff/cache   available
Mem:       15230732       82700    14993136          52      154896    14910492
Swap:             0           0           0

# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0    856   536 ?        Sl   16:10   0:00 /init
root         8  0.0  0.0    860    76 ?        Ss   16:10   0:00 /init
root         9  0.0  0.0    860    80 ?        R    16:10   0:00 /init
guest      10  0.0  0.0  22996  4900 pts/0    Ss   16:10   0:00 -bash
root        28  0.0  0.0  64216  4332 pts/0    S    16:11   0:00 sudo su -
root        29  0.0  0.0  63476  3768 pts/0    S    16:11   0:00 su -
root        30  0.0  0.0  22988  4888 pts/0    S    16:11   0:00 -su
root       464  0.0  0.0 140628  1508 ?        Ss   16:12   0:00 nginx: master process /usr/sbin/nginx
www-data   465  0.0  0.0 143304  6096 ?        S    16:12   0:00 nginx: worker process
www-data   466  0.0  0.0 143304  6096 ?        S    16:12   0:00 nginx: worker process
www-data   467  0.0  0.0 143304  6096 ?        S    16:12   0:00 nginx: worker process
www-data   468  0.0  0.0 143304  6096 ?        S    16:12   0:00 nginx: worker process
www-data   469  0.0  0.0 143304  6096 ?        S    16:12   0:00 nginx: worker process
www-data   470  0.0  0.0 143304  6096 ?        S    16:12   0:00 nginx: worker process
www-data   471  0.0  0.0 143304  6096 ?        S    16:12   0:00 nginx: worker process
www-data   472  0.0  0.0 143304  6096 ?        S    16:12   0:00 nginx: worker process
root       526  0.0  0.0  37792  3308 pts/0    R+   16:33   0:00 ps aux
```

- Windows

1GB持って行かれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267629/ec6715aa-56a2-2d8c-a1b9-fb7327b42401.png)

ちなみにWSL2はHyper-Vマネージャでは操作できないというか、そもそも何も無いことになっています。

## ６．とりあえず

　さっき入れたばかりですが、まだ誰も記事を書いていないようだったので取り急ぎ書きました。
　WSL1の最大の利点、仮想化によるメモリ消費が無いという魔法みたいな動作が無くなってしまったのが寂しいところです。
　そもそもHyper-Vに普通にLinuxを入れても同じような気はするのですが、差別化としては起動の早さと軽さが売りのようです。
　これがどの程度使えるのかは、もう少し使い込んでみないとなんとも言えません。