増えたWindows Subsystem for Linuxのバージョン、またUSBデバイスの接続が可能に

文●塩田紳二 編集● ASCII

2021年11月28日 10時00分

WSLのプレビュー版がMicrosoftストアでも配布開始
そこでバージョンを整理しておく

Microsoftストアで公開されているWSLのプレビュー版をインストールすると、wsl.exeコマンドに--versionオプションが使えるようになる。これまでWSL自体のバージョンを表示する機能はなかった

 Windows 11が正式リリースされ、Windows Insider ProgramのDev Channelプレビュー版(以下Dev Channel版と略す)がWindows 11ベースとなった。また、Windows Subsystem for Linux(以下、WSL)のプレビューがMicrosoftストアで開始された。このため、WSLには複数のバージョンが存在することになった。Windows 11正式版以前は、Windows 10の機能アップデートで配付されるWSLとWindows Insider Program版に搭載されているプレビュー版のWSLの2つしかなかった。

 まずは、現状のWSLのバージョンを整理しておこう。以下の表のように4つある。1つ目は、Windows 10に搭載されているもの、2つ目はWindows 11のもの、3つ目はDev Channel版だ。これに対してMicrosoftストアで配付されているプレビュー版は、Windows 11およびDev Channel版にインストールが可能で、現状どちらにインストールしても同じバージョンだが、WSLgだけはバージョンが異なる。

 なお、WSLプレビュー版をインストールすると、wsl.exeコマンドに「--version」オプションが追加され、WSLのバージョンを表示できるようになる。また、Microsoftストアで配付されるバージョンに対応したリリースがGitHubの「Microsoft/WSL」で行なわれている。

 なお、WSLプレビュー版のインストールの有無にかかわらず、WSL用のWin32側プログラムであるwsl.exe、LxssManager.dll、LxssManagerProxyStub.dllのバージョンは、Windowsのバージョンに対応する。これらは、Windowsとともにインストールされているのだと思われる。

 この4つのWSLに関しては、細かい部分を除くと、大きな機能の違いは、以下の表のようになる。表の項目だが、「アップデート」はWSLのアップデート方式を示す。WSLは、WSL2用カーネルをWindows Updateで更新できるようになっているが、WSLプレビュー版を入れると、Microsoftストア経由でのアップデートに変更になるようだ。

 「GPU」は、WSLからのGPU汎用計算機能のサポート。これは、以前にこの連載で扱った。

●Windows 10のWSL2からGPUが使えるようになった
●WSL2にCUDA on WSLをインストールする

 WSLgは、何回か解説している。最新のもののみ示す。

●WindowsでLinux GUIアプリを動かす「WSLg」のWindows 11での状況を見る

 外部ドライブのマウントに関しては、

●WSL2で外部ストレージをマウントできるようになった

 最後の「USB接続」は、Windows 11で新たに対応した機能だ。これについて簡単に解説しておこう。

Windows 11ではWSL2にUSBデバイスを接続可能になった

 Linuxではネットワークを介してUSBデバイスを接続する「USB/IP」があるが、これを使ってWin32側のUSBデバイスをWSL2ディストリビューションに接続する。Windows 11以降のWSLなら対応可能で、WSLのプレビュー版は必要ない。

 このために作られたusbipd-winは、USB/IPのサーバー側をWindows用にしたもので、これにWSL用の改良が加えられている。プロジェクトは、以下のページにある。

●dorssel/usbipd-win: Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2
https://github.com/dorssel/usbipd-win

 USB/IPでは、サーバーとなるusbipd側で指定したUSBデバイスをシステム側から切り離し、ネットワークを介して、他のマシンで実行されているクライアントプログラムのusbipに接続する。usbipは他のマシンでそのUSBデバイスが接続されたようにエミュレーションする。このため、USBバスを流れるパケットデータなどは、ネットワークを介して転送される。

 WSL2側はUbuntuで試してみる。他のWSLディストリビューションでも原理は同じだが、インストールのためのパッケージ管理コマンドやパッケージ名に違いがあることに注意してほしい。まずは、usbipを含むlinux-tools-genericとhwdataをインストールする。

sudo apt update
sudo apt install linux-tools-5.4.0-77-generic hwdata

 linux-toolsには多数のバージョンがあり、必ずしも上記のバージョンでなくても大丈夫なようだが、次の作業で/etc/sudoersにインストール先パスを登録する必要があり、そのパスにバージョン番号が含まれるため、よくわからない場合はこのバージョンで作業していただきたい。

 次に/etc/sudoersを以下のコマンドで修正する。

sudo visudo

 nanoエディタが起動するので、カーソルキーを使い、「Defaults secure_path="……"」の行を修正して、インストールしたlinux-toolsに含まれているusbipコマンドのインストール先パスを「/usr/lib/linux-tools/5.4.0-77-generic」を追加する。

インストールしたlinux-toolsに入っていたusbipコマンドをsudoを使って管理者権限で実行できるようにするには、コマンドのパスを/etc/sudoersに登録する必要がある。それには、専用のvisudoコマンドを使う。実行すると標準ではnanoエディタが起動する。“security_path=”の次のダブルクオートの中に「/usr/lib/linux-tools/5.4.0-77-generic:」を追加する

 そしてダブルクオートの後ろに、このパスをいれて最後に区切り文字のコロンを付ける。その後「Ctrl+X」でnanoエディタを終了する。これでWSL側の準備は完了である。次の作業で再起動が必要なので、exitでWSLを抜けておく。

 Win32側では、GitHubからusbipd-winをダウンロードしてインストールする。インストールには管理者権限が必要で、かつインストール後には、Windowsを再起動する必要がある。

●GitHub usbipd-win msiダウンロード
https://github.com/dorssel/usbipd-win/releases/download/v1.2.0/usbipd-win_1.2.0.msi

 再起動したら、管理者権限でコマンドプロンプトやWindows Terminalを開く。作業はcmd.exeを使ったほうが面倒が少ない。また、接続するUSBデバイスを用意する。すでにWindowsで利用しているものでもかまわないが、WSL側に接続するとWindows側では接続が切れてしまう。

 なおUSB/IPではどのようなUSBデバイスも接続が可能だが、WSL側のLinuxが接続されたデバイスを利用できるようになっている必要がある。そのためには、デバイス制御のソフトウェアなどが必要になることがある。このとき、デーモンを起動して待ち受けするようなソフトウェアは、WSL側で使うのは困難であることに注意したい。

 というのも、WSLでは起動時にデーモンプログラムを起動するsystemdが利用できないからである。たとえば、無線LANやBluetoothの制御ソフトウェアは、Linuxの起動時にデーモンを起動し、これらが接続などの処理をする。しかし、WSLは起動を高速化するため、起動時に登録されたデーモンを起動する仕組みがなく、また、initを他のプログラムに置き換えることが不可能であるため、デーモンなどの登録自体が失敗し、パッケージのインストールが失敗する。

 また、ファイルシステムとして利用するUSBメモリや外付けHDD、カードリーダーのようなデバイスは、usbipを使わずともWSLが標準で持つmount機能(wsl --mount)やdrvfsの機能を使ってWSLに接続可能であり、処理も高速になる。そう考えると、usbipを使って接続するUSBデバイスの種類は限られる。たとえば、USBシリアル接続が必要になるIoT系の開発ボードなどが考えられる。

 今回の評価ではUSBキーボードを使った。ただし、USBデバイスとしての接続は確認できたが、キー入力はできなかった。まずは、デバイスを接続するまえに管理者権限でコンソールやWindows Terminalを開く。PowerShellまたはcmd.exeから、以下のコマンドを実行する。

usbipd wsl list

 これで、接続が可能なUSBデバイスのリストが表示される。次にデバイスを接続して再度同じコマンドを実行し、追加されたものが、接続したデバイスである。そのデバイスを示す行の先頭にあるハイフンでつながれた数字を覚える。これがデバイスの「busid」となる。筆者の環境では6-2が接続したUSBキーボードのbusidだった。

 次にデバイスをWSLディストリビューションに接続する。先にWSLディストリビューションを起動しておき、以下のコマンドを実行する。

lsusb

これで現在接続しているUSBデバイスの一覧が表示される。おそらく2つのデバイス(root hub)が見えているはずだ。

 次に管理者権限で開いたWin32側のウィンドウで、以下のコマンドを実行する。

usbipd wsl attach --busid 6-2 -d Ubuntu

 再度WSL側のウィンドウに戻り、もう一度lsusbを実行すると、デバイスが接続されているのがわかる。

Win32側(左のウィンドウ)でusbipd wsl listコマンドを使ってUSBデバイスの一覧を表示させる。テスト用のUSBキーボードのbusidは6-2である。これを使って「usbipd wsl attach --busid 6-2」を実行すると、デフォルトのWSLディストリビューションであるUbuntuでusbipコマンドが起動され、USBデバイスの接続が行われる。lsusbコマンドで接続中のUSBデバイスの一覧を表示できる

 USBデバイスを取り外すには、Win32側のウィンドウで

usbipd wsl detach --busid 6-2

とする。

 MicrosoftストアにWSLのプレビュー版が入ったことで、WSLには、大きく4つのバージョンができてしまった。特にWindows 11では、プレビュー版の有り無しで挙動が変わる。安定して利用したいならプレビュー版を入れないほうがいいかもしれない。なお「設定」→「アプリ」でWSLのプレビュー版をアンインストールすれば、少なくとも元のWindows 11に復帰することもできるようだ。

 ただし、プレビュー版では、アップデート方法が異なるため、アンインストールしたあと、「wsl.exe --update」を使って、更新をチェックしたほうがいいだろう。

■関連記事