これまでも WSL を愛用していたんだけどいよいよ WSL 2 が来たようなので、入れてみました。そんで戻しました。

ちなみに WSL の 1 と 2 はそれぞれ長所短所ある別の仕組みであるらしく、同じ Windows 機に同時にインストールできるみたいです。Docker 使うなら 2 が必要。

本記事の内容

  • WSL 1 を利用中が前提
  • WSL 1 の環境を 2 へ変換する
  • WSL 2 の環境を 1 へ戻す
  • デフォルトで 1 で使うか 2 で使うかの設定
  • Docker は Docker Desktop を使うよ

Windows Terminal

本件とは直接関係ないんだけど、すっげー便利なのでおすすめです。このアプリひとつで Power Shell もコマンドプロンプトも、ついでに WSL で動いてる Linux シェルも開けます。

WSL 2 の用意

Windows バージョンの確認

Windows の設定 (Win+I) → System → About → Windows Specifications を開いて、”Version” の項を確認してください。(最初から version とかで検索しても出てくるはず。) これが最新の 2004 (かそれ以上)である必要があります。

まだなら Windows を更新

OS の Windows Update の画面から更新を何度確認しても降ってこなかったので(そういうものなの?)、インストーラーを探してインストールしました。こちらから。

URL 的に将来再利用されそうだけれど、現時点では最新版 “Windows 10 May 2020 Update” がダウンロードできます。このファイル自体はダウンローダー?なので一瞬で終わるんだけど、それを起動して更新をダウンロード、インストールするのに 30 分くらいかかりました。ほげえ。

なお最新の状態でこのインストーラーを起動しても「今最新版だよ~」と教えてくれるだけなので無害です。

ただし人によってはこれでインストールできない場合もあるらしい。どういうんだろう。

Virtual Machine Platform を有効化

管理者権限で PowerShell を開き、以下を実行します。

> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

1 分くらい?

カーネルをインストール

この “Download the Linux kernel update package” の節から wsl_update_x64.msi をダウンロード、実行。

Windows Subsystem for Linux Update Setup のウィンドウ

更新はウィザードでぽちぽちするだけ。

WSL 2 を使う

(任意)デフォルトで WSL 2 を利用するように

WSL 1 と 2 を併用できます。Microsoft Store とかでダウンロードした Linux ディストロをインストールするときの初期値をそのどちらにするか設定できるようです。

2 にするなら、こう。

> wsl --set-default-version 2
For information on key differences with WSL 2 please visit https://aka.ms/wsl2

利用中の WSL 1 を 2 へ変換

一覧から名前を得て、その名前を対象に更新します。

まずは一覧を表示して、名前を得ます。この例では “Ubuntu” ですね。

> wsl --list --verbose
NAME STATE VERSION
* Ubuntu Stopped 1

この名前 “Ubuntu” を覚えておく。

続いて --set-version します。

> wsl --set-version Ubuntu 2
Conversion in progress, this may take a few minutes...
For information on key differences with WSL 2 please visit https://aka.ms/wsl2
…

数分かかるとのことだが 60 分経っても終わりませんでした。ま、まただましたな!

完了したらバージョンが上がったのを確認。

> wsl --list --verbose
NAME STATE VERSION
* Ubuntu Running 2

使う

あとは普通に使うだけ。やったね。

やっぱり戻す

WSL 側から Windows 側ファイルの監視があやしい。

/mnt/c/User/ginpei 下にプロジェクト配置してるんだけど、どうも watch が怪しい感じがする。かつて普通の VM (VirtualBox) を使ってた頃も同じような問題に直面したような。

新機能は別途試すとして、やっぱり今の環境はそのまま残しておこう……ということにしました。残念。

バージョンをまた変える

さっき WSL 1 → 2 にしたのと同じ手順で 2 → 1 へ変換します。

> wsl --set-version Ubuntu 1

はいこれで元通り。こっちの変換の方が所要時間が少ない様子。

変換にかかる時間

対象は新規にダウンロード、インストールした空っぽの Ubuntu 20.04 LTS です。空っぽだと変換が速いみたい。

WSL のデフォルトを WSL 2 にしているので、2 → 1 → 2 の順番に変換してます。

2 → 1

1 分。

> Measure-Command { wsl --set-version Ubuntu-20.04 1 }

Days : 0
Hours : 0
Minutes : 0
Seconds : 49
Milliseconds : 284
Ticks : 492840008
TotalDays : 0.000570416675925926
TotalHours : 0.0136900002222222
TotalMinutes : 0.821400013333333
TotalSeconds : 49.2840008
TotalMilliseconds : 49284.0008

1 → 2

4 分。

> Measure-Command { wsl --set-version Ubuntu-20.04 2 }

Days : 0
Hours : 0
Minutes : 3
Seconds : 42
Milliseconds : 670
Ticks : 2226708369
TotalDays : 0.00257720876041667
TotalHours : 0.06185301025
TotalMinutes : 3.711180615
TotalSeconds : 222.6708369
TotalMilliseconds : 222670.8369

WSL 1 vs 2

表を翻訳して転載。

機能 WSL 1 WSL 2
Windows と Linux の統合
高速起動
省サイズ
Managed VM
完全な Linux カーネル
完全なシステムコール互換性
現行版の VM Ware や VirtualBox と併用
OS のファイルシステム越しのパフォーマンス

Managed VM って何? 本当の VM だよって意味?)

感覚的には、こんな感じ↓かなと思ってます。正しいですか?

  • WSL 1 は Windows のまま Linux のコマンドを動かす(Cygwin や MinGW みたいな)
  • WSL 2 は Windows とは別に Linux VM を動かす(VM Ware や VirtualBox みたいな)
  • あと、 2 は Windows 10 Home でも使える

Docker

動くようになりました。Windows 側に Docker をインストールする必要があります。

Docker がサポートしたのは WSL2 上の Linux ではなく「WSL2 バックエンド」だそうで、つまり Docker Desktop for Windows を経由してコンテナーを WSL2 の仕組みで実行させる、というものであるらしい。……これで合ってる?

Docker を使う流れ

なので、こんな流れ。

  1. WSL2 準備(本稿)
  2. Docker Desktop インストール
  3. WSL 2 のインスタンスから docker run hello-world

さっくり動きました。

エラー

管理者権限が必要

Power Shell なり何なりを普通に起動すると、権限を elevate してねと言われます。管理者権限で起動してください。

>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Error: 740

Elevated permissions are required to run DISM.
Use an elevated command prompt to complete these tasks.

不明なオプション

メモ取り忘れたんだけど、WSL 2 の準備が終わってないと --set-version とか諸々が使えません。( wsl コマンド自体は存在する。)

順にやっていきましょう。

カーネルが古い

「不明なオプション」と同じ。まだ WSL 2 の準備が終わってません。『カーネルをインストール』の節を参照。

> wsl --set-default-version 2
WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel

Docker が使えない

WSL 全体の設定で、WSL 2 のディストロをデフォルトに設定しないといけないようです。はまった。

以下 Ubuntu で試したもの。

$ docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.

Docker デーモンが動いてない? じゃあ動かそう。

$ sudo systemctl start docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

このエラー見たことある……。

おしまい

仕事は引き続き WSL 1 でやることにします。

とはいえ Docker 使ってやっていきをしたいところ。ファイル監視はな~どうしたら良いかな、気のせいであってほしいけど。

参考

更新履歴

  • 2020/11/24
    • Docker が動かないと思ってたけど動いてたので更新
    • (WordPress のエディターが替わって編集がうまくやれない……)
  • 2020/06/15 17:22
    • 初版公開