• Windows Subsystem for Linuxガイド 第27回 USBデバイスをWSLで使う - その1

WSL2は、仮想マシン内で動作しているため、Win32側のデバイスに直接アクセスすることはできない。しかし、TCP/IPでUSBデバイスを接続するusbipd-winを使うことで、WSLからWin32側に接続しているUSBデバイスを利用することが可能だ。

ただし、いくつかの制限がある。USBデバイスの接続は排他的でWSL側に接続したUSBデバイスは、その間Win32側では利用できない。もう1つは、WSL固有の特徴として、標準状態ではUSBシリアルデバイスなど特定のクラスのUSBデバイスしか利用できないことである(後述)。

こうした制限があっても、たとえば、組み込み系の開発ボードなどを接続し、Linux側で開発を行うことが可能だ。最近では、多くの組み込み系開発ボードの開発環境がWindowsで動くため、必ずしもLinuxを使う必要はないが、「手慣れた環境を使いたい」、「Linuxのツールを使いたい」といった場合、Linux専用マシンを用意するよりは、手軽でかつ、Windows側の連携も簡単になる。

今回は、こうした用途を想定して、WSL2にUSBデバイスを接続する方法を解説する。

usbipd-winとは?

usbipd-winは、USB/IPを利用して、Win32とWSL2間でのUSBデバイス共有を実現したものだ。USB/IPは、IPネットワークの上でUSBデバイスを共有するための仕組みだ。

USBは、コントローラーやデバイスクラスなどが仕様として定義されており、ほとんどのオペレーティングシステムは、その仕様に準じてUSBを扱う。ホストコントローラーも抽象化されており、USBデバイスのアクセスや制御は「メッセージ」を介して行う。このメッセージをTCP/IPによりコンピューター間で転送できるようしたものがUSB/IPである(図01)。

  • 図01: USB/IPは、デバイスを提供するサーバー側と利用するクライアント側で、USBホストコントローラーとやりとりするUSB Request情報をTCP/IPで転送する(図の赤線部分)。
    Hirofuchi, Takahiro et al. “USB/IP - A Peripheral Bus Extension for Device Sharing over IP Network (Awarded FREENIX Track Best Paper Award!).” USENIX Annual Technical Conference, FREENIX Track (2005).より引用

USB/IPには、LinuxとWindowsの実装がある。Linuxに関しては、Linux Ver.3.17以降に取り込まれており、ほとんどのLinuxディストリビューションで利用が可能だ。Windowsの実装もオープンソース・プロジェクトで行われている(詳細はUSB/IPのページを参照)。

usbipd-winは、USB/IPのWindows実装をベースにWSL向けの機能を追加したものだ。Windows版USB/IPの機能に加え、WSL用のコマンドを追加している。

ただし、usbipd-winは、サーバー側(USBデバイスの提供元)のみの実装である。“usbipd”の末尾の“d”は、Unix/Linux系のデーモンを意味する。デーモンは、Windowsの「サービス」と同じく、メモリに常駐して、さまざまな機能を提供するプログラムのことである。逆に、この“d”がないものは、クライアント側プログラムの名前になることが多い。

WSL2のカーネルは、標準のLinuxカーネルとは異なり、かつ仮想マシン内で動作しているため、デバイス関連の挙動は標準的なLinuxとは異なる。このためUSBデバイスがWSL側で認識されたとしても、利用できないこともある。たとえば、USBキーボードやマウスは、usbipd-winを使うことで接続が可能で認識もされるが、キー入力やマウス操作は行えない。

USB大容量ストレージデバイスなど、WSLのLinuxカーネルでサポートされていない、一部のデバイスクラスに関しては、WSLのLinuxカーネルの構成を変更してコンパイルすることで、デバイスドライバを組み込むことが可能である。これについては回を改めて解説する。

usbipd-winの準備

ここでは、usbipd-winのWSL関連機能の使い方を解説し、USB/IPについては解説しない(ただし概念的にはかけ離れているものではない)。

usbipd-winを使うには、


Win32側にusbipd-winをインストール
WSL側に必要なパッケージをインストール

することが必要になる。

usbipd-winの原稿執筆時点の最新版はVer.3.2.0である(2023年9月11日リリース)。評価はWindows 11 Ver.23H2の上でこのバージョンのusbipd-winを使っておこなった。また、WSLは、バージョン1.2.5.0を利用した。

WSLディストリビューションにはUbuntu(22.04.3 LTS)で、を使った。ディストリビューションではsystemdを有効にしておくほうがよい。systemdに関しては、過去記事(第18回 systemd 基本編)を参照してほしい。

インストールは、wingetを使い、


winget install usbipd

とするか、あるいはusbipd-winのmsiファイルをダウンロードして行う。

WSL側では、インストール前にディストリビューションの状態を最新にしておく。


sudo apt update
sudo apt upgrade -y

その後、“linux-tools-virtual”と“hwdata”パッケージをインストールし、/usr/local/bin/usbipコマンドを差し替える(リンク先を変更)。


sudo apt install linux-tools-virtual hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20

これで基本的な準備は完了である。

usbipd-winのインストールが完了したので、次回は、具体的に組み込み系の開発ボードなどを接続して開発環境を動かして、使い方などを解説する。

Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/