How to Inspect USB Device Trees and Vendor Descriptors in Linux Using lsusb

Troubleshooting external storage drives, flashing embedded microcontroller boards, configuring USB-to-Ethernet network adapters, and diagnosing peripheral recognition failures on Linux requires visibility into the Universal Serial Bus (USB) subsystem. When a connected USB mouse, sound card, or hardware security token fails to initialise, operating systems often provide minimal graphical feedback regarding whether the hardware controller recognized the device.

The lsusb command, included in the standard Linux usbutils package, is the definitive utility for querying the Linux kernel’s USB bus topology. By querying the virtual /dev/bus/usb/ interface, lsusb extracts manufacturer identifiers, product IDs, endpoint transfer speeds, and device descriptor trees directly in the terminal.

Basic USB Bus Enumeration

Running lsusb without arguments displays a summary list of all USB root hubs and attached peripheral devices:

lsusb

Output example:

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 003: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
Bus 002 Device 002: ID 0781:5583 SanDisk Corp. Ultra Fit

Key information components:

  • Bus & Device: The physical bus number and sequential device enumeration index assigned by the kernel.
  • ID (Vendor:Product): The standardized 16-bit hexadecimal Vendor ID (VID) and Product ID (PID) separated by a colon (e.g., 046d:c52b for Logitech). These IDs are essential for writing custom udev rules.
  • Description: Manufacturer name and recognized commercial product designation.

Displaying the Physical USB Device Tree (-t)

Modern motherboards feature complex internal USB hub topologies spanning multiple controller generations (USB 2.0, USB 3.2, and USB4). You can visualize the hierarchical tree topology and negotiated link speeds using the -t flag:

lsusb -t

Output example:

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    |__ Port 3: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M

This view displays negotiated link speeds: 12M (USB 1.1 Full Speed), 480M (USB 2.0 High Speed), 5000M (USB 3.0 5 Gbps), and 10000M (USB 3.1 10 Gbps), immediately revealing if a high-speed SSD is throttled by a legacy port.

Filtering by Specific Device ID (-d)

If you have dozens of USB endpoints and want to isolate a single device:

# Filter by Vendor:Product ID
lsusb -d 046d:c52b

Dumping Verbose Technical Descriptors (-v)

To inspect power consumption, USB class definitions, serial numbers, and endpoint configuration descriptors:

sudo lsusb -v -d 0781:5583

Critical descriptor fields revealed:

  • bMaxPower: Displays maximum electrical current draw in milliamperes (mA), helping diagnose peripheral disconnects caused by insufficient USB port power.
  • iSerial: Displays the hardware serial number of the connected peripheral.
  • bInterfaceClass: Identifies the driver protocol (e.g., Mass Storage, Audio, HID).

Using lsusb gives Linux administrators complete diagnostic clarity when auditing USB peripherals and resolving hardware compatibility issues.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.