Ubuntuで複数のUSBカメラやシリアルセンサーを接続して開発していると、「どのデバイスがどのポートに繋がっているのか」の判別が非常に面倒になります。 /dev/ttyUSB0 や video0 といった名称は、起動順序や差し込みタイミングで変わってしまう可能性があるため、確実な特定方法をマスターしておくことが重要です。
以下に、基本から一歩踏み込んだデバッグ手法までをまとめました。
(ubuntu 22.04とubuntu 24.04で検証しています。)
1. 基本中の基本:lsusb コマンド
最も一般的で、接続されているデバイスの概要を素早く把握するのに適しています。
単純な一覧表示
lsusb出力例:Bus 001 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver
バス番号、デバイス番号、ベンダーID:プロダクトID、デバイス名が表示されます。
詳細情報の表示
sudo lsusb -v消費電力(MaxPower)やエンドポイントの構成など、デバイスの内部設計に関わる詳細な記述子(Descriptor)を確認できます。情報量が非常に多いため、特定の項目(例:シリアル番号)を探す場合は grep と併用するのが一般的です。sudo lsusb -v を叩くと数百行のテキストが出てきますが、デバッグや開発でチェックすべきポイントは実は限られています。
忙しい人のための「ここだけチェック」3選
- 機能と通信間隔 (
bInterfaceClass,bInterval): そのデバイスが「何」として認識され、どれくらいの頻度(ミリ秒単位)でデータが飛んでくるか。 - ID情報 (
idVendor,idProduct): どのメーカーのどの製品か(ドライバの紐付け用)。 - 電力消費 (
MaxPower): デバイスが要求する電流量。ハブ経由でセンサーが不安定な時はまずここを見る。
keyboardの例で解説したら長くなったので、詳しくはkeyboardのlsusb -v を解析してみる セクションにて紹介しています。
2. 物理的な接続構造を追う:lsusb -t
「どの物理ポートがどの内部ハブに繋がっているか」というトポロジ(階層構造)を確認するのに使えます。
lsusb -t- 見方:
Class=root_hub, Driver=xhci_hcd/4p, 5000Mのようにツリー形式で表示されます。 - メリット: デバイスが USB 2.0 (480M) か 3.0/3.1 (5000M/10000M) のどちらのモードで動作しているかが一目で分かります。「3.0のポートに刺したはずなのに速度が出ない」といったトラブルシューティングに役立ちます。
3. 抜き差しをリアルタイムで追う:dmesg
「今刺したデバイスを、カーネルがどう認識したか」を確認するデバッグに使えます。抜き差しを動的に見れて、macアドレスなども見れるので接続チェックには便利です。
sudo dmesg -wH- 活用シーン:
-w(follow)オプションでログをリアルタイム監視し、デバイスを接続します。末尾にNew USB device foundや、割り当てられたデバイス名(/dev/ttyUSB0や/dev/sdbなど)が表示されます。 - 注目ポイント:
-Hを付けるとタイムスタンプが読みやすくなる

実行例 キーマウを抜き差しした実行例
4. デバイスファイルとの紐付けを固定する
開発者が最も知りたい「この物理ポートのデバイスは /dev/ のどこにいるのか?」を確実に調べる方法です。
シリアルデバイスのパス確認
/dev/ttyUSB0 などの名前は不安定ですが、以下のディレクトリを確認すると、物理的な接続場所(path)や製品固有のID(id)に基づいたシンボリックリンクが見つかります。
# 製品固有のIDで探す(同じ製品を複数繋ぐと重複するので注意)
ls -l /dev/serial/by-id/
# 物理的な接続ポートで探す(ポートを固定したい場合に最適)
ls -l /dev/serial/by-path/これにより、プログラム側で /dev/serial/by-path/pci-0000:00:14.0-usb-0:1:1.0-port0 のように指定すれば、再起動しても常に同じ物理ポートのデバイスを叩くことができます。
5. カーネルの生データに触れる:/sysfs
Rustなどの言語で独自のシステムツールを作る際の「データソース」となる場所です。Linuxカーネルは、USBデバイスの情報を /sys/bus/usb/devices/ 以下にディレクトリとして書き出しています。
ls /sys/bus/usb/devices/ここには 1-1, 1-1.2, usb1 といった名前のディレクトリが並んでおり、中にあるファイルを cat することで情報を直接取得できます。
# 例なのでパスはPCのマザボのポート構成によります。
cat /sys/bus/usb/devices/1-1/product # 製品名
cat /sys/bus/usb/devices/1-1/idVendor # ベンダーID
cat /sys/bus/usb/devices/1-1/speed # 転送速度コマンドの実行結果をパースするよりも、これらファイルを直接読み込むほうがオーバーヘッドが少なく、プログラムからは非常に扱いやすい形式です。
(詳細確認)lsusbでKeyboardの詳細を見てみる
実際に手元のキーボード(Logitech製)を sudo 権限で確認した際のログをベースに、構造を整理しました。
1. Device Descriptor(デバイスの身分証明書)
idVendor 0x046d Logitech, Inc.
idProduct 0xc34b USB Keyboard
iManufacturer 1 Logitech
iProduct 2 USB Keyboardここにはデバイスの製造元や製品名が入ります。自作デバイスや特殊なセンサーを繋いだ際、OSが正しく認識しているかを確認する第一歩です。
2. Configuration Descriptor(動作条件と電力)
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 90mAMaxPower は非常に重要です。このキーボードは90mA要求していますが、USBカメラなどは500mA近く要求することもあります。複数のセンサーを1つのハブに繋ぐ際、ここの合計値がハブやPCの給電能力を超えないように注意が必要です。
3. Interface Descriptor(機能の定義)
bInterfaceNumber 0
bInterfaceClass 3 Human Interface Device
bInterfaceProtocol 1 Keyboard
1つのUSBコネクタの中に、複数の「機能」が同居していることがあります。この例では bInterfaceNumber 0 が「キーボード機能(Protocol 1)」として定義されています。もし複合デバイス(マイク付きカメラなど)なら、ここに複数の Interface が並びます。
4. Endpoint Descriptor(通信の蛇口)
bEndpointAddress 0x81 EP 1 IN
Transfer Type Interrupt
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10データの通り道の設定です。
- Transfer Type (Interrupt): キーボードなので「割り込み通信(必要な時だけ送る)」になっています。
- bInterval (10): データの監視間隔です。この値が小さいほど、OSがデバイスを頻繁にチェック(ポーリング)します。
まとめ
- 概要を知るなら
lsusb - 接続ミスを疑うなら
lsusb -t - 刺した瞬間を追うなら
dmesg -w - コードからポートを固定するなら
/dev/serial/by-path/ - 自作ツールに組み込むなら
/sys/
これらを使い分けることで、複雑なUSBデバイス構成でも迷わず制御できるようになります。個人的備忘録の側面が強いのでもっと便利な方法があるかもしれませんが、一般的なusbの接続等に係る情報が知りたいならここで示した方法で大体事足りると思います。
ここまで読んでいただきありがとうございます。このサイトでは、ubuntuのターミナル基本操作を動かせることを念頭に初心者から中級者になれるようなシラバスでまとめているLinuxコマンド入門ロードマップをまとめています。興味があれば覗いてみてみてください。
では、次の記事で。 lumenHero
関連記事・ページ
linuxAcademy: Linuxの操作や小ネタをまとめています
【Linuxコマンド入門 第3部・完】システム管理とネットワーク基礎 逆引きリファレンス 【Linuxコマンド入門 Part3-13】
Linuxコマンド入門シリーズPart3、全17回の総まとめ記事です。システムの状態チェック(ps,topなど)の復習、ネットワークの接続チェックの方法の復習、機能別の逆引きに利用してください。