WSL 2にUSBデバイスを接続するには
2021年11月4日、「WSL 2」にUSBデバイスを接続する方法が紹介されています。LinuxディストリビューションからUSBデバイスにアクセス可能に
「WSL 2」上で動作するLinuxディストリビューションからUSBデバイスにアクセスできるようになります。WSL 2に標準搭載された機能ではない
このUSBデバイスのパススルー機能は、現時点で「WSL 2」に標準搭載された機能ではありません。そのためLinuxディストリビューションからUSBデバイスにアクセスできるようにするためには、ユーザーによる事前準備や追加作業が必要になります。
ここではそれらの作業の概要を紹介します。
作業内容の詳細は上記リンク先を参照してください。
事前準備
事前準備です。1.システムの確認
まずシステムが以下のようになっているか確認します。- Windows 11を利用していること
- WSLのアップデートをすべて適用していること
- WSL 2上でLinuxディストリビューションを実行していること
- WSLのLinux kernelのバージョンが5.10.60.1以降になっていること
「4.」の「Linux kernel」のバージョンは、以下のコマンドをLinux上で実行すれば分かります。
uname -a
2.usbipd-winのインストール
以下から最新版の「usbipd-win」をダウンロードし、「Windows」上で「usbipd-win」をインストールします。3.USB/IPツールとハードウェアデータベースのインストール
「Linux」上で「linux-tools-5.4.0-77-generic」パッケージと「hwdata」パッケージをインストールします。「Ubuntu」を利用している場合、以下のコマンドを実行します。
sudo apt install linux-tools-5.4.0-77-generic hwdata
4.sudoersファイルの編集
「root」から「usbip」コマンドを見つけられるように、「/etc/sudoers」ファイルを編集します。「Ubuntu」を利用している場合、まず以下のコマンドを実行します。
sudo visudo
次に「secure_path」の最初に「/usr/lib/linux-tools/5.4.0-77-generic」を追加します。
以下のような記述になります。
Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:(以下略)
以上で準備完了です。
これで「WSL 2」上で動作しているLinuxディストリビューションにUSBデバイスを接続できるようになります。
USBデバイスを接続するには
「WSL 2」上で動作しているLinuxディストリビューションにUSBデバイスを接続します。1.WSL 2の仮想マシンの起動
Linuxディストリビューションを起動し、「WSL 2」の仮想マシンが起動している状態にします。2.USBデバイスの列挙と特定
「Windows」に接続されているUSBデバイスを列挙し、その中からLinuxディストリビューションに接続したいUSBデバイスを特定します。コマンドプロンプトを管理者権限で起動し、以下のコマンドを実行します。
usbipd wsl list
USBデバイスの一覧が表示されるので、Linuxディストリビューションに接続したいUSBデバイスのバスIDを覚えておきます。
3.USBデバイスの接続
続いて以下のコマンドを実行します。
usbipd wsl attach --busid バスID
このコマンド実行後「WSL」で「sudo」コマンドを実行するためにパスワードの入力が促されます。
4.USBデバイスの接続確認
Linuxディストリビューション側で以下のコマンドを実行し、USBデバイスが接続されているか確認します。
lsusb
非rootユーザーから接続されたUSBデバイスにアクセスする場合、udevルールの設定が必要になるケースがあります。
USBデバイスを切断するには
「WSL 2」からUSBデバイスを切断する方法です。以下の2種類の方法があります。
1.物理的にUSBデバイスを切断する
「Windows」に接続されているUSBデバイスを物理的に切断(取り外す)します。2.WSLからUSBデバイスを切断する
コマンドプロンプトを管理者権限で起動し、以下のコマンドを実行します。usbipd wsl detach --busid バスID
動作の仕組み
このUSBデバイスのパススルー機能は「USB/IP protocol」を活用し、「Windows」と「WSL」間で仮想ネットワークインターフェースを介してUSBトラフィックを転送することで実現しています。「USB/IP protocol」の機能は以前から「Linux kernel」に実装されている機能ですが、「WSL」向け「Linux kernel」に行われた修正により、「WSL」でも簡単にこの機能を利用できるようになりました。
1.USB/IPのサポート
「WSL」向け「Linux kernel」で「USB/IP」をサポートする構成オプションが有効になりました。2.usbipd-winによるUSB/IPのサポート
「USB/IP」を介してデバイスを接続する仕組みは「Linux(クライアント)」側にはすでに存在しています。しかし「Windows」側にはこれの対になる「USB/IP」サーバーのサポートがありません。
「usbipd-win」はこの部分を補完します。