増えたWindows Subsystem for Linuxのバージョン、またUSBデバイスの接続が可能に
文●塩田紳二 編集● ASCII
2021年11月28日 10時00分
WSLのプレビュー版がMicrosoftストアでも配布開始
そこでバージョンを整理しておく
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での状況を見る
外部ドライブのマウントに関しては、
最後の「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」を追加する。
そしてダブルクオートの後ろに、このパスをいれて最後に区切り文字のコロンを付ける。その後「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を実行すると、デバイスが接続されているのがわかる。
USBデバイスを取り外すには、Win32側のウィンドウで
usbipd wsl detach --busid 6-2
とする。
MicrosoftストアにWSLのプレビュー版が入ったことで、WSLには、大きく4つのバージョンができてしまった。特にWindows 11では、プレビュー版の有り無しで挙動が変わる。安定して利用したいならプレビュー版を入れないほうがいいかもしれない。なお「設定」→「アプリ」でWSLのプレビュー版をアンインストールすれば、少なくとも元のWindows 11に復帰することもできるようだ。
ただし、プレビュー版では、アップデート方法が異なるため、アンインストールしたあと、「wsl.exe --update」を使って、更新をチェックしたほうがいいだろう。
■関連記事