USBトラフィックをwiresharkで見る
http://wiki.wireshark.org/CaptureSetup/USB
- DEBUG_FSとUSB_MONを有効にしたカーネルを準備する(make menuconfigして、『/』→DEBUG_FSのようにすればメニュー的な場所がわかる)
- 適当にマウント等する
- libpcapをCVSからビルドする
- wiresharkをそっちのlibpcapを使うようにビルドする
portageのと競合するのが面倒だったので、libpcapを--prefix=/opt/pcap/で作り、wiresharkを--with-pcap=/opt/pcap --prefix=/opt/pcapとして作った。wiresharkをLD_LIBRARY_PATHに/opt/pcap/libを含めた状態で、/opt/pcap/bin/wiresharkと直接起動してやれば良い。(不安ならldd /opt/pcap/bin/wiresharkとして確かめる)
もっとも、USBのトラフィックをまったくデコードしてくれないみたいなのであまり有り難みが無い。。/usr/src/linux/Documentation/usb/usbmon.txtを参照のこと。
USBとバス番号の対応
複雑。PC本体のUSBポートごとに一つ一つ番号が付いていると考えれば良いが、直接USB1.1デバイスを挿した場合は、担当するコンパニオンコントローラごとに一つのバスを消費する。
このため、同じUSBポートにデバイスを挿してもUSB2.0(Hi-Speed)のデバイスとUSB1.1(Full or Low-Speed)のデバイスで出現する場所が代わるという現象が起こる*1。USB2.0のコントローラ(EHCI)は、速度変換機能を持つかわりにUSB1のコントローラをコンパニオンコントローラとして内蔵し、それぞれの接続ごとに切り替えられるようになっている。
USB2のハブを遠したときは、バス的にはUSB2側に見える。この場合は速度変換はハブが担当するため。
もし、あるデバイスのデータをキャプチャしたいと考えた場合、そのデバイスがHi-Speedデバイスであれば、他のデバイスとハブを共有せずに接続すれば良い。ハブでPC側のポートを共有してしまうと他のデバイスと出力が混じってしまう。この場合でもアドレスはユニークなので簡単にフィルタできるが。。
USB1.1デバイスの場合は話が複雑になる。USBカードを増設するのが手っ取り早いが、他のデバイスをUSB2のハブに移動し、観察したいUSB1.1デバイスを直接PCに挿せばおそらく上手くいく。もちろん、PC側のポートはUSB2でなければならない。
これらの対策をするよりもユーザ側でフィルタしたほうが簡単かもしれない。