lsusb 命令详解与参数实测(Ubuntu 22.04)

lsusb 命令逐参数实测详解:4 台 USB 设备清单逐条解读、-t 总线拓扑树(端口速率与驱动)、-v 描述符详解(设备/配置/接口/HID/端点逐段解读与截断策略)、-s 与 -d 两种维度筛选、-D 设备节点直查、-V 版本,并解析 sysfs/libusb 枚举机制与 Couldn't open device 告警的成因,全部回显在 Ubuntu 22.04(usbutils 014)实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行系统信息2026/10/15

lsusb 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 lsusb 的每一个常用参数——默认设备清单逐条解读、-t 总线拓扑树(速度与驱动)、-v 描述符详解、-s 总线:设备号筛选、-d 厂商:产品 ID 筛选、-D 指定设备节点、-V 版本,并解析 sysfs/libusb 的设备可见性机制与 Couldn't open device 告警的来龙去脉,全部命令与回显已在 Ubuntu 22.04(usbutils 014)实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64,内核 6.8.0-138-generic)
  • lsusb 版本:usbutils 014(lsusb -V 实测;包 usbutils 1:014-1build1,依赖 libusb-1.0-0 2:1.0.25-1ubuntu2)
  • lsusb 不随最小化安装预装,需安装 usbutils 包(见 2.2)
  • 实测机 USB 形态:2 条 USB 总线(Bus 01 UHCI 1.1 控制器、Bus 02 EHCI 2.0 控制器),4 台设备(2 个根集线器 + 1 个虚拟集线器 + 1 个虚拟鼠标),数据经 sysfs(/sys/bus/usb/devices)枚举
  • 演示数据目录:/root/demo/lsusb/(存放默认清单与总线树快照)

二、命令概览

2.1 语法与测试数据准备

lsusb(list USB)的基本语法是 lsusb [options]...:不带参数时逐行列出 USB 总线上全部设备,格式为"总线号 设备号: ID 厂商:产品 厂商名 产品名"。它的枚举由 libusb 完成——在 Linux 上 libusb 经 libudev 读取 /sys/bus/usb/devices 下的设备属性(busnum、devnum、设备描述符等),因此默认清单、-t 树、-s/-d 筛选都来自 sysfs;而更深的描述符读取(完整 -v、-D)还需要打开设备节点 /dev/bus/usb/BBB/DDD,这一步在部分精简环境中会受限(见 3.4 与第五章 Q3)。

lsusb 的输出完全跟随内核枚举到的真实 USB 设备,无法用文件模拟,本篇仅把清单与总线树存档备查:

mkdir -p /root/demo/lsusb
lsusb > /root/demo/lsusb/usb-list.txt
lsusb -t > /root/demo/lsusb/usb-tree.txt

💡 技术拓展:USB 设备的查看与排查命令不止 lsusb,信息粒度从「人读清单」到「内核日志」逐级递进——

命令信息层次典型用途
lsusb枚举清单(ID + 名称)快速确认设备是否被内核识别
lsusb -t总线拓扑树(速率 + 驱动)核对 USB 速率与绑定的内核驱动
usb-devices每设备完整属性文本脚本化采集厂商/产品/序列号
dmesg内核枚举与热插拔日志设备插入失败的排障第一现场
lspciPCI 层(控制器)顺着「USB 控制器→设备」定位根端口

本文主角 lsusb 是 USB 排障的入口命令,-t 与 -v 的分层用法见 3.2 与 3.4 节;内核侧日志配合 dmesg(另篇详解)使用。

2.2 安装(usbutils 包)

Ubuntu 22.04 桌面版通常自带 usbutils;最小化系统需手动安装。先同步软件源索引,再安装(实测输出):

$ apt-get update
Hit:1 http://security.ubuntu.com/ubuntu jammy-security InRelease
Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease
Hit:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
Reading package lists...

首次安装时(实测解包与配置阶段输出,摘取 usbutils 相关行):

Selecting previously unselected package usbutils.
Preparing to unpack .../usbutils_1%3a014-1build1_amd64.deb ...
Unpacking usbutils (1:014-1build1) ...
Setting up libusb-1.0-0:amd64 (2:1.0.25-1ubuntu2) ...
Setting up usbutils (1:014-1build1) ...

两个包各司其职:usbutils 提供 lsusb/usbhid-dump 等命令,libusb-1.0-0 是 USB 设备访问库(lsusb 的枚举与描述符读取都经它完成)。安装完立即验证版本:

$ lsusb -V
lsusb (usbutils) 014

2.3 --help 全量输出

lsusb 的参数面很小,-h/--help 一次性列全(实测原样保留):

$ lsusb -h
Usage: lsusb [options]...
List USB devices
  -v, --verbose
      Increase verbosity (show descriptors)
  -s [[bus]:][devnum]
      Show only devices with specified device and/or
      bus numbers (in decimal)
  -d vendor:[product]
      Show only devices with the specified vendor and
      product ID numbers (in hexadecimal)
  -D device
      Selects which device lsusb will examine
  -t, --tree
      Dump the physical USB device hierarchy as a tree
  -V, --version
      Show version of program
  -h, --help
      Show usage and help

💡 说明:-s 用十进制的总线号/设备号,-d 用十六进制的厂商/产品 ID——帮助文本里 "in decimal" 与 "in hexadecimal" 的区别是初学者最容易踩的坑。-D 直接给设备节点路径,与 -s 互斥使用场景不同(3.5)。

2.4 版本信息

$ lsusb -V
lsusb (usbutils) 014

$ lsusb --version
lsusb (usbutils) 014

三、参数逐项实测

3.1 默认输出:4 台设备逐条解读

不带参数的 lsusb 每行一台设备:Bus 总线 Device 设备号: ID 厂商ID:产品ID 厂商名 产品名:

$ lsusb
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

逐条解读:

  • Bus 002 Device 001:2 号总线的根集线器,挂在其 USB 2.0 EHCI 控制器(对应 PCI 设备 02:03.0,见《lspci 命令详解与参数实测(Ubuntu 22.04)》3.1)下,1d6b:0002 是 Linux 基金会统一的 EHCI 根集线器 ID——根集线器由内核 usbcore 模拟,每条 USB 总线必有且编号恒为 001。
  • Bus 001 Device 003:UHCI 1.1 总线下挂的虚拟集线器(0e0f:0002,VMware 虚拟 USB Hub),为后续端口扩展预留。
  • Bus 001 Device 002:虚拟鼠标(0e0f:0003,VMware Virtual USB Mouse),HID 类设备。
  • Bus 001 Device 001:1 号总线的根集线器(1d6b:0001 为 UHCI/OHCI 1.1 根集线器 ID)。

💡 提示:1d6b(Linux Foundation)与 0e0f(VMware)是厂商 ID;判断一台 USB 设备是"真硬件"还是"平台虚拟设备",看厂商 ID 即可。lsusb | grep -c '^Bus' 可快速统计设备总数。

3.2 -t:总线拓扑树(速度与驱动一目了然)

-t/--tree 以缩进树呈现物理端口层级,每行给出端口号、设备号、设备类、驱动与端口速率:

$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 3, If 0, Class=Hub, Driver=hub/7p, 12M

逐行解读:

  • Bus 02 ... Driver=ehci-pci/6p, 480M:2 号总线根集线器由 ehci-pci 驱动管理,暴露 6 个端口(/6p),链路速率 480M(USB 2.0 High-Speed)。
  • Bus 01 ... Driver=uhci_hcd/2p, 12M:1 号总线根集线器由 uhci_hcd 驱动管理,2 个端口,速率 12M(USB 1.1 Full-Speed)。
  • Port 1: Dev 2 ... Class=Human Interface Device, Driver=usbhid:1 号端口上的设备 2 是 HID 类,由 usbhid 驱动接管——即虚拟鼠标。
  • Port 2: Dev 3 ... Class=Hub, Driver=hub/7p:2 号端口上是通用集线器设备(hub 驱动,7 个下游端口)。

树形视图是判断"设备实际插在哪个口、跑在什么速率、被哪个驱动接管"的最直接依据。把树存档后再查看内容一致:

$ lsusb -t > /root/demo/lsusb/usb-tree.txt && cat /root/demo/lsusb/usb-tree.txt
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 3, If 0, Class=Hub, Driver=hub/7p, 12M

💡 要点:-t 输出的 If 0 是接口号而非设备号——一台 USB 设备可含多个接口(如带麦克风的耳机是 Audio+HID 两个接口),树会按接口分行列出。速率异常(U 盘只跑 12M)通常意味着插在了 USB 2.0 口上或线缆/集线器降速,-t 一眼定位。

3.3 -s / -d:两种维度筛选设备

-s [[bus]:][devnum] 按总线号与设备号(十进制)筛选,三种写法等价或递进——精确匹配、补零等价、按总线筛:

$ lsusb -s 1:2
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse

$ lsusb -s 001:002
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse

$ lsusb -s 2:
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ lsusb -s 1:
Bus 001 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

-d vendor:[product] 按厂商/产品 ID(十六进制)筛选,同样支持通配——只给厂商、给全厂商:产品、以及不存在的 ID(输出为空、退出码仍为 0):

$ lsusb -d 1d6b:
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

$ lsusb -d 0e0f:0003
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse

$ lsusb -d 0e0f:
Bus 001 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse

$ lsusb -d 1234:5678

💡 要点:-s 的编号与 dmesg//dev/bus/usb 里的 Bus/Dev 对应(十进制);-d 的 ID 与 -v 输出里的 idVendor/idProduct 对应(十六进制)。混用进制(如 -s 001:002 里的补零不影响,但 -d 0E0F: 用大写也接受)时以帮助文本的进制声明为准。-d 1234:5678 这类不存在的 ID 只返回空清单,脚本里可用 lsusb -d 0e0f:0003 | wc -l 做"设备是否在线"判断。

3.4 -v:描述符详解(含截断与受限说明)

-v/--verbose 输出每台设备的完整描述符树。实测环境对 usbfs 设备节点打开受限,每台设备先打一行 Couldn't open device, some information will be missing,随后仍给出 sysfs 可得的设备、配置、接口、HID 描述符。以虚拟鼠标为例(实测全文):

$ lsusb -v -s 1:2
Couldn't open device, some information will be missing

Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x0e0f VMware, Inc.
  idProduct          0x0003 Virtual Mouse
  bcdDevice            1.03
  iManufacturer           1 VMware
  iProduct                2 VMware Virtual USB Mouse
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0022
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          1
    bmAttributes         0xc0
      Self Powered
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      2 Mouse
      iInterface              1
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      46
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               1

逐段解读:

  • Device Descriptor(设备描述符,18 字节):USB 规范版本 bcdUSB 1.10、设备类 0(由接口声明类)、端点 0 最大包长 8、厂商/产品 ID 0x0e0f:0x0003、三个字符串索引(厂商/iManufacturer、产品/iProduct、序列号/iSerial=0 表示无序列号)。
  • Configuration Descriptor(配置描述符):wTotalLength 0x0022 即 34 字节的配置+接口+HID+端点总长;bmAttributes 0xc0 表示自供电;MaxPower 0mA 表示不从总线取电(虚拟设备特征)。
  • Interface Descriptor(接口描述符):类 3 = HID、子类 1 = Boot Interface(支持 BIOS 阶段键鼠)、协议 2 = 鼠标。
  • HID Device Descriptor:HID 规范版本、报告描述符长度 46 字节。
  • Report Descriptors: ** UNAVAILABLE **:报告描述符需要打开设备节点后经控制传输读取,本环境打开受限,lsusb 如实标注 UNAVAILABLE——这是 -v 输出中"some information will be missing"的具体所指。
  • Endpoint Descriptor(端点描述符):端点 0x81(EP 1 IN,设备到主机)、中断传输、最大包 8 字节、轮询间隔 1ms——正是鼠标上报移动数据的通道。

不带 -s 的 lsusb -v 对全部 4 台设备逐一输出(约 200 行,含 4 条 open 告警),此处展示首部结构(实测节选,全文按 Bus 002 Device 001 → Bus 001 Device 003 → Bus 001 Device 002 → Bus 001 Device 001 顺序展开):

$ lsusb -v
Couldn't open device, some information will be missing
Couldn't open device, some information will be missing
Couldn't open device, some information will be missing

Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            9 Hub
(输出节选:四台设备依次展开根集线器/集线器/鼠标的完整描述符,全文约 200 行)

💡 提示:-v 输出长且各设备结构同构,实操中总是与 -s 或 -d 组合定位单台设备再细读。字符串索引(iManufacturer/iProduct)展开为文本同样依赖设备打开;根集线器的厂商名 "Linux Foundation" 来自内核内建描述符。

3.5 -D:指定设备节点直接检查

-D device 绕过枚举,直接检查指定设备节点(路径约定 /dev/bus/usb/总线号(3位)/设备号(3位)),输出形态与 -v 相同:

$ lsusb -D /dev/bus/usb/001/002
Couldn't open device, some information will be missing
Device: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
(输出节选:后续为完整的配置/接口/HID/端点描述符,与 3.4 的 -v 输出一致)

节点不存在时直接报错(实测):

$ lsusb -D /nonexistent-node
Cannot open /nonexistent-node

💡 要点:-D 的价值在于可检查"还没被枚举成逻辑设备"的节点或跨主机的节点文件;路径的三位总线号/设备号与 -s 1:2 中的十进制一致(总线 1 设备 2 → /dev/bus/usb/001/002)。

四、实战示例

4.1 确认某 USB 设备是否在线

把 -d 筛选当探测器用:有输出即在线(演示数据见 /root/demo/lsusb/usb-list.txt):

$ lsusb > /root/demo/lsusb/usb-list.txt && wc -l < /root/demo/lsusb/usb-list.txt
4

$ lsusb -d 0e0f:0003
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse

4.2 用总线树核对速率与驱动

排查"移动硬盘为什么只有 12M"这类问题时,-t 直接给出端口速率与驱动:

$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 3, If 0, Class=Hub, Driver=hub/7p, 12M

4.3 从 lsusb 的 ID 反查 PCI 层的控制器

lsusb 只到设备层;要找设备挂在哪个控制器上,结合 lspci:lsusb -t 显示根集线器驱动为 ehci-pci,据此在 lspci 里定位对应 PCI 设备:

$ lspci -k | grep -A3 'USB controller'
02:00.0 USB controller: VMware USB1.1 UHCI Controller
	DeviceName: usb
	Subsystem: VMware USB1.1 UHCI Controller
	Kernel driver in use: uhci_hcd
--
02:03.0 USB controller: VMware USB2 EHCI Controller
	DeviceName: ehci
	Subsystem: VMware USB2 EHCI Controller
	Kernel driver in use: ehci-pci

uhci_hcd/ehci-pci 两个驱动分别对应 1 号、2 号 USB 总线的根集线器,与 lsusb -t 的 Bus 01/Bus 02 完全对应。

4.4 单台设备的描述符体检

-v 与 -s 组合锁定单台设备后,用 grep 抽取关键字段:产品 ID(型号定位)、MaxPower(供电预算)、iSerial(udev 稳定命名依据)、端点传输类型(中断/批量/同步):

$ lsusb -v -s 1:2 | grep -E 'idProduct|MaxPower|Transfer Type|iSerial'
Couldn't open device, some information will be missing
  idProduct          0x0003 Virtual Mouse
  iSerial                 0 
    MaxPower                0mA
          Transfer Type            Interrupt

首行告警来自 stderr 一并进入管道(实测保留);iSerial 为 0 表示该设备无序列号,为它写 udev 规则时只能退回端口路径(KERNELS=="1-1" 之类),有稳定序列号的 U 盘则优先用序列号匹配。

4.5 树形快照做前后对比

热插拔前后各存一份 -t 快照,diff 即可定位"新设备插在哪个端口、协商到什么速率":

$ lsusb -t > /root/demo/lsusb/usb-tree.txt && cat /root/demo/lsusb/usb-tree.txt
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 3, If 0, Class=Hub, Driver=hub/7p, 12M

五、注意事项与常见问题

Q1:lsusb 的设备清单从哪来?为什么它和插在机箱上的设备对得上? 枚举数据来自内核 USB 子系统在 sysfs 的呈现:每台设备对应 /sys/bus/usb/devices/ 下一个条目(如 1-1、1-1:1.0),libusb 经 libudev 读取 busnum/devnum 与设备描述符汇总成清单。内核枚举到什么,lsusb 就显示什么——设备可见性完全由内核维护,插入/拔出实时变化,无需重启。

Q2:为什么本机的 -v 会提示 Couldn't open device, some information will be missing,而设备清单和 -t 都正常? lsusb 分两层数据:清单/树/筛选只读 sysfs(无需特权);完整描述符中的报告描述符、字符串、设备级调试信息则需要打开 usbfs 设备节点 /dev/bus/usb/BBB/DDD。实测环境对这类节点的打开动作被访问策略拒绝(打开返回 Operation not permitted),lsusb 因此对每台设备打出该告警并降级输出(报告描述符显示 ** UNAVAILABLE **)。标准服务器上由 udev 自动创建这些节点且默认可读,-v 会给出含报告描述符的完整输出;遇到同类告警时,先检查 /dev/bus/usb/ 是否存在、节点权限(root 可读写)以及是否有安全策略限制设备访问。

Q3:/dev/bus/usb/ 下没有设备节点怎么办? 标准 Ubuntu 服务器由 udev 监听内核 uevent 自动生成 /dev/bus/usb/BBB/DDD(主设备号 189)。极端精简环境(未运行 udev)可手动补节点:从 /sys/bus/usb/devices/1-2/busnum、devnum 读出总线与设备号后,mknod /dev/bus/usb/001/002 c 189 1(次设备号 = (总线号-1)×128 + (设备号-1))。注意:能否打开节点最终取决于系统安全策略,策略不允许时 open 仍会失败。

Q4:lsusb 和 lspci 的 ID 体系为什么不一样? PCI 与 USB 是两套独立的 ID 分配体系:lspci 的 vendor:device(如 8086:100f)是 PCI-SIG 分配的,lsusb 的 vendor:product(如 1d6b:0002)是 USB-IF 分配的,数字不可互查。同一个物理芯片(如 USB 控制器)在 lspci 里是 PCI 设备,它下游枚举出的键鼠/U 盘才是 lsusb 的对象——两层用驱动名(uhci_hcd、ehci-pci)衔接(见 4.3)。

Q5:lsusb、lspci、lshw 怎么分工? 三者覆盖不同总线层级:lspci 看 PCI/PCIe 总线(控制器、网卡、显卡),lsusb 看 USB 总线(键鼠、U 盘、摄像头等外设),lshw 汇总全部总线(含内存条、磁盘、固件)生成超详细硬件报告。日常巡检"少了个设备"先在 lspci/lsusb 对应总线里找,出整机资产清单用 lshw(本文不展开)。

六、参考链接