このページの本文へ

前へ 1 2 次へ

Windows Info 第303回

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

2021年11月28日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

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」を使って、更新をチェックしたほうがいいだろう。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン