Windows Subsystem for Linux 利用ノート

WSL に関する利用ノートをつづる。次の課題を解決したい:

  • インストールおよびアップグレードの方法を会得する。

  • WSL を管理する方法を会得する。

  • Linux ディストリビューション (Ubuntu) に関する操作を会得する。

  • WSL に関する構成方法を理解する。

  • Windows と WSL/Linux との連携の仕組みを模索する。

Linux 用 Windows Subsytem for Linux (WSL) を使用すると、従来の仮想マシンなどのオーバーヘッドなしで、コマンドラインツール、ユーティリティー、アプリケーションなどを含む GNU/Linux 環境のほとんどを、変更せずに Windows 上で直接実行できる。

Note

本ノートの初版を記すのに用いていた Windows 本体、WSL および Ubuntu のバージョン情報はそれぞれ次のとおりだ。

OS:

Windows 10 Home version 22H2 ビルド 19045.2006

WSL 2:

5.10.102.1

Ubuntu:

20.04 LTS

その後かなり間が空き Windows 10 のサポート終了に伴う環境移行を敢行。移行後の環境は次のとおり:

OS:

Windows 11 Pro version 25H2 ビルド 26200.7019

WSL 2:

6.6.87.2-1

Ubuntu:

24.04.3 LTS

インストール

公式文書によると最初から wsl が利用可能であるようだ。次のコマンドを実行しろとある:

WSL インストールコマンド
PS> wsl --install

これが上手くいくと WSL が利用可能になる。上のコマンドではインストールオプションを指定していないため、Linux のディストリビューションとして Ubuntu が暗黙的に選択される。

既定の Linux ディストリビューションが Ubuntu であることと、私がそれしか利用しないことから、本稿ではこれ以降、この二つの単語を区別なしに記述するかもしれない。

アップグレードする

WSL 自体のアップグレード方法は次のコマンド実行による。これで WSL Linux カーネルが存在する場合に限り、その最新版に更新される。

WSL 更新コマンド
PS > wsl --update

Linux ディストリビューションのアップグレード方法を Ubuntu を例にとって記す。おそらく次の方法すべてが等価で有効だ:

  1. コンソールから winget upgrade -e --id Canonical.Ubuntu を実行

  2. Microsoft Store から Ubuntu on Windows を更新

Use Cases

プログラム wsl が利用者に用意している機能は次の二つに分類される:

  • Linux プログラムを実行する

  • WSL を管理する

Linux プログラムを実行する

Linux コマンドを指定しないで実行すると、Linux シェルを起動する。

Ubuntu 起動コマンド
PS> wsl
PS> wsl --distribution Ubuntu

Linux コマンド COMMAND_LINE を実行するには次のどちらかの形式を入力する。前者はコマンドラインがシェルに渡る。後者はシェルを起動せずに実行するので、コマンドライン文字列が解析されない。

Linux コマンドを Windows から実行する例
PS> wsl COMMAND_LINE
PS> wsl --execute COMMAND_LINE

コマンドにはコマンドラインオプションを付与することもできる。システムにディストリビューションが複数存在する場合には --distribution DISTRO_NAME で Linux ディストリビューションを指定することが可能。実行環境を指定する --cd WORK_DIR--user USER を使うことがあるかもしれない。

Linux コマンドを Windows から実行する例
PS> wsl --cd /tmp -e pwd
/tmp

Bash のような引数リストマーカー -- も使える。

WSL を管理する

WSL 管理ツールとしての用途としては、次のものがある:

  • wsl のコマンドライン仕様を確認する

  • WSL に関する情報を確認する

  • Linux ディストリビューションを一覧する

  • Linux ディストリビューションをインストールする

  • WSL カーネルを更新して最新にする

  • WSL の各種既定バージョン (1 or 2) を指定する

  • Linux ディストリビューションイメージを操作する

  • 実行中の仮想マシンすべてを即終了する

  • Linux ディストリビューションを終了する

  • Linux ディストリビューションを削除する

インストールと更新については記したので、以下ではその他の用途を見ていく。

WSL に関する情報を確認する

サブコマンド --status で既定の Linux ディストリビューションの種類、カーネルバージョンなど、WSL に関する一般的な情報を出力する。簡単なコマンドなので実行例を記す:

WSL 情報を出力するコマンドの実行例
PS> wsl --status
既定のディストリビューション: Ubuntu
既定のバージョン: 2
WSL1 は、現在のマシン構成ではサポートされていません。
WSL1 を使用するには、"Linux 用 Windows サブシステム" オプション コンポーネントを有効にしてください。

Linux ディストリビューションを一覧する

サブコマンド --list は Linux ディストリビューションを確認する。次の使用状況があり得る:

  • 管理下にあるディストリビューションを一覧する

  • 現在実行中のディストリビューションを表示する

  • インストール可能なディストリビューションを一覧する

コマンド入出力例を記す:

wsl --list コマンド実行例
PS> wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)

PS> wsl --list --all
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)

PS> wsl --list --quiet
Ubuntu

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

PS> wsl --list --running
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)

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

NAME                            FRIENDLY NAME
AlmaLinux-8                     AlmaLinux OS 8
AlmaLinux-9                     AlmaLinux OS 9
AlmaLinux-Kitten-10             AlmaLinux OS Kitten 10
AlmaLinux-10                    AlmaLinux OS 10
Debian                          Debian GNU/Linux
FedoraLinux-43                  Fedora Linux 43
FedoraLinux-42                  Fedora Linux 42
SUSE-Linux-Enterprise-15-SP7    SUSE Linux Enterprise 15 SP7
SUSE-Linux-Enterprise-16.0      SUSE Linux Enterprise 16.0
Ubuntu                          Ubuntu
Ubuntu-24.04                    Ubuntu 24.04 LTS
archlinux                       Arch Linux
kali-linux                      Kali Linux Rolling
openSUSE-Tumbleweed             openSUSE Tumbleweed
openSUSE-Leap-16.0              openSUSE Leap 16.0
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_10                Oracle Linux 8.10
OracleLinux_9_5                 Oracle Linux 9.5
openSUSE-Leap-15.6              openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6

各種の既定バージョンを指定する

利用者ノート

本稿執筆時点では WSL 2 で Ubuntu を利用する状況しかないので、これらの機能を深追いしない。

サブコマンド --set-default-version は WSL の既定バージョンを指定するものだ。

wsl --set-default-version 実行例
PS> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
この操作を正しく終了しました。

サブコマンド --set-default は既定の Linux ディストリビューションを指定する。先のコマンドが対象とするバージョンとは、このディストリビューションを利用する WSL のバージョンものだ。

wsl --set-default 実行例
PS> wsl --set-default Ubuntu
この操作を正しく終了しました。

サブコマンド --set-version は指定ディストリビューションを実行する WSL のバージョンを指定するものだ。Ubuntu を WSL 2 で動作させたい場合には次のようにする:

wsl --set-version 実行例
PS> wsl --set-version Ubuntu 2
WSL 2 との主な違いについては、https://aka.ms/wsl2
を参照してください
変換中です。これには数分かかる場合があります。

ディストリビューションは既に、要求されているバージョンです。
エラー コード: Wsl/Service/WSL_E_VM_MODE_INVALID_STATE

Linux ディストリビューションをインポート・エクスポートする

Caution

この節のコマンド群は採用することがなかった。実際には 新 PC にディストリビューションを移行する で述べる手順になった。

サブコマンド --import および --export は、Linux ディストリビューションのファイルシステムおよびデータ全体を TAR ファイル形式に符号化、復号化する。当然、利用する用途はバックアップとその回復だ。

バックアップコマンドは --export を指定する。次のようになる:

wsl --export で TAR ファイルを出力するコマンド例
PS> wsl --export Ubuntu ubuntu-bkp.tar

このアーカイブファイルを Linux システムに復元するには --import する:

wsl --import で TAR ファイルを出力するコマンド例
PS> wsl --import DISTRO_NAME DISTRO_LOCATION ubuntu-bkp.tar

ここで引数 DISTRO_NAMEDISTRO_LOCATION は復元後の Linux システムの名前と、それを配置する Windows 視点でのパスを表す。

利用者ノート

記憶領域媒体によって上記サブコマンドの性能に大きな差が生じるようだ。HDD では遅く SSD では速いのは想像に難くない。ファイルシステムの断片化がシリアライズ処理に影響するとか。現に、私の環境では --export が何分経っても TAR ファイルのサイズが変わらないままだった。

注意点が二つある:

  • 作業前に WSL を完全に停止すること。

  • wsl --export するまでは登録解除系のコマンドを決して実行するな。WSL イメージが消滅する。

  • wsl --import すると、おそらく Ubuntu コンソールを起動したときにユーザーを「忘れている」状態でプロンプトが示される。その場合にはファイル /etc/wsl.conf を root で編集して既定ユーザーを示すこと。指定方法を ユーザー構成 で述べる。

実行中の仮想マシンすべてを即終了する

サブコマンド --shutdown は実行中のディストリビューション全部と、WSL 2 仮想マシンを直ちに終了する。

WSL を終了するコマンド
PS> wsl --shutdown

仮想マシンを再起動をするには、Linux プログラムを実行するようなコマンド呼び出しを wsl を介して実行すればよい。

利用者ノート

このコマンドは構成変更時など、仮想マシン環境の再起動が必要な場合に実行するのが通常の運用だが、PC のメモリー容量が乏しい環境では、メモリーが逼迫してきたときに WSL を終了して、それをやりくりするのに援用することもある。

Linux ディストリビューションを停止する

サブコマンド --terminate は指定したディストリビューションを終了する。

ディストリビューションを停止する手順例
PS> wsl --list --running
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)

PS> wsl --terminate Ubuntu

PS> wsl --list --running
実行中のディストリビューションはありません。

Linux ディストリビューションを抹消する

このコマンドは Linux ディストリビューションのメジャーアップグレード作業発生時に利用する可能性があるので、ここに記す。

サブコマンド --unregister は、指定した Linux ディストリビューションのファイルシステムすべてとその中に含まれるデータすべてを完全に破壊する。

ディストリビューションを完全消去するコマンド例
> wsl --unregister Ubuntu

実行後、wsl --list --all の出力を確認すると、この Ubuntu は存在しないだろう。

構成

Warning

本節では WSL 2 に限定して記述する。

WSL は二段構えの構成手段を採用している。WSL 全体に対するものと、Linux ディストリビューション個別に対応するものだ。どちらもテキストベースのファイルで構成内容を指示する仕組みだ。WSL が起動するたびにこれらの構成ファイルが(記法が妥当な場合に限り)読み込まれ、適用される。

ファイル %USERPROFILE%\.wslconfig

ファイル .wslconfig は WSL 全体を統括する構成を指示する。Windows のフォルダー %USERPROFILE% に置かれる。このファイルを手動で設置してかまわない。

構成項目すべてを理解する必要はまだないので、私の環境の設定内容を記す。RAM が 8 GB しかない(当ノート初版当時)ので、メモリー周りの設定を余儀なくされる(普通は上手くいかない)。

.wslconfig wsl2 区画構成例
[wsl2]
memory=2G
swap=0

セクションラベルを wsl2 とする。

キー memory は WSL 仮想マシンに割り当てるメモリー容量だ。

キー swap は WSL 仮想マシンに追加するスワップ領域の容量だ。スワップファイルがない場合は 0 とする(註*スワップ領域とは、メモリー需要がハードウェア器機の制限を超過する状況で使用される「ディスク上のメモリー」だ)。

ファイルサイズを指定するエントリーでは、値を GB 単位で記す必要がある。

ファイル /etc/wsl.conf

ファイル /etc/wsl.conf は Linux ディストリビューションごとに用意できる。このファイルが指示する構成内容は、当然ながらこのファイルを特定の Linux ディストリビューションにしか適用されない。

マニュアルによると次の構成を指示できるようだ:

  • 自動マウントを設定する

  • ネットワークを設定する

  • Windows と WSL の間の相互運用を設定する

  • WSL のユーザーを設定する

  • ブートを設定する

このファイルを編集するには管理者権限を要する。例えば sudo -e /etc/wsl.conf を実行してエディターを開くことで編集する。

自動マウント構成

区画 automount では自動マウントを構成する。自動になる構成例を示す:

automount 区画構成例
[automount]
enable = true
root = /mnt/
options = "metadata,uid=1000,gid=1000,umask=22,fmask=11"

項目 enable = true だけで固定ドライブ (e.g. C:) は項目 root に従うパスにより (e.g. /mnt/c) アクセス可能になる。

利用者ノート

ここでは指定しないが、項目 mountFsTab = true により、WSL 開始時にファイル /etc/fstab を処理するようになる。そのファイルを適切に編集することで、 USB 外付けストレージ、Google Drive, pCloud といった、WSL 外の記憶域にも自動マウントさせることが可能になる。

個人的には手動マウントを好む。マウントする処理をシェル関数に定義しておいてセッションで source するのが良かろう。

ブート構成

区画 bootsystemd を使いたいのでこう記す:

boot 区画構成例
[boot]
systemd = true
#command = service docker start

ユーザー構成

区画 user では作業ユーザーを指定する。構成例を示す:

user 区画構成例
[user]
default={{ username }}

ここで、{{ username }} は対象ディストリビューションセッションで日常的に使用するユーザー名を指定する。

新 PC にディストリビューションを移行する

大まかな手順は次のとおり。実際には VHDX ファイルのサイズを切り詰める工程をエクスポート前後に入れる。詳細な手順は資料 wsl1wsl2 を合わせて見ろ。

移行元環境:

  1. Linux 側でゴミファイルを削除する

  2. WSL を停止する

  3. Linux のイメージファイルをエクスポートする

  4. このイメージファイルのサイズを切り詰める

  5. このイメージファイルを移行先に設けた共有フォルダーに移す

移行元環境で実行するエクスポートコマンドは上述の TAR 形式ではなく VHDX 形式としたい:

wsl --export --vhdx コマンド例
PS> wsl --export --vhdx Ubuntu "path-to-ext4.vhdx"

移行先環境:

  1. WSL をインストールする(必要に応じて Windows を再起動する)

  2. イメージファイルを共有フォルダーから管理しやすい場所に移す

  3. このイメージファイルをインポートする

移行先環境で実行するインポートコマンドは次のようになる:

wsl --import-in-place --vhdx コマンド例
PS> wsl --import-in-place Ubuntu "path-to-ext4.vhdx"

イメージファイルのエクスポートを省略して、元イメージをそのまま用いる方法もあるらしい。それがありなら外付け SSD に入れて複数台からアクセス可能にするかも?

Windows のソフトウェア各種との連携

今すぐ思いつくものを列挙しておく。他にもコツがあるだろう。

  • Windows 側の Explorer に Linux ディストリビューションのファイルシステムに ネットワークドライブの割り当て をしておくといいかもしれない。私は U ドライブに \\wsl$ を指定している。

  • Windows Terminal を利用しているならば、一度は設定画面を確認しておくべきだ。 WSLで Linux ディストリビューションを追加すると、便利なことに Windows Terminal にプロファイルが自動的に定義される。

  • Visual Studio Code を利用しているならば、WSL 関連の追加設定をするべきだ。これについては VS Code 利用ノートに記す。

資料

次の二つの資料は Windows 11 新 PC を導入したときにたいへん参考になった: