このページの本文へ

Windows Info 第413回

Windows Subsystem for Linux(WSL)でUSBデバイスを使う

2024年01月07日 10時00分更新

文● 塩田紳二 編集● ASCII

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

 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-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などを調べることだ。

WSL

手順としては、listサブコマンドでバスID(BUSID)を調べ、bindサブコマンドで共有設定、attachサブコマンドでWSL側に接続を行う。ただし、attachコマンドを実行するとき、WSL側が起動されている必要がある

 対象のデバイスの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デバイスへの対応が柔軟になる可能性がある。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

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

ピックアップ

ASCII.jp RSS2.0 配信中

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