追記:
「Windows 10 May 2020 Update」でブルースクリーン発生やBluetooth未接続、一部アプリでIME不具合 - PC Watch2020.05.29現在、アップデートには不具合が伴うようです。自己責任でお願いします
待ちに待たされたWSL2が正式リリースされたので、さっそくDebianとDocker Desktopを入れてみました
一応再起動ポイント記述していますが、セットアップ中は度々再起動したほうがいいです
WSL2のインストール
「Windowsの機能の有効化または無効化」という所から、Linuxを有効にします([Win]キー押してそのまま 機能
とタイプすると出てきます)
「Linux用Windowsサブシステム」にチェックを入れる
再起動します
Debianのインストール
MicrosoftストアからDebianをインストールします
Debianを一度起動し、ユーザとパスワードを設定して終了します
DebianのWSLバージョンを2にする
管理者モードでPowerShellを起動します
1 | // バージョン確認(ここではまだVer1) |
WSLとVirtual Machine Platformを有効にします
1 | > dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart |
再起動します
その後、Debianのバージョン変更をします。人によって数分かかります
1 | // Debianのバージョンを2に |
カーネル更新しろと言われた場合、WSL2 Linux カーネルの更新を参考に更新し、再起動します
再びDebianのバージョンを確認して
1 | > wsl -l -v |
2になっていれば起動してみます(ここから先は管理者モードでなくてもよい)
1 | > wsl |
試しにscreenfetchをインストールしてみます。 sudo
は最初から使えます
1 | // 試しにscreenfetchのインストール(任意) |
この後、Dockerのインストールですが、今回からDocker Desktopを入れてみます(docker-ceはそのままだと動きませんでした)
1 | // ここではまだNotFound |
Docker Desktop インストール
Docker Desktop WSL 2 backend | Docker Documentation
インストーラを起動し、Enable WSL 2 Windows Features
にチェックしてインストールします
インストール後、再起動します
ここでもカーネル更新しろと言われる場合があります。その場合は、WSL2 Linux カーネルの更新を参考に更新し、再起動します
この後、Docker Desktopの起動後に、カーネルの更新を求められる場合があるようです。ここてカーネルを更新し、再起動後にDebianのWSLバージョンが
1
に戻ってしまっていたので、wsl -l -v
で確認し、必要に応じてもう一度wsl --set-version Debian 2
を実行しないといけない場合があると思います
Docker Desktop チュートリアル(任意)
PowerShellからwslを起動し、
1 | > wsl |
Dockerのバージョン確認
1 | $ docker -v |
バージョンが表示されたら、公式の getting-started
を実行
1 | $ docker run -dp 80:80 docker/getting-started |
ブラウザで、 http://localhost:80/にアクセス
Dashboardでも操作出来るか確認
以上です
昔、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$
Debian環境の日本語化
1 | $ sudo apt-get install -y locales dialog |
/etc/hosts
について
/etc/hosts
の冒頭の記載があるように、ホストWindows側のhostsから /etc/hosts
を生成しているので、ホスト側Windowsと同期したくない場合は、 /etc/wsl.conf
で無効にする必要がある
1 | $ head -n 3 /etc/hosts |
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 | // WSL2側にスクリプトを作成する |
1 | // Windows側にバッチファイルを作成する(ここでは C:\bin に置きます) |
管理者として実行
起動後、netsh
ではこのように見える
1 | // ここでは、172.26.98.15がWSL2のIP(起動毎に可変) |
ポートフォワードができたのでWSL2側でSSH起動
1 | $ sudo apt install -y openssh-server |
私の環境ではこれだけでは繋がらなかったので、ファイアウォールの許可をしました
1 | PS C:\> netsh advfirewall firewall add rule name="sshd" dir=in action=allow protocol=TCP localport=22 |
メモリ制限をかける
用途次第ですが、WSLがいつのまにか10GBとか食いつぶしていたりするので、WSLが使用出来るメモリ量に制限をかけます
1 | // 例: WSL上から(Windowsからやってもいいです) |
再起動後
1 | // 6GBに制限されてる |