注目の記事

Windows Subsystem for Linux 2(WSL 2)をセットアップしてみた

2020.07.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。
先日新しい開発機(Windows 10)が会社より支給されたのでデータ移行と環境の再セットアップをしています。

せっかくの機会ですのでOSを最新のWindows 10 May 2020 Update (2004)に更新し、Windows Subsystem for Linux (以後WSL) 環境を最新のWSL 2にしたのでその際の手順をここに記録しておきます。

手順

公式な手順はDocsにばっちり記載されています。

基本的にはこの手順を参照すれば問題ありません。

やってみた

それでは早速やっていきます。

0. 前提条件

WSL 2を利用するには現在最新のWindows 10であるWindows 10 May 2020 Update (Ver.2004、ビルド19041)以降である必要があります。
古いWindows 10を利用している場合はまずアップグレードが必要となります。

また、今回の環境は64bit版 Windows 10 Proとなります。
ちなみにWSL 2はWindows 10のすべてのエディションで利用可能です。

【2020.08.21 追記】

先日MicrosoftよりWSL 2が64bit版のWindows 10 May 2019 Update (19H1, 1903)およびWindows 10 November 2019 Update (19H2, 1909)にもバックポートされ利用可能になることがアナウンスされました。

Windows 10 May 2020 Update以外に

  • 64bit版 Windows 10 May 2019 Update (19H1, 1903) : ビルドバージョン 18362.1049 以降
  • 64bit版 Windows 10 November 2019 Update (19H2, 1909) : ビルドバージョン 18363.1049 以降

であれば本記事の内容を試せるはずです。
(私はもうOSを更新しちゃってるので試せないです...)

【追記ここまで】

1. 機能の追加

はじめにWLS 2を利用するには以下の2つの「Windowsの機能」が必要です。

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

管理者としてPowerShellコンソール(またはコマンドプロンプト)を起動しDISMを使いこれらの機能を追加します。

# Linux 用 Windows サブシステム
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 仮想マシン プラットフォーム
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

インストール後にコンピューターを再起動するとこれら機能が有効になります。

ちなみに「Hyper-V」の機能は無くても大丈夫です。

2. WSL 2 Linux カーネルの更新

WLS 2では別途Linuxカーネルモジュールを更新しておく必要があり、以下のドキュメントでその手順が記載されています。

こちらの内容に従い、

をダウンロードし実行します。
この更新パッケージでは特に選択肢は無いので画面の指示のままインストールを行います。

なお、インストール後に再起動する必要はありません。

3. WSL 2 を既定のバージョンとして設定する

続けてコンソールから

wsl --set-default-version 2

を実行して新規に追加されるWSLディストリビューションの既定のバージョンを2に更新しておきます。

ちなみに前項のWSL 2 Linux カーネルの更新をしてないと下図の様に更新を促されますのでご注意ください。

4. Linuxディストリビューションのインストール

ここまででWSL 2の事前準備は完了となりあとは好きなLinuxディストリビューションをインストールするだけです。

今回私はUbuntu 18.04 LTSをインストールしています。
(本当はUbuntu 20.04 LTSを使いたいのですがPowerShell 7がまだ対応していないためしぶしぶです...PowerShell Team対応はよ...)

この手順はWSL 1と同様で、Microsoft Storeから当該のディストリビューションをインストールして、

インストールが完了したら起動して初期ユーザ設定をすれば完了です。

以上で完了です。

WLS 2であることの確認

WSLの設定はwsl.exeコマンドで確認することが可能です。
インストールされたディストリビューションのバージョンは、

wsl -l -v

で確認することができます。
今回のインストールしたディストリビューションもちゃんと「VERSION = 2」となっています。

その他WSL 2の設定

ここまでの手順だけでもWSL 2を利用することができますが、知っておくと便利な設定がいくつかありますのでここで紹介しておきます。

a. WSl 2のCPU、メモリ割り当て

Insider Buildの時代からWSL 2の軽量VMがホストOSのメモリを大量に使用してしまう問題があるとのことなので、あらかじめ軽量VMのメモリ使用量を設定しておくことで対処しておきます。

WSL 2ではWSL全体に関わる設定を[ユーザープロファイル]\.wslconfigというファイルに持ちます。
デフォルトはこのファイルはありませんので新規に作成し以下の様な設定を記載して保存します。

[wsl2]
memory=2GB
processors=2

この場合軽量VMにCPU2コア、メモリ2GBを割り当てることになります。
内容はお使いの環境に合わせて適宜変更してください。

この設定は軽量VMを再起動すると反映されます。
軽量VMの停止はwsl --shutdownwsl -tで可能です。

# すべてのディストリビューション(軽量VM)を停止
wsl --shutdown

# 個別のディストリビューションを停止
wsl -t "ディストリビューション名"

なお、.wslconfigのその他設定については以下のドキュメントを参照してください。

b. 軽量VMディスクサイズの調整

WSL 2はその実体が軽量VMであるためディスクは仮想ディスク(.vhdx)の形で保持されています。
現時点ではこの仮想ディスクを自動で圧縮する機能は提供されていないためホストOSの容量を圧迫する場合は手動でディスクの圧縮を行う必要があります。

まず各ディストリビューション(軽量VM)ごとの仮想ディスクの場所を調べるには以下のドキュメントが役に立ちます。

PowerShellコンソールからざっくり以下の手順で見つけることができます。

# まずはディストリビューションの PackageFamilyName を取得
$packageName = Get-AppxPackage -Name "*ディストリ名*" | Select-Object -ExpandProperty PackageFamilyName
$packageName

# 仮想ディスクは LOCALAPPDATA 配下の PackageFamilyName 下に保存されている
dir "$env:LOCALAPPDATA\Packages\$packageName\LocalState\*.vhdx"

あとはこのVHDXを圧縮するだけです。
ざっくり以下の手順で可能です。

# 最初にディストリビューションを停止
wsl --shutdown

# Hyper-Vの機能をインストールしていれば Optimize-VHD が使える
Mount-VHD "仮想ディスク.vhdx" -ReadOnly -Passthru | Optimize-VHD Optimize-VHD -Mode Full -Passthru | Dismount-VHD

# Hyper-Vの機能をインストールしていない場合は diskpart で
diskpart
select vdisk file="仮想ディスク.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

c. Windows側のPATHをPATH環境変数に追加しない

WSLではWindowsのPATH情報をディストリビューション側のPATHに自動で追加します。
これによりWSLからWindowsの実行ファイルを呼び出すことができるのですが、環境によってはこのPATHが無いほうが良い場合もあるでしょう。

この点についてはWLS 1からあるwsl.confファイルで設定可能です。
wsl.confはディストリビューション内部の/etc/wsl.confにINIファイル形式で記述します。

PATH環境変数に関わる設定は[interop]セクションのappendWindowsPathキーとなり、この値をfalseにすればWindows側のPATHをPATH環境変数に追加しなくなります。

[interop]
appendWindowsPath = false

ディストリビューションを再起動すれば設定が反映されます。

wsl.confにはこのほかにも様々な設定がありますので以下のドキュメントを参考にしてください。

最後に

ざっとこんな感じです。
やっとWSL 2環境にすることができたので次はDocker Desktop(旧称 Docker for Windows)もインストールして試していきたいですね。