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」を使って、更新をチェックしたほうがいいだろう。
この連載の記事
-
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 - この連載の一覧へ