これまでも 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
をダウンロード、実行。
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
- An overview on the the Windows Subsystem for Linux | Microsoft Docs
- Comparing features
表を翻訳して転載。
機能 | 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 を使う流れ
なので、こんな流れ。
- WSL2 準備(本稿)
- Docker Desktop インストール
- 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 使ってやっていきをしたいところ。ファイル監視はな~どうしたら良いかな、気のせいであってほしいけど。
参考
- WSL 2 | Microsoft Docs
- Updating the WSL 2 Linux kernel | Microsoft Docs
- Troubleshooting the Windows Subsystem for Linux | Microsoft Docs
- An overview on the the Windows Subsystem for Linux | Microsoft Docs
- Docker Desktop WSL 2 backend | Docker Documentation
- Windows Terminal を入手 – Microsoft Store ja-JP
- Download Windows 10
- Install Windows Subsystem for Linux (WSL) on Windows 10 | Microsoft Docs
- Ubuntu 20.04 LTS を入手 – Microsoft Store ja-JP
- Install Docker Desktop on Windows | Docker Documentation
- WSL 2でCannot connect to the Docker daemonと言われたら、デフォルトを確認する。 | Ginpen.com
更新履歴
- 2020/11/24
- Docker が動かないと思ってたけど動いてたので更新
- (WordPress のエディターが替わって編集がうまくやれない……)
- 2020/06/15 17:22
- 初版公開