目的と想定読者
このガイドは、OpenSUSE 系などの Linux クライアント上で USB/IP をインストールし、リモートの USB デバイスを接続・切断する手順を示します。システム管理者やローカルで物理的に接続できない USB デバイスを利用したい開発者が対象です。
重要: 以下の手順は root 権限を前提とします。
前提条件
- サーバー側で USB/IP サービス(usbip)が動作しており、ネットワーク経由でデバイスを共有していること。
- サーバーの IP アドレスを把握していること(例: 192.168.0.100)。
- クライアントとサーバー間のファイアウォールで TCP 3240 ポートが許可されていること(必要に応じてネットワーク管理者に確認)。
クライアントに usbip をインストールする
まずクライアントに usbip をインストールします。サーバーと同様の手順です。
yast2 -i usbip
usbip は既知の USB デバイス一覧(usb.ids)を /usr/share/hwdata に期待しますが、OpenSUSE 11.2 では /usr/share/usbip/usb.ids に置かれているため、シンボリックリンクを作成します。
mkdir /usr/share/hwdata
ln -sf /usr/share/usbip/usb.ids /usr/share/hwdata/
次に vhci-hcd カーネルモジュールを読み込みます。
modprobe vhci-hcd
読み込みが成功したか確認します。
lsmod | grep vhci_hcd
期待される出力例(環境により数字やモジュール名の順序は異なる場合があります):
client1:~ # lsmod | grep vhci_hcd
vhci_hcd 26576 0
usbip_common_mod 25232 1 vhci_hcd
client1:~ #
起動時に自動でモジュールを読み込む設定
再起動時にも自動でモジュールを読み込むには /etc/sysconfig/kernel の MODULES_LOADED_ON_BOOT 行に追加します。エディタで開きます。
vi /etc/sysconfig/kernel
ファイルの該当部(例):
[...]
## Type: string
## ServiceRestart: boot.loadmodules
#
# This variable contains the list of modules to be loaded
# once the main filesystem is active
# You will find a few default modules for hardware which
# can not be detected automatically.
#
MODULES_LOADED_ON_BOOT="vhci-hcd"
[...]
設定変更後は SuSEconfig を実行します。
SuSEconfig
サーバーに接続して利用可能な USB デバイスを一覧表示する
サーバー(例: 192.168.0.100)に接続して利用可能なリモート USB デバイスを一覧表示します。
usbip -l 192.168.0.100
出力例(SanDisk の USB メモリが見つかる場面):
client1:~ # usbip -l 192.168.0.100
- 192.168.0.100
2-5: SanDisk Corp. : Cruzer Micro 256/512MB Flash Drive (0781:5151)
: /sys/devices/pci0000:00/0000:00:04.1/usb2/2-5
: (Defined at Interface level) (00/00/00)
: 0 - Mass Storage / SCSI / Bulk (Zip) (08/06/50)
client1:~ #
BUSID(例: 2-5)をメモしておきます。
リモート USB デバイスをクライアントにアタッチする
特定のデバイスをクライアントにアタッチ(接続)します。BUSID を指定して実行します。
usbip -a 192.168.0.100 2-5
実行例出力:
client1:~ # usbip -a 192.168.0.100 2-5
8 ports available
port 0 attached
client1:~ #
アタッチ後、lsusb でローカル接続されたように見えるか確認します。
lsusb
出力例:
client1:~ # lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0781:5151 SanDisk Corp. Cruzer Micro Flash Drive
client1:~ #
この状態で、リモート USB デバイスをローカルと同様にマウント、フォーマット、読み書きできます。
リモート USB デバイスの切断
クライアント側で使用をやめるときはデタッチします。まずポート情報を確認します。
usbip --port
出力例(ポート 00 が使用中):
client1:~ # usbip --port
8 ports available
Port 00: at High Speed(480Mbps)
SanDisk Corp. : Cruzer Micro 256/512MB Flash Drive (0781:5151)
1-1 -> usbip://192.168.0.100:3240/2-5 (remote devid 00020002 (bus/dev 002/002))
1-1:1.0 used by usb-storage
/sys/devices/platform/vhci_hcd/usb1/1-1/1-1:1.0/host4/scsi_host/host4/device
Port 01:
Port 02:
Port 03:
Port 04:
Port 05:
Port 06:
Port 07:
client1:~ #
ポート番号を指定してデタッチします(例: 00)。
usbip -d 00
実行例:
client1:~ # usbip -d 00
8 ports available
port 0 detached
client1:~ #
デタッチ後、lsusb に表示されなくなることを確認します。
client1:~ # lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
client1:~ #
サーバー側での再バインド(サーバー上でデバイスをローカルに戻す)
サーバー側では BUSID(例: 2-5)を指定してデバイスをローカルにバインドし、ネットワーク経由で利用できないようにできます(–other オプションを使用)。
サーバーで実行:
bind_driver --other 2-5
出力例:
server1:~ # bind_driver --other 2-5
(process:3484): DEBUG: write "del 2-5" to /sys/bus/usb/drivers/usbip/match_busid
Message: bind 2-5 to other drivers than usbip, complete!
server1:~#
この操作によりクライアント側ではデバイスが見えなくなります。
よくある問題とトラブルシューティング
- デバイスが一覧に出ない
- サーバー側で usbip が起動しているか確認する(プロセス、ログ)。
- サーバー IP やネットワーク接続を再確認する。
- ファイアウォールで TCP ポート 3240 が許可されているか確認する。
- modprobe しても vhci-hcd が見えない
- カーネルバージョンやカーネルモジュール名を確認する。
- カーネルヘッダや必要なパッケージがインストールされているか確認する。
- アタッチできない/ポートが足りない
- 別の client から既に同じデバイスが使用されていないか確認する。
- usbip –port でポート状態を確認し、不要な接続を切断する。
重要: ネットワーク経由でストレージデバイスを使用する場合、データ整合性とパフォーマンスに注意してください。並列アクセスや不意な切断はデータ損失の原因になります。
管理者向けチェックリスト
- サーバーの usbip デーモンが稼働している
- サーバー IP と BUSID を取得済み
- クライアントで usbip パッケージがインストール済み
- vhci-hcd モジュールを読み込んでいる
- ファイアウォールで TCP/3240 を開放済み
- 使用後に安全にデタッチしてからサーバー側で再バインドする
ミニ手順(速習用)
- クライアントにインストール: yast2 -i usbip
- シンボリックリンク作成(OpenSUSE の場合)
- modprobe vhci-hcd
- usbip -l
でデバイス確認 - usbip -a
でアタッチ - 使用後に usbip -d
でデタッチ - サーバーで bind_driver –other
を実行
コマンド チートシート
- インストール: yast2 -i usbip
- モジュール読み込み: modprobe vhci-hcd
- モジュール確認: lsmod | grep vhci_hcd
- 起動時設定編集: vi /etc/sysconfig/kernel
- サーバー一覧表示: usbip -l
- アタッチ: usbip -a
- ポート一覧: usbip –port
- デタッチ: usbip -d
- サーバーでローカルにバインド: bind_driver –other
1行用語集
- BUSID: サーバー上の USB デバイス識別子(例: 2-5)。
- vhci-hcd: クライアント側の仮想 USB ホストコントローラドライバ。これによりリモート USB がローカルに見える。
まとめ
- クライアントで usbip をインストールし、vhci-hcd を読み込めばリモート USB をローカルと同じように扱えます。
- 利用後は必ずデタッチしてサーバー側で再バインドしておくことで安全に管理できます。
- ネットワークとファイアウォールの設定、ファイルシステムの整合性に注意してください。
参考リンク
- USB/IP Project: http://usbip.sourceforge.net/
- OpenSUSE: http://www.opensuse.org/