WindowsでLinuxを動かす(WSL2)

基本

新しい環境では以下で使用可能になる。
管理者権限でコマンドプロンプトを起動して実行する。

wsl --install

内部的にWindowsの機能の有効化などがされるのか、再起動を求められることがあるのでその時は再起動する。

状態の確認

wsl --status

「既定のバージョン: 2」となっていたらWSL2

C:\WINDOWS\system32>wsl --status
既定の配布: Ubuntu
既定のバージョン: 2

Linux 用 Windows サブシステムの最終更新日: 2022/01/10
Windows Subsystem for Linux カーネルは、'wsl --update' を使用して手動で更新できますが、システム設定が原因で自動更新が発 生することはありません。
カーネルの自動更新を受け取るには、 Windows Update の設定を有効にしてください:' Windowsの更新に、その他のMicrosoftの製品 の更新情報を受け取る'。
詳細については、 https://aka.ms/wsl2kernel.
を参照してください
カーネル バージョン: 5.10.60.1

既定のバージョンを2にする

既定のバージョンが1だったら、以下のコマンドで2にする

wsl --set-default-version 2

うまくいかないとき

「Windowsの機能の有効化」で以下を有効にする

  • Linux用Windowsサブシステム
  • 仮想マシンプラットフォーム

コマンドなら管理者権限のPowerShellで以下を実行

Enable-WindowsOptionalFeature -online -featurename VirtualMachinePlatform
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

管理者権限のコマンドプロンプトでも可能

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

BIOSで仮想化支援技術 (VT-xなど) を有効化する

タスクマネージャーで仮想化が有効か無効か確認できる。

無効になっていたら、BIOS設定画面を開いて「Virtualization Technology (VT-x)」を「Enabled」にする。

BIOS設定画面は、「設定」アプリを起動して、「更新とセキュリティ」→「回復」→「今すぐ再起動する」ボタンを押す→「オプションの選択」という青い画面が開いたら「トラブルシューティング」→「詳細オプション」→「UEFIファームウェアの設定」を押す。

「Advanced」「Security」「Chipset」「Processor」「Virtualization」などのメニューを開いていくと、「Intel Virtualization Technology (VT-x)」や「Intel VT-d」などが見つかるはず。

Dell OPTIPLEX 3050 では Virtualization と VT for Direct I/O どちらも有効にした。

最近のPCは最初から有効になっているかもしれない。面倒なのは古いPCの場合だと思う。

カーネルコンポーネントをバージョンアップ

WSL2を利用しようとすると以下のようにエラーになる場合

C:\WINDOWS\system32>wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります…
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください

カーネルをバージョンアップする。

wsl --update
C:\WINDOWS\system32>wsl --update
更新をチェック中…
更新をダウンロード中…
更新をインストール中…
この変更は、次回の WSL 再起動時に有効になります。強制的に再起動するには、'wsl --shutdown' を実行してください。
カーネル バージョン: 5.10.60.1

ブート構成データの設定に問題がある場合

まだうまくいかないとき、

以下のコマンドでブート構成データの状態を確認

bcdedit

hypervisorlaunchtype が Off となっていたら、以下のコマンドで設定を変更する。

bcdedit /set hypervisorlaunchtype auto

めんどくさかったら

WSL1でも、bashを利用したり、簡単なWeb開発環境を作ったり、ある程度は問題なく使えるので、すんなり行かないPCではWSL2をあきらめてもよいのではと思う。

どうしてもdockerなどを動かす必要があれば頑張りましょう。

WSL環境ができたらLinuxをインストールへ進む

インストールできる有効なディストリビューション

wsl --list -o
C:\WINDOWS\system32>wsl --list -o
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d ' を使用してインストールします。

NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
openSUSE-42 openSUSE Leap 42
SLES-12 SUSE Linux Enterprise Server v12
Ubuntu-16.04 Ubuntu 16.04 LTS
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS

ディストリビューションの追加

wsl --install -d Debian
wsl --install -d Ubuntu-20.04

インストールしたディストリビューションの確認

wsl --list -v
C:\WINDOWS\system32>wsl --list -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

既存のWSL1のディストリビューションのバージョンをWSL2にする

wsl --set-version ディストリビューション名 2
C:\WINDOWS\system32>wsl --set-version Ubuntu 2
変換中です。この処理には数分かかることがあります…
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

さくっと数分で終わる環境もあれば、何時間もかかる環境もあるらしい。

インストールしてすぐのWSL1は数分もかからずWSL2に変換された。

ある環境では下図の状態が1時間ほど続いた。CPUが古いためか、長期間利用していたWSL1のためか、容量の大きいデータベースなどが入っていたためか、どれかわからないが心当たりはある。

WindowsからLinuxの中のファイルにアクセスする

ネットワーク経由な感じになる。

エクスプローラーで以下のパスを開く。

\\wsl$

LinuxからWindowsのファイルにアクセスする

/mnt にマウントしている感じになる。

Cドライブなら、以下のパスでアクセスできる。

/mnt/c

ls すると、 Windows や Program Files などが見える。

簡単なWeb開発するとき

Linux側にWindows側のファイルを参照してもらうようにするなら、Cドライブに www フォルダを作って、WebサーバーのDocumentRoot を /mnt/c/www のようにすることで、C:\www にソースを置ける。

Windows側がLinux側のファイルを見に行く形なら、\\wsl$\var\www\html などにファイルを置くとよい。ただしパーミッションの問題があるので要調整。

WSL1とWSL2の違い

バージョンアップというよりは根本的に仕組みがらしい。

パフォーマンスはかなりアップするらしい。

ただ使用感は特に変わらない。

dockerを使って開発をしたい場合など、どうしてもWSL2じゃないといけないとき以外はどちらでもよいかもしれない。

トラブルシューティング

WSL2にしたら 127.0.0.1 でアクセスできなくなった

WSL1の時と勝手が違うところで乗り換えた人は戸惑うかも。

WSL用にネットワークができている。

以下のいずれかでアクセスできるはず。

  • IPv6 ::1 (httpなら http://[::1]/ )
  • localhost(Webなら http://localhost/ )
  • Linux側でifconfig して確認したIPアドレス(例: 172.28.123.123)

WSL2で 127.0.0.1, 127.0.0.2, 127.0.0.3 … のような複数のホスト名でアクセスしたい

IPv4のローカルループバックアドレスは 127.0.0.1~127.255.255.254 まで大量にあるが、IPv6は [::1] しかない。

IPアドレスはあきらめる。

localhost でアクセスできるのと、localhostのサブドメイン *.localhost でもアクセスできるのでこれで対処する。

例) test.localhost, dev.localhost, dev1.localhost, dev2.localhost ……

コメントする