待ちに待ったWSL2が使えるようになったので入れてみた。現在は、インサイダープレビューのSlowリングにしていれば使える感じ。
実際のインストールはとても簡単で、ここの手順に従うだけ。
インストールの実行
WSL と Virtual Machine Platform の有効化
管理者権限で、PowerShellを立ち上げて下記のコマンドを実行する
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe は何だろうと思って調べてみると次のようなツール。
Deployment Image Servicing and Management(DISM.exe) Windows イメージのサービスや準備に使われるコマンドラインツール。DISMはWindows image(.wim) やvirtual hard disk (.vhd or .vhdx) にサービスを行います。
ちなみに、どんな時に使うかというと
- Windowsイメージに含まれるデータや情報、例えばコンポーネントのインベントリを取得したり、ドライバ、イメージに含まれるアプリケーションのアップデート、イメージのキャプチャや分割、追加、削除、マウントなどを行います。
なるほど。今回使われるコマンドとしては妥当な感じですね。コマンドからするに、WSLと、Virtual Machine Platform を有効化しています。
ちなみに、上記のコマンドを実行後、OS再起動後に設定が有効になるようです。
その後、設定を加えて、WSL2をデフォルトに変更します。
PS > wsl -l
Ubuntu (Default)
WLinux
Ubuntu-18.04
PS > wsl --set-version Ubuntu-18.04 2
PS > wsl --set-default-version 2
ただ、ここのままでは動きませんでした。WSL2を起動すると、次のURLに飛ぶように指示されました。
このページにあるAMD64のバイナリを落としてインストールするとWSLが動きました。
ちなみに、ここでは、ARM64, AMD64 の両方が選べますが、最近CPUを勉強していなかったので、Core i7 ってどっちやねんとまよったので、一応調べました。ARMは、アンドロイドやiPhoneで使われるCPUです。Windows10はそっちでも動作するので、そのバイナリが必要なんですね。
x86-64, x64, AMD64 は同じ意味でつかわれるそうです。AMDはインテルより先にAMD社によって発表されたもので、Intelのものは本来はIntel64ですが、それらをまとめてAMD64と呼ばれるようです。(コメントを頂いたので修正しました)
- ARMとx64/x64(Intel,AMD)のCPU、アーキテクチャの違い、シェア、性能比較、アーキテクチャ、エンディアン
- x86とか32bitCPUとかISAとかAMD64とかx86_64とかについて調べてみた
VSCode リモートデベロップメントでつないでみる
私は、Linuxはほぼコマンドラインで、GUIはほぼ使わないのですが、エディタだけはやっぱいい。そんな時は、VSCodeのリモートデベロップメントが最高です。リモートのLinuxマシンにつないで、ローカルのマシンのように開発できます。
VSCode を起動して左下のこれをクリック
次の画面がでてくるので、Remote-WSL: New Window をえらびます。もし、WSLで複数のディストリビューションを使っている場合は、using Distro...の方をえらびます。
今回は書きませんが、この仕組みをつかって、DevContainerというのを作れます。つまり、接続するのをWSLやLinuxの代わりに、コンテナにつなぐもので、クリーンな開発環境がすぐ作れます。
起動
起動してみるとしっかり前のデータが残っていて、既にインストールしたコマンドもそのまま使えました。確かに、若干早い気がします!
インストールの手引きにあるとおり、WSL2からExplorerを起動したりもできました。
やったぜ!これで生Dockerとかも使い放題や!今まではWSLだと動かないとかありました。内部のシステムコールをWindowsのシステムコールに変換するために起こっていました。あとはパフォーマンスも遅かったようです。
Docker Desktop とのインテグレーション
皆さんも、DockerをWindowsで使っていてシェルでログインが出来なかったりとイライラしていたことでしょう。今まではWSLを使っていましたが、Dockerが動作しなかったので、DOCKER_HOST
を指定して、WindowsのDocker Destktopにつなぎに行って、クライアントだけWSLにインストールして動かしていましたが、 Desktop の設定を変えるだけで使えるようになりました。DockerUserの設定とかOS起動時の設定とかひつようやろなーと思ったら、何もしなくても動きました。設定は2つ。次の画面で、Enable the experiment WSL2 based engine をえらんでWSL2をDockerのサーバにします。
次にインテグレーションを有効にします。
このインテグレーションで何が起こっているのでしょうか?ちょっと調べてみると、WSL2側でプロキシが実行されていて、おそらくこれに、Docker Destktopがつなげているのでしょう。
$ ps -ef | grep docker
root 664 663 0 20:07 pts/3 00:00:00 /mnt/wsl/docker-desktop/docker-desktop-proxy --distro-name Ubuntu-18.04 --docker-desktop-root /mnt/wsl/docker-desktop
あと、etc/group
に下記のエントリが追加されているので、無事Dockerが動作するようになっているようです。
docker:x:999:ushio
インストール済みのパッケージも見てみます。パッケージがインストールされています。
$ dpkg -l
ii docker-ce 18.06.0~ce~3-0~ubuntu amd64 Docker: the open-source application container engine
rc docker.io 17.12.1-0ubuntu1 amd64 Linux container runtime
cd /var/lib/docker
root@DESKTOP-SDE49UK:/var/lib/docker# ls
containerd containers image network nuke-graph-directory.sh overlay2 plugins runtimes tmp trust volumes
後はスタートアップスクリプトです。systemdか、Upstartだと思うのですが、systemdの/lib/systemd/system/docker.service
は存在しますが、ステータスをみてみると、こんなメッセージなので、多分Upstartかな?このあたり全然しらない分野なので、間違ってたら是非コメントを。
sudo systemctl show docker
System has not been booted with systemd as init system (PID 1). Can't operate.
/lib/systemd/system
の下にこれがしっかりインストールされているんだけど、systemctl --type=service
も同じ結果だな。
Upstartで使いそうなファイル存在して、Upstartで起動されてい、、、ない?
$ cat /etc/init/docker.conf
$ sudo service docker status
* Docker is not running
どうやってDockerが動いてるかしりたかったけど、わからないなー。ちなみに、Dockerの公式のドキュメントには、WSL2インテグレーションのほうが15倍起動がはやくメモリ消費も少ないとあるな。
nginx を動かす
折角なので、nginxを動かしてみましょう。WSL2側で
$ docker run -p 80:80 nginx
次に、WSL2のIPアドレスを調べます。
$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.211.22 netmask 255.255.240.0 broadcast 172.19.223.255
inet6 fe80::215:5dff:fead:3525 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:ad:35:25 txqueuelen 1000 (Ethernet)
RX packets 56307 bytes 4227423 (4.2 MB)
RX errors 0 dropped 3 overruns 0 frame 0
TX packets 30594 bytes 12365931 (12.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
だったので、こいつに対してアクセスすることにします。
めでたしめでたし。
WSL1との違い
次のページに、WSL1との違いについて述べられていました。
大きな違いとしては下記の2点
- ネットワークアクセス
- ディスクアクセスの高速化と、OS連携のファイルシステムアクセスの速度低下
最初の部分が一番大きそうで、知らないとハマりそうなのでメモしておきます。WSL2側から、Windows10側へのアクセスですが、従来は、localhostで行けたと思うのですが行けなくなります。母艦側のLANにつながっているイメージとして動作するようです。WSL2側からみた、ホストマシンのIPアドレスに関しては、/etc/resolv.conf
に書いてあります。
この変更により、WSL2から、母艦にアクセスする場合、母艦側のアプリケーションが127.0.0.1
だけを受け付ける設定になっていると動作しません。セキュリティ的にあれですが0.0.0.0
とかに変更する、もしくは、wsl2側のIPアドレスを調べてそれを許可する必要があると思います。
2点目ですが、WSL2はネイティブで動作するので、そのなかで使っているととてもサクサク動きます。ただ、Windows側にアクセスするのは、プレビューだとWSL1より遅くなるようです。だから、Linux側のファイルシステムにアクセスするようにファイルを置いておく方が良さげです。
まとめ
これこそまさに欲しかったWSLです。昔はWindows側にXを上げたりしていましたが、正直WindowsのGUIのレベルには全然及ばないんですよね。だから、VSCodeがリモートデベロップメントを用意してくれて、WSL2が来たので、Macを使う機会が激減しています。今後運用していくと、いろいろ問題がありますが、ファーストインプレッションは相当いい感じです!(Windowsターミナルがもっとこなれてくれれば、、、)