追記:
「Windows 10 May 2020 Update」でブルースクリーン発生やBluetooth未接続、一部アプリでIME不具合 - PC Watch

2020.05.29現在、アップデートには不具合が伴うようです。自己責任でお願いします

待ちに待たされたWSL2が正式リリースされたので、さっそくDebianとDocker Desktopを入れてみました

一応再起動ポイント記述していますが、セットアップ中は度々再起動したほうがいいです

WSL2のインストール

「Windowsの機能の有効化または無効化」という所から、Linuxを有効にします([Win]キー押してそのまま 機能とタイプすると出てきます)

wsl2-000.jpg

「Linux用Windowsサブシステム」にチェックを入れる

wsl2-002.jpg

再起動します

Debianのインストール

MicrosoftストアからDebianをインストールします

wsl2-001.jpg

Debianを一度起動し、ユーザとパスワードを設定して終了します

wsl2-003.jpg

DebianのWSLバージョンを2にする

管理者モードでPowerShellを起動します

wsl2-004.jpg

1
2
3
4
5
// バージョン確認(ここではまだVer1)
> wsl -l -v

// Debianがデフォルトになってない場合はデフォルトにしておく(任意)
> wslconfig /setdefault Debian

WSLとVirtual Machine Platformを有効にします

1
2
> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

再起動します

その後、Debianのバージョン変更をします。人によって数分かかります

1
2
3
4
5
// Debianのバージョンを2に
> wsl --set-version Debian 2

// デフォルトのバージョンを2に
> wsl --set-default-version 2

カーネル更新しろと言われた場合、WSL2 Linux カーネルの更新を参考に更新し、再起動します

再びDebianのバージョンを確認して

1
> wsl -l -v

2になっていれば起動してみます(ここから先は管理者モードでなくてもよい)

1
> wsl

試しにscreenfetchをインストールしてみます。 sudoは最初から使えます

1
2
3
4
5
// 試しにscreenfetchのインストール(任意)
$ sudo apt update
$ sudo apt install -y screenfetch

$ screenfetch

wsl2-005.jpg

この後、Dockerのインストールですが、今回からDocker Desktopを入れてみます(docker-ceはそのままだと動きませんでした)

1
2
3
// ここではまだNotFound
$ docker -v
$ docker-compose -v

Docker Desktop インストール

Docker Desktop WSL 2 backend | Docker Documentation

インストーラを起動し、Enable WSL 2 Windows Featuresにチェックしてインストールします

wsl2-006.jpg

インストール後、再起動します

ここでもカーネル更新しろと言われる場合があります。その場合は、WSL2 Linux カーネルの更新を参考に更新し、再起動します

wsl2-007.jpg

この後、Docker Desktopの起動後に、カーネルの更新を求められる場合があるようです。ここてカーネルを更新し、再起動後にDebianのWSLバージョンが 1に戻ってしまっていたので、 wsl -l -vで確認し、必要に応じてもう一度 wsl --set-version Debian 2を実行しないといけない場合があると思います

Docker Desktop チュートリアル(任意)

PowerShellからwslを起動し、

1
> wsl

Dockerのバージョン確認

1
2
$ docker -v
$ docker-compose -v

バージョンが表示されたら、公式の getting-startedを実行

1
$ docker run -dp 80:80 docker/getting-started

ブラウザで、 http://localhost:80/にアクセス

wsl2-008.jpg

Dashboardでも操作出来るか確認

wsl2-009.jpg

以上です

昔、Docker for Windowsを使おうとした時、Windows 10 Homeは使えず、Windows 10 Proのみとなっていた頃から敬遠していましたが、今回チュートリアルまで試してみた感じでは、Home,Pro共に問題なさそうでした

あとDocker19ですが、 GPUはまだ使えないみたいです → Windows 10、WSL 2でLinux GUIアプリとGPUコンピューティングをサポートへ - Engadget 日本版

その他メモ

WSLのIPを調べる

1
> wsl -d Debian exec hostname -I

netshでポートフォワード(管理者権限でPowershell起動)

1
> netsh interface portproxy add v4tov4 connectaddress=[WSLのIPアドレス] listenport=2222 connectport=22

ホストWindowsからアクセスする際のアドレス \\wsl$

wsl2-010.jpg

Debian環境の日本語化

1
2
3
4
$ sudo apt-get install -y locales dialog
$ sudo locale-gen ja_JP.UTF-8
$ sudo localedef -f UTF-8 -i ja_JP ja_JP
$ sudo update-locale LANG=ja_JP.UTF-8

/etc/hostsについて

/etc/hostsの冒頭の記載があるように、ホストWindows側のhostsから /etc/hostsを生成しているので、ホスト側Windowsと同期したくない場合は、 /etc/wsl.confで無効にする必要がある

1
2
3
4
$ head -n 3 /etc/hosts
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
1
$ diff /mnt/c/Windows/System32/drivers/etc/hosts /etc/hosts

あと、WSL起動後に、ホストWindows側のhostsを更新(vim /mnt/c/Windows/System32/drivers/etc/hosts)しても、WSL側の/etc/hostsには反映されなかったので、手動で同期するか、もしくは、ホストWindowsごと再起動かけたら反映されました。ホスト再起動しないで同期する方法ないのかな

参考:
/etc/hosts does not update · Issue #2059 · microsoft/WSL
wsl.conf と .wslconfig - roy-n-roy メモ

他のPCからSSH接続

おおむねこちらの通りでDebianも接続出来ましたが、追加でファイアウォールの許可が必要でした。ここでは自動化は行っていません

1
2
3
4
5
6
7
// WSL2側にスクリプトを作成する
$ cat /opt/bin/forward-from-windows.sh
#!/bin/bash
IP=$(hostname -I)
echo $IP
netsh.exe interface portproxy delete v4tov4 listenport=22
netsh.exe interface portproxy add v4tov4 listenport=22 connectaddress=$IP
1
2
3
// Windows側にバッチファイルを作成する(ここでは C:\bin に置きます)
PS C:\> cat C:\bin\ssh-forward-to-wsl.bat
wsl --exec bash /opt/bin/forward-from-windows.sh

管理者として実行

wsl2-011.jpg

起動後、netshではこのように見える

1
2
3
4
5
6
7
8
// ここでは、172.26.98.15がWSL2のIP(起動毎に可変)
PS C:\> netsh.exe interface portproxy show v4tov4

ipv4 をリッスンする: ipv4 に接続する:

Address Port Address Port
--------------- ---------- --------------- ----------
* 22 172.26.98.15 22

ポートフォワードができたのでWSL2側でSSH起動

1
2
$ sudo apt install -y openssh-server
$ sudo service ssh start

私の環境ではこれだけでは繋がらなかったので、ファイアウォールの許可をしました

1
PS C:\> netsh advfirewall firewall add rule name="sshd" dir=in action=allow protocol=TCP localport=22

メモリ制限をかける

用途次第ですが、WSLがいつのまにか10GBとか食いつぶしていたりするので、WSLが使用出来るメモリ量に制限をかけます

1
2
3
4
5
6
// 例: WSL上から(Windowsからやってもいいです)
$ vim /mnt/c/Users/[ユーザ名]/.wslconfig

[wsl2]
memory=6GB
swap=0

再起動後

1
2
3
4
5
// 6GBに制限されてる
$ free -m
total used free shared buff/cache available
Mem: 5942 466 4416 0 1059 5260
Swap: 0 0 0

参考: WSL2によるホストのメモリ枯渇を防ぐための暫定対処 - Qiita