lsusb
は、提供されるカーネルからデータを読み取りますsys
/sys
にマウントされたファイルシステム。具体的には、USBデバイスの関連ディレクトリの場所から。これらのデバイスは異なるPCIバスに接続され、(ほとんど)udevd
によって検出されます。
たとえば、私のコンピューターでは、特定のPCIバスに接続されたUSBデバイスのローカライズの一例です。
/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/
ディレクトリの内容:
% print -l *
4-1:1.0
authorized
avoid_reset_quirk
bcdDevice
bConfigurationValue
bDeviceClass
bDeviceProtocol
bDeviceSubClass
bmAttributes
bMaxPacketSize0
bMaxPower
bNumConfigurations
bNumInterfaces
busnum
configuration
descriptors
dev
devnum
devpath
driver
ep_00
idProduct
idVendor
ltm_capable
maxchild
port
power
quirks
removable
remove
speed
subsystem
uevent
urbnum
version
lsusb
は、このディレクトリの関連ファイルから読み取ります。
lsusb
はlibudevを使用して、表示されるデバイスのリストを取得します。 Libudevは、udevデータベースと/sys
ファイルシステムの検索を組み合わせて使用し、ハードウェア情報を見つけます。
関連するコードリポジトリ:
https://github.com/gregkh/lsusb
http://cgit.freedesktop.org/systemd/systemd/tree/src/libudev
カーネルにはデバイス用のドライバーがあり、カーネルはそれらを追加します。デバイスは、その機能をドライバーまたはBIOSに報告します。それらのいくつかはBIOSによって報告されます。バグのあるBIOSがあり、存在しないファンを報告していたためです。プロセッサが熱くなると、カーネルドライバーは存在しないファンをオンにしようとしました。最後に、ファンをサポートせずにカーネルをコンパイルすることで問題を解決しました。
/sys/devices
をご覧ください。そこにデバイスがあります。デバイスに関する多くの情報をディレクトリとファイルで見つけることができます。カーネルは、デバイスが切断/接続されたときにそれらを動的に作成します。
すみません、私はあなたを助けません!楽しみたい場合:
ldd `which lsusb`
strace lsusb -t
ltrace -l "libudev*" lsusb -t
man
またはinfo
を使用して、各コマンドの少なくとも長い説明(マニュアル全体ではないにしても)を読むことをお勧めします。
簡単な調査の後、lsusbが/var/lib/usbutils/usb.idsに製品名に関連するVID/PIDのリストを保持していることがわかりました。