跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

usbutils:Linux下USB设备查看与调试的完整指南

引言

在Linux系统中,USB设备的管理和调试是系统管理员、开发者和普通用户都经常需要面对的任务。无论是插入一个新买的U盘,连接一台打印机,还是调试一个自定义的嵌入式开发板,我们都需要一套工具来查看系统是否正确识别了这些设备、设备的详细信息是什么、以及当设备出现问题时如何排查。usbutils正是这样一套专门为Linux设计的USB设备管理工具包。本文将对usbutils进行全面的介绍,包括它的组成、安装方法、使用场景以及背后的工作原理。

一、usbutils概述

usbutils是一个开源软件包,它提供了一系列命令行工具,用于与Linux内核的USB子系统进行交互。这些工具直接从内核的sysfs文件系统(位于/sys/bus/usb/)中读取信息,并以人类可读的格式呈现出来。简单来说,usbutils能够帮助用户回答以下几个关键问题:

  • 当前系统上连接了哪些USB设备?
  • 这些设备的制造商、产品名称、序列号是什么?
  • 设备的USB版本、传输速度、功耗等参数是多少?
  • USB设备之间是如何通过Hub级联的?
  • 当设备出现故障时,如何尝试重置它?

二、usbutils的组成工具

usbutils软件包主要包含以下四个命令行工具,每个工具都有其独特的用途。

1. lsusb —— 主力工具

lsusb是usbutils中使用频率最高的命令,用于列出系统中所有的USB总线以及连接到这些总线上的设备。它是大多数人认识和接触usbutils的入口。

基本用法:

直接运行lsusb命令,会输出类似下面的内容:

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 004: ID 13fe:6300 Kingston Technology Company Inc. USB DISK
Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

每一行的含义如下:

  • Bus 001:USB总线编号,系统通常有多个USB主机控制器,每个控制器对应一条总线
  • Device 004:设备在该总线上的地址编号,从1开始分配
  • ID 13fe:6300:设备的厂商ID(13fe)和产品ID(6300),这是USB设备的唯一标识符
  • Logitech, Inc. M105 Optical Mouse:设备的制造商和产品描述字符串

常用参数:

参数说明示例
-t以树状结构显示设备层次lsusb -t
-v显示详细描述符信息(需要sudo)sudo lsusb -v
-s [bus]:[dev]只显示指定总线和设备地址的设备lsusb -s 001:004
-d [vendor]:[product]按厂商ID和产品ID过滤lsusb -d 13fe:6300
-D 设备文件显示指定设备文件的详细信息sudo lsusb -D /dev/bus/usb/001/004

树状结构示例:

lsusb -t命令的输出特别有用,它能够清晰展示USB设备的级联关系:

$ sudo lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    |__ Port 3: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 4, If 0, Class=Mass Storage, Driver=usb-storage, 480M
        |__ Port 2: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 5: Dev 6, If 0, Class=Vendor Specific, Driver=, 12M

从这个树状结构可以看出:

  • Bus 01上有一个根Hub(root hub),它有12个端口
  • 在端口3上连接了一个外部Hub(Dev 3),这个Hub又有4个端口
  • 这个外部Hub的端口1上连接了一个U盘(Mass Storage)
  • 端口2上连接了一个鼠标(HID设备)

2. usb-devices —— 详尽的设备报告脚本

usb-devices是一个Bash脚本,它的功能与lsusb -v类似,但输出格式更加结构化。当传统的/proc/bus/usb/devices文件不可用时(现代Linux内核默认不挂载usbfs),这个脚本提供了一种替代方式来获取同样丰富的设备信息。

使用示例:

$ usb-devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh=12
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 5.10
S:  Manufacturer=Linux 5.10.0 xhci-hcd
S:  Product=xHCI Host Controller
S:  SerialNumber=0000:00:14.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=04 Cnt=01 Dev#=  4 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=13fe ProdID=6300 Rev= 1.00
S:  Manufacturer=Kingston
S:  Product=USB DISK
S:  SerialNumber=00000000000001
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms

输出中的每个字段都有特定含义:

  • T行:拓扑信息(Topology),包括总线、层级、父设备、端口、速度等
  • D行:设备描述符(Device descriptor),包括USB版本、设备类别等
  • P行:厂商和产品ID(Product and Vendor ID)
  • S行:字符串描述符(String descriptor),包括制造商、产品名、序列号
  • C行:配置描述符(Configuration descriptor)
  • I行:接口描述符(Interface descriptor)
  • E行:端点描述符(Endpoint descriptor)

3. usbhid-dump —— HID设备专用工具

usbhid-dump专门用于转储USB人机交互设备(HID,Human Interface Device)的报告描述符和数据流。HID设备包括键盘、鼠标、游戏手柄、触摸屏、条码扫描仪等。

使用场景:

  • 调试自定义HID设备
  • 分析输入设备的协议
  • 抓取设备发送的原始数据包
  • 逆向工程未知HID设备

基本用法:

# 列出所有HID设备
$ usbhid-dump -l

# 转储特定设备的报告描述符
$ sudo usbhid-dump -m 046d:c077 -d

# 持续监听设备的数据报告
$ sudo usbhid-dump -m 046d:c077 -es

4. usbreset —— 设备重置工具

usbreset是一个简单但实用的工具,用于向指定的USB设备发送重置信号。当某个USB设备出现卡死、无法响应、或者驱动程序状态异常时,使用usbreset可以在不物理重新插拔设备的情况下尝试恢复其正常工作。

使用场景:

  • 远程服务器上的USB设备故障(无法物理接触)
  • 自动化脚本中的设备复位
  • 设备驱动开发中的测试

使用方法:

# 首先找到设备的路径
$ lsusb
Bus 001 Device 004: ID 13fe:6300 Kingston Technology Company Inc. USB DISK

# 执行重置(注意:需要root权限)
$ sudo usbreset /dev/bus/usb/001/004

# 或者使用设备在sysfs中的路径
$ sudo usbreset /sys/bus/usb/devices/1-4

三、安装方法

usbutils是主流Linux发行版的官方软件包,可以通过系统的包管理器轻松安装。

Debian / Ubuntu / Linux Mint

sudo apt update
sudo apt install usbutils

Red Hat / CentOS / Fedora

# RHEL/CentOS 7及更早版本
sudo yum install usbutils

# Fedora及RHEL/CentOS 8+
sudo dnf install usbutils

Arch Linux / Manjaro

sudo pacman -S usbutils

openSUSE

sudo zypper install usbutils

从源码编译

如果需要最新版本或者发行版没有提供预编译包,可以从源码编译:

git clone https://github.com/gregkh/usbutils.git
cd usbutils
./autogen.sh
./configure
make
sudo make install

四、实战应用场景

场景一:快速确认设备是否被识别

当插入一个新的USB设备后,如果系统没有自动响应,第一件事就是运行lsusb来确认设备是否被内核检测到。

# 插入设备前
$ lsusb | wc -l
6

# 插入设备后
$ lsusb | wc -l
7

# 查看新增加的设备
$ lsusb | tail -1
Bus 001 Device 007: ID 1234:5678 Unknown Device

如果能看到新设备(即使是”Unknown Device”),说明USB物理层和链路层通信正常,问题出在驱动程序或上层软件。如果完全看不到,则需要检查USB接口、线缆或设备本身。

场景二:获取设备详细信息进行驱动开发

在编写USB设备驱动时,需要知道设备的描述符信息,包括端点地址、传输类型、最大包长等。

$ sudo lsusb -v -d 13fe:6300

Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x13fe Kingston Technology Company Inc.
  idProduct          0x6300
  bcdDevice            1.00
  iManufacturer           1 Kingston
  iProduct                2 USB DISK
  iSerial                 3 00000000000001
  bNumConfigurations      1
  ...(省略其余输出)

场景三:排查USB供电不足问题

某些高功耗的USB设备(如移动硬盘、USB无线网卡)可能因为供电不足而无法正常工作。通过查看设备的电源信息可以辅助判断:

$ sudo lsusb -v 2>/dev/null | grep -E "MaxPower|bMaxPower"
      MaxPower              200mA
      MaxPower              100mA

如果发现设备的最大功耗接近或超过端口供电能力,可能就是问题的根源。

场景四:重置无响应的设备

当USB设备因为固件bug或驱动问题而卡死时:

# 首先定位设备
$ lsusb
Bus 001 Device 003: ID 0b95:7720 ASIX Electronics Corp. AX88772

# 尝试重置
$ sudo usbreset /dev/bus/usb/001/003

# 检查设备是否恢复
$ lsusb -s 001:003
Bus 001 Device 004: ID 0b95:7720 ASIX Electronics Corp. AX88772

注意设备地址可能因为重置而改变(从003变成了004),这是正常现象。

场景五:追踪USB设备的热插拔事件

结合lsusb和udevadm可以监控USB设备的插拔事件:

# 实时监控内核消息
$ sudo dmesg -w | grep -i usb

# 或者使用udevadm监控
$ sudo udevadm monitor --property --subsystem-match=usb

五、工作原理与数据来源

usbutils中的所有工具都是用户态应用程序,它们不直接操作硬件,而是通过读取内核暴露的sysfs文件系统来获取信息。

sysfs中的USB信息

Linux内核将USB设备的信息导出在/sys/bus/usb/devices/目录下:

$ ls /sys/bus/usb/devices/
1-0:1.0  1-3      1-3.1    1-3.2    1-4      usb1     usb2

每个设备目录中包含多个属性文件:

$ cat /sys/bus/usb/devices/1-3/idVendor
13fe
$ cat /sys/bus/usb/devices/1-3/idProduct
6300
$ cat /sys/bus/usb/devices/1-3/manufacturer
Kingston
$ cat /sys/bus/usb/devices/1-3/product
USB DISK
$ cat /sys/bus/usb/devices/1-3/speed
480
$ cat /sys/bus/usb/devices/1-3/bMaxPower
200

lsusb命令实际上就是读取并整理这些文件的内容。当使用-v选项时,它还会通过libusb库向设备发送标准的USB控制传输来获取更详细的描述符数据。

USB ID数据库

为了将厂商ID和产品ID(如13fe:6300)转换为可读的文本(如”Kingston Technology Company Inc. USB DISK”),lsusb会查询本地USB ID数据库。这个数据库通常位于:

  • /usr/share/hwdata/usb.ids
  • /var/lib/usbutils/usb.ids

可以使用以下命令更新这个数据库:

sudo update-usbids

或者手动下载:

sudo wget -O /usr/share/hwdata/usb.ids http://www.linux-usb.org/usb.ids

六、常见问题与解决技巧

问题1:lsusb显示”Unable to initialize libusb”

这个错误通常表示libusb库没有正确安装或版本不兼容。

# Ubuntu/Debian
sudo apt install libusb-1.0-0-dev

# Fedora
sudo dnf install libusbx-devel

问题2:某些USB设备需要特定权限才能访问

默认情况下,普通用户可能无法访问某些USB设备。解决方法是将用户添加到plugdev组或创建udev规则。

# 添加用户到plugdev组
sudo usermod -a -G plugdev $USER

# 重新登录后生效

问题3:如何区分多个相同的USB设备

当连接多个相同型号的设备时,可以通过设备的USB端口位置或序列号来区分:

# 通过端口位置区分
$ lsusb -t

# 通过序列号区分
$ lsusb -v 2>/dev/null | grep iSerial
  iSerial                 3 0000000001
  iSerial                 3 0000000002

问题4:如何查看USB设备的实时数据流量

虽然usbutils不直接提供这个功能,但可以配合usbmon内核模块:

# 加载usbmon模块
sudo modprobe usbmon

# 查看可用的usbmon接口
ls /sys/kernel/debug/usb/usbmon/

七、与其他工具的比较

工具功能与usbutils的关系
lsblk列出块设备(如U盘分区)互补:usbutils看设备本身,lsblk看存储分区
dmesg显示内核日志互补:用于实时观察USB插拔事件
usbview图形化USB设备树相同信息源,但提供GUI界面
Wireshark网络抓包,支持USB更底层:用于USB协议分析
lsinput列出输入设备互补:针对HID设备的更高级接口

典型的工作流程是:

  1. dmesg -w 监视内核日志,确认设备被检测到
  2. lsusb 确认设备出现在USB设备列表中
  3. 如果是存储设备,lsblk或fdisk -l查看分区
  4. 如果需要详细调试,sudo lsusb -v -d vendor:product

八、总结

usbutils是一套小巧但功能强大的USB设备管理工具。它虽然不是图形界面工具,没有花哨的视觉效果,但它提供的命令行接口简洁、可靠、易于脚本化,非常适合在日常运维、开发调试、故障排查中使用。

掌握usbutils的关键在于理解它的四个核心工具:

  • lsusb用于快速查看和过滤设备列表
  • usb-devices用于获取结构化的详细报告
  • usbhid-dump专门处理HID类设备
  • usbreset用于设备故障恢复

无论你是普通Linux桌面用户想排查一个不工作的USB设备,还是系统管理员需要监控服务器上的USB加密狗,或是驱动开发者正在调试新硬件的驱动程序,usbutils都能为你提供准确、快速、标准化的信息。它是每个Linux用户工具箱中值得常备的一份子。

作者

老丹

关注我
其他文章
上一个

MQTT协议完全指南:从核心概念到实践应用

下一个

Bash 变量内容操作完全指南

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

搜索

近期文章

  • Bash命令行参数完全指南 2026年6月17日
  • Bash 数组完全指南:从设计思想到实战应用 2026年6月16日
  • Bash 变量内容操作完全指南 2026年6月16日
  • usbutils:Linux下USB设备查看与调试的完整指南 2026年6月16日
  • MQTT协议完全指南:从核心概念到实践应用 2026年6月16日
  • ICO文件格式完全解析 2026年6月15日

文章分类

  • C/C++开发 (10)
  • Linux工具包 (6)
  • Linux服务配置 (7)
  • Shell脚本 (3)
  • 计算机理论 (9)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号