はじめに
自宅にあるPCへ接続されているUSBデバイスを、別のPCから使いたいことってありませんか?
例えば、
- 別の部屋にあるPCへ接続したUSBメモリを使いたい
- Raspberry Piや小型PCをUSBデバイスサーバーとして使いたい
- 2Fの温度計にしているArduinoにプログラムを書き込みたい
といったケースです。
私だと、ESP32(マイコンボード)にプログラムを書き込んだりするので、どうしても欲しいなと思ってしまう。
こうした用途では USB/IP という仕組みが使えます。
昔、IO-DATA社が出していたnet.USBが懐かしいですね。これと似ているのですが、net.USBはデバイスサーバーからPCに転送でした。
今回のUSB/IPを使うと、USBデバイスをTCP/IPネットワーク越しにコンピュータから別のコンピュータへ転送し、あたかもローカルUSBポートへ接続されているように扱えます。
つまり PCからPCができる。 で、もちろんデバイス→PCも可能
ただ、WindowsでUSB/IPを使おうとすると、コマンド操作やドライバのセットアップなどが少し分かりにくいところがあります。
そこで今回、Windowsからなるべく簡単にUSB/IPを使えるようにするようにGUIを作ってみました。その名も 「RemoteUSB」
名前のまんまですねw まあわかりやすくていいかも
RemoteUSBとは
RemoteUSBは、USB/IPを利用してUSBデバイスをネットワーク越しに共有・接続するためのWindows向けデスクトップアプリです。
イメージとしては次のような構成です。
USBメモリ
│
▼
Windows PC A
(RemoteUSB / USB Device Server)
│
│ LAN
▼
Windows PC B
(RemoteUSB / USB/IP Client)
│
▼
Windowsから通常のUSBデバイスとして利用
PC Aに物理的に接続されているUSBデバイスをネットワークへ公開し、PC Bから接続します。
USBデバイスの通信そのものをネットワーク越しに転送するため、単なるファイル共有とは少し違います。
例えばUSBメモリであれば、接続先PCからは通常のUSBストレージとして認識されます。
なぜ作ったのか
WindowsでもUSB/IPを利用するためのツール自体はすでに存在します。
代表的なものとして、
- usbipd-win
- usbip-win2
などがあります。
ただし、実際に使おうとするとCLI操作が中心で結構面倒
例えばUSBデバイスを確認する場合、
usbipd list
共有する場合、
usbipd bind --busid 4-2
といったコマンドを利用します。
もちろんCLIに慣れていれば問題ないのですが、
「LAN内の別PCにあるUSB機器をちょっと使いたい」
というような用途であれば、なかなかコマンドで打つのも面倒だし、今時だったらAIにお願いするのが一般的なんでしょうけど、実行するコマンドをいちいち確認するのが面倒だったんです。
で、視覚的に簡単にわかればよいかなという感じで作ってみました。
RemoteUSBを使ってみる
今回はUSBメモリを別PCから接続してみます。
構成はこんな感じです。
PC A
192.168.1.10
USBメモリ接続
↓ LAN
PC B
RemoteUSBから接続
1. サーバー側でUSBデバイスを共有する
まずサーバー側PCへUSBデバイスを接続します。
今回はMicroSDとアダプタを用意して接続しました。 (最近のパソコン MicroSDそのままささらない。。)
で次に、RemoteUSBを起動すると、接続されているUSBデバイスが一覧表示されます。

内部的にはusbipd-winを利用してUSBデバイスをネットワークへ公開しています。

2. 別PCからサーバーへ接続する
次にクライアント側PCでRemoteUSBを起動します。
USBデバイスサーバーとなっているPCのIPアドレスを登録します。
例ですが先ほどのサーバー側のIPは、 192.168.50.7 になっていました。

なので、下記をサーバー登録します。
192.168.50.7
サーバーへ接続すると、共有されているUSBデバイスが表示されます。

3. USBデバイスへ接続する
するとUSB/IP経由でデバイスが接続されます。
今回利用したUSBメモリの場合、Windowsのエクスプローラーにも通常のUSBドライブとして表示されました。

つまり、
USBメモリ
↓
PC A
↓
LAN
↓
PC B
↓
エクスプローラー
という状態になります。
物理的にはPC AへUSBメモリが刺さっていますが、操作しているPC BからはUSBメモリが直接接続されているように見えます。
使い道
個人的には、次のような用途が面白そうだと思っています。
- 自宅サーバーにUSB機器を集約する
- ミニPCをUSBデバイスサーバーにする
- 離れたPCからUSB機器を利用する
- 開発用USBデバイスを複数PCから切り替えて使う
- 仮想マシンやリモート開発環境からUSB機器を利用する
特にホームラボ環境では結構便利そうです。
小型PCへUSB機器をまとめて接続して、
USB Hub
│
├─ USBメモリ
├─ USBシリアル
├─ 開発ボード
└─ その他USB機器
│
▼
Mini PC
│
Ethernet
│
┌───┴────┐
▼ ▼
Desktop Notebook
のようにしておけば、物理的にUSBケーブルを差し替えなくても済みます。
今後について
気が向いたら、Linux版とかラズパイ版も作るかもです。(好評ならですが...)
まとめ
今回はWindowsでUSBデバイスをネットワーク越しに共有するためのアプリ 「RemoteUSB」 を作ってみました。
USB/IP自体は昔から存在する仕組みですが、実際に使ってみるとなかなか面白いですね。
特に、
「USBケーブルをLANケーブルに置き換える」
ような感覚で使えるところがUSB/IPの面白いところだと思います。
RemoteUSBはGitHubで公開しています。
まだ開発途中ですが、USB/IPやRemoteUSBに興味がある方はぜひお試しくださいまし。
パッケージのダウンロードはこちら
なんか久しぶりに記事を書いた気がする...


