WSLへのUSBデバイス接続に関しては、機能が搭載された2021年の記事(「増えたWindows Subsystem for Linuxのバージョン、またUSBデバイスの接続が可能に」)でも紹介したが、Win32側で動作させるusbipd-winとWSLの両方がアップデートされて、状況が変わってきた。
本記事ではusbipd-winを使ったUSBデバイスのWSLへの接続を解説する。利用できるUSBデバイスに関しては、WSLカーネルに組み込まれたデバイスドライバに依存する。標準状態で利用できるのはUSBシリアルなど限定されたものになる。ただし、カーネルを再コンパイルして、デバイスドライバを組み込むことで、利用可能になるもの(たとえば、USB大容量ストレージデバイスなど)もある。
現在、WSL用カーネルのプレビューでは、外部デバイスドライバを含むカーネルモジュール(mod)への対応が進んでいる。WSLがカーネルモジュールに対応すれば、デバイスドライバを組み込むのに再コンパイルをする必要がなくなる可能性がある。
そもそもusbipd-winとは?
usbipd-winとは、TCP/IPネットワーク経由でUSBデバイスを接続させる「USB/IP Project」プロジェクト(https://usbip.sourceforge.net/)をベースとして、WSL側にUSBデバイスを接続するためのソフトウェア(および開発プロジェクト)である。
USB/IPは、USBデバイスが接続されているサーバー側でusbipdを動かし、USBデバイスを利用する側でクライアントプログラムを動かす。通常のUSB/IPは公式サイト経由で入手が可能だ。これに対してusbipd-winは、WSLとWin32側のデバイス接続のために作られたもの。Win32側で動かすことで、USBデバイスをWSL側に接続できる。ただし、WSL側に接続している間は、Win32側では該当のUSBデバイスにはアクセスできない。
昨年12月にVer.4.0.0が公開され、設定やコマンド体系などが一新された。以前とはコマンドも大きく変わっているほか、設定方法などにも変更がある。特にWSL側は、手作業による設定が不要となり、準備は大幅に簡略化されている。
まずはWSLとLinuxを最新版にする
usbipd-winを使うには、最新のWSLにアップデートしておく必要がある。現在WSLは、Microsoftストア経由でアップデートされるので、すでに最新になっているとは思われるが、確認方法とアップデート方法などを説明しておく。
PowerShellなどで以下のコマンドを実行する。
wsl.exe --update
wsl.exe --version
2行目のコマンドでWSLのバージョンが表示される。安定版の最新はVer.2.0.14.0、プレビュー版はVer.2.0.15.0だ。
次にusbipd-winをインストールする。GitHubのプロジェクトページ(https://github.com/dorssel/usbipd-win/releases)からmsiファイルをダウンロードして手動インストールしてもいいし、以下のコマンドでインストールしてもいい。
winget install usbipd-win
次にディストリビューションを最新状態にしておく。というのも、USB/IP側のモジュールはすでに組み込まれた状態なので、これを最新版にしておく必要があるからだ。WSLディストリビューション(ここではUbuntuを仮定)を起動して、以下のコマンドにより更新する。
sudo apt update
sudo apt upgrade -y
usbipd-winの使い方
以下の表は、usbipd-winのWSL用のサブコマンドとオプションである。
usbipd-winでは、usbipd.exeを使って、
usbipd.exe␣サブコマンド␣[オプション]
という形式で使う。もちろん、「usbipd.exe --help」でサブコマンド全般のオンラインヘルプを表示できる。
基本的な手順としては、
1. 接続可能てUSBデバイスを調べる(listサブコマンド)
2. USBデバイスを共有可能状態にする(bindサブコマンド)
3. USBデバイスをWSL側に接続する(attachサブコマンド)
4. (WSL側で利用)
5. USBデバイスをWSLから切断する(detachサブコマンド)
6. USBデバイスの共有を解除(unbindサブコマンド。オプション)
となる。
最初に必要なのは、
usbipd list
で、USBデバイスとそのBUSIDなどを調べることだ。
対象のデバイスのBUSIDが判明すれば、bindサブコマンドでこれを共有可能な状態にする。ただし、このコマンドには管理者権限が必要なので、コンソールを管理者として起動するか、PowerShellのStart-Processを使い
Start-Process usbipd.exe "bind --busid <BUSID>" -Verb runas
とする。なお、<BUSID>は、listサブコマンドで調べたUSBデバイスのバスIDである。
この時点では、まだ、バスIDで指定したUSBデバイスはWin32側からアクセスが可能である。実際にWSL側に接続を行うには、WSLを起動したのち、
usbipd.exe attach --wsl --busid <BUSID>
とする。Linux側で接続しているUSBデバイスを調べるには、lsusbコマンドが利用できる。
なお、このattachサブコマンドに自動接続オプション(--auto)を付けると、自動再接続を試みる。たとえば、対象のUSBデバイスを外して、すぐに装着したような場合、自動的にattachサブコマンドが実行される。
WSLから切断するには、
usbipd.exe detach --busid <BUSID>
とする。
この状態では、Win32側でUSBデバイスにアクセス可能なので、必ずしもunbindサブコマンドを使って共有を解除する必要はない。また、1回共有を設定すると、Windowsを再起動しても共有されたままである。
WSL1は、同じWindowsカーネルを使っていたためUSBデバイスにアクセスできたが、WSL2では、usbipd-winでUSBデバイスを扱うようになった。冒頭にも記したようににプレビュー中のWSL用Linuxカーネルでは、カーネルモジュールへの対応が進んでおり、USBデバイスへの対応が柔軟になる可能性がある。
この連載の記事
-
第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に変換するのが早道 - この連載の一覧へ