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)实测通过。
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 内核枚举与热插拔日志 设备插入失败的排障第一现场 lspci PCI 层(控制器) 顺着「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(本文不展开)。
六、参考链接
- lsusb(8) 手册页:https://man7.org/linux/man-pages/man8/lsusb.8.html
- usbutils 项目主页:https://github.com/gregkh/usbutils
- libusb 项目主页(枚举与描述符机制):https://libusb.info/
- Ubuntu usbutils 包详情页:https://packages.ubuntu.com/jammy/usbutils
- Linux USB 子系统文档(内核侧 sysfs 布局):https://docs.kernel.org/usb/index.html
- USB-IF 官方厂商 ID 查询(vendor/product 数据库):http://www.linux-usb.org/usb-ids.html