USB/IPを使ってWindowsのUSBデバイスをLinuxで使用する

| 4 min read
Author: shigeki-shoji shigeki-shojiの画像

こんにちは、庄司です。

Windows をホストとして Linux 環境を稼働したい場合 Windows Subsystem for Linux (WSL) の登場でとても便利になりました。標準機能を使う場合では、もう1つ Hyper-V を使う方法もあります。筆者は Windows にログインしていなくても起動できる Linux 環境 (Ubuntu 22.04.3 LTS) が欲しくて Hyper-V を使って構築しています。そして、この Ubuntu には "amazon-ssm-agent" をインストールして、AWS System Manager でモニタリングやアップデートできるようにしています。

PC に接続された USB デバイスを利用するためには、WSL、Hyper-V どちらの場合も Microsoft のドキュメント「USB デバイスを接続する」に紹介されている方法を使って接続できます。この記事では WSL 環境で使用するケースが記述されていますが、ここでは、Hyper-V 上の Ubuntu 22.04.3 LTS で利用する方法を紹介します。

Windows 側の準備

#

USB デバイスを接続する」に書かれた手順に従って、Windows に USBIPD-WIN プロジェクトをインストールします。

共有 (share) する USB デバイスを確認しましょう。管理者として PowerShell を実行します。

usbipd list

接続されている USB デバイスの BUSID やデバイス名、状態が表示されます。
次にデバイスを共有するために次のコマンドを実行します。

usbipd bind -b 共有するデバイスのBUSID

再度 usbipd list を実行すると、指定したデバイスの状態が "Shared" に変わっていることが確認できます。

共有をやめたい場合は、usbipd unbind -b デバイスのBUSID を実行します。

筆者環境で実行した例です。

> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-17   0411:01f0  USB 大容量記憶装置                                            Not shared

> usbipd bind -b 1-17

> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-17   0411:01f0  USB 大容量記憶装置                                            Shared

Ubuntu 側

#

Windows で共有されたデバイスをアタッチ (attach) します。

sudo modprobe vhci-hcd
sudo usbip attach -r WindowsのIPアドレス -b デバイスのBUSID
筆者の場合

筆者の環境の場合、usbip を実行するためにいくつか準備が必要でした。そして、前述のドキュメント通りに進めてもうまくいかなかったため、筆者が行った手順を紹介します。

sudo apt install linux-tools-6.2.0-39-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/6.2.0-39-generic 20

デバイスをデタッチ (detach) したい場合は、Windows 側で usbipd detach -b デバイスのBUSID を実行するか、次の手順を実行します。

ポートの確認

#
usbip port

デタッチ

#
usbip detach -p 確認したポート

筆者環境で実行した例です。

アタッチすると、/dev/sdb が認識され、デタッチすると /dev/sdb がなくなることで USB-HDD を認識していることが確認できます。

$ sudo ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3

$ sudo usbip attach -r lachesis.local -b 1-17

$ sudo ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb  /dev/sdb1

$ sudo usbip port
Imported USB devices
====================
Port 08: <Port in Use> at Super Speed(5000Mbps)
       BUFFALO INC. (formerly MelCo., Inc.) : unknown product (0411:01f0)
       2-1 -> usbip://lachesis.local:3240/1-17
           -> remote bus/dev 001/017

$ sudo usbip detach -p 8
usbip: info: Port 8 is now detached!

$ sudo ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3

著者は、iTunes を Windows にインストールしているため、IP アドレスの代わりに Bonjour つまり dns-sd を使って Windows ホスト (lachesis.local) を指定しています。

アタッチした時、lsusb コマンドでも確認できます。

$ sudo lsusb
Bus 002 Device 004: ID 0411:01f0 BUFFALO INC. (formerly MelCo., Inc.) HD-LBU3
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

USB/IP について

#

USB/IP は奈良先端科学技術大学院大学 (NAIST) で開発され、その成果が Linux 2.6.38 のカーネルにマージされたものだそうです。以来 Linux カーネルに入っているため信頼性は高いと考えられます。

性能

#

Windows PC に USB 接続の外付け HDD を接続して、同 PC の Ubuntu でそれをマウントして使用してみました。特に問題なく利用できています。

Wifi 経由で Raspberry Pi に Windows 上の USB-HDD デバイスを接続した場合はさすがに不安定になりました。不安定あるいは低品質のネットワーク経由では問題がありそうです。

おわりに

#

この記事では、Windows PC に接続した USB デバイスの共有を説明しました。Windows - Linux だけでなく、Raspberry Pi のような機器も使った Linux - Linux、あるいは、この記事とは逆の Linux に接続した USB デバイスを Windows で利用もできます。

参考

#

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。