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

インストール

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

> wsl --install

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

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

アップグレードする

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

> wsl --update
更新をチェック中...
利用できる更新はありません。
カーネル バージョン: 5.10.102.1

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

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

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

Use Cases

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

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

  • WSL を管理する

Linux プログラムを実行する

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

> wsl
> wsl --distribution Ubuntu

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

> wsl COMMAND_LINE
> wsl --execute COMMAND_LINE

オプションを付与することもできる。--distribution DISTRO_NAME で Linux ディストリビューションを指定したり、--cd WD--user USER を使うことがあるかもしれない。

> 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 --status
既定の配布: Ubuntu
既定のバージョン: 2

Linux 用 Windows サブシステムの最終更新日: 2022/09/12
WSL の自動更新が有効になっています。

カーネル バージョン: 5.10.102.1

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

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

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

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

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

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

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

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

wsl > --list --quiet
Ubuntu

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

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

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

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 2 で Ubuntu を利用する状況しかないので、これらの機能を深追いしない。

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

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

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

> wsl --set-default Ubuntu

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

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

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

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

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

> wsl --export Ubuntu ubuntu-bkp.tar

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

> wsl --import DISTRO_NAME DISTRO_LOCATION ubuntu-bkp.tar

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

利用者ノート

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

注意点が二つある:

  • 作業前に WSL を完全に停止すること。コマンド wsl --terminate が良い。

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

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

    [user]
    default={{ YOUR_USER_NAME }}
    

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

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

> wsl --shutdown

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

利用者ノート

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

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

サブコマンド --terminate は指定したディストリビューションを終了する。もっとも、この機能が本当に必要になる機会は私の場合にはないだろう。

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

> wsl --terminate Ubuntu

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

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

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

> wsl --unregister Ubuntu

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

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

構成

Warning

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

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

ファイル %USERPROFILE%\.wslconfig

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

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

[wsl2]
memory=2G
swap=0

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

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

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

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

ファイル /etc/wsl.conf

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

マニュアルによると次の構成を指示できるようだ。今のところ間に合っているので手を付けなくていいだろう。

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

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

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

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

  • ブートを設定する

[automount]
enable = true
root = /mnt/
options = "metadata,uid=1000,gid=1000,umask=22"

利用者ノート

Windows と WSL の結合度を下げるために構成項目を追加的に指定することはあり得る。

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

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

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

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

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

資料