Linux 中列出 USB 设备的完整指南
在 Linux 系统中,管理和排查 USB 设备是系统管理员、开发者和普通用户的常见需求。无论是识别新接入的 USB 闪存盘、调试外部显示器的 USB-C 连接,还是排查 USB 设备故障,准确列出和解析 USB 设备信息都是基础。本文将详细介绍 Linux 下用于列出 USB 设备的各类工具,包括它们的功能、使用方法、输出解析及最佳实践,帮助读者快速掌握 USB 设备管理技能。
目录#
1. 常用工具详解#
1.1 lsusb:快速列出 USB 设备#
lsusb 是最基础且常用的 USB 设备列出工具,它通过读取 /dev/bus/usb 目录和 usb.ids 数据库(存储厂商和产品 ID 映射),输出系统中所有 USB 设备的摘要信息。
基本用法#
lsusb # 默认列出所有 USB 设备示例输出#
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0951:1666 Kingston Technology DataTraveler G4
Bus 001 Device 002: ID 8087:0a2b Intel Corp. Bluetooth wireless interface
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
输出解析#
- Bus 001/002:USB 总线编号(系统中可能有多个 USB 控制器,对应不同总线)。
- Device 001/003:设备在总线上的编号(同一总线可接入多个设备)。
- ID 0951:1666:
厂商ID:产品ID(VID:PID),用于唯一标识设备。 - Kingston Technology DataTraveler G4:设备名称(由
usb.ids数据库解析)。
关键参数#
-v: verbose 模式,输出设备详细信息(如接口、端点、配置等,需 root 权限)。sudo lsusb -v -s 001:003 # 查看总线 1、设备 3 的详细信息-t:以树形结构展示 USB 设备拓扑(清晰显示设备间的层级关系,如集线器与子设备)。 输出示例:lsusb -t/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M |__ Port 2: Dev 2, If 0, Class=Wireless, Driver=btusb, 12M |__ Port 3: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 480M-s <bus>:<device>:过滤指定总线和设备(如-s 001:003仅显示总线 1 设备 3)。-d <vid:pid>:按厂商 ID 和产品 ID 过滤(如-d 0951:1666仅显示 Kingston 设备)。
1.2 dmesg:查看 USB 设备内核日志#
dmesg 用于打印内核环形缓冲区日志,其中包含 USB 设备接入/移除时的内核检测记录。对于排查设备初始化失败、驱动加载等问题非常有用。
基本用法#
dmesg | grep -i usb # 过滤包含 "usb" 的日志(-i 忽略大小写)示例输出(接入 USB 闪存盘时)#
[12345.678901] usb 1-3: new high-speed USB device number 3 using xhci_hcd
[12345.823456] usb 1-3: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 1.00
[12345.823460] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[12345.823462] usb 1-3: Product: DataTraveler G4
[12345.823463] usb 1-3: Manufacturer: Kingston
[12345.823464] usb 1-3: SerialNumber: 00123456789ABCDEF
[12345.825678] usb-storage 1-3:1.0: USB Mass Storage device detected
[12345.826789] scsi host6: usb-storage 1-3:1.0
[12346.830123] scsi 6:0:0:0: Direct-Access Kingston DataTraveler G4 1.00 PQ: 0 ANSI: 6
[12346.831234] sd 6:0:0:0: [sdb] 60508160 512-byte logical blocks: (31.0 GB/28.9 GiB)
[12346.832345] sd 6:0:0:0: [sdb] Write Protect is off
[12346.832347] sd 6:0:0:0: [sdb] Mode Sense: 45 00 00 00
[12346.833456] sd 6:0:0:0: [sdb] No Caching mode page found
[12346.833458] sd 6:0:0:0: [sdb] Assuming drive cache: write through
[12346.835678] sdb: sdb1
[12346.836789] sd 6:0:0:0: [sdb] Attached SCSI removable disk
关键参数#
-T:显示人类可读的时间戳(默认日志时间为内核启动后的秒数)。dmesg -T | grep -i usb-H:以人类可读格式输出(结合-T和颜色高亮)。-w:实时监听日志(设备接入时自动打印新日志)。
1.3 udevadm:查询 udev 设备详情#
udev 是 Linux 内核的设备管理框架,udevadm 是其管理工具,可查询设备的 udev 规则、sysfs 路径及属性,适合获取设备的底层信息。
基本用法#
需先通过 lsusb 获取设备的总线和设备号(如 Bus 001 Device 003),对应的设备路径为 /dev/bus/usb/001/003。
# 查看设备的 udev 信息(-q all 输出所有属性,-n 指定设备节点)
udevadm info -q all -n /dev/bus/usb/001/003示例输出#
P: /devices/pci0000:00/0000:00:14.0/usb1/1-3
N: bus/usb/001/003
L: 0
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-3
E: DEVNAME=/dev/bus/usb/001/003
E: MAJOR=189
E: MINOR=2
E: SUBSYSTEM=usb
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=951/1666/100 # VID/PID/版本(对应 0951:1666:0100)
E: VENDOR=Kingston Technology
E: MODEL=DataTraveler G4
E: SERIAL=00123456789ABCDEF
E: USB_INTERFACE_NUM=00
E: ACTION=add
...
另一种方式:通过 sysfs 路径查询#
USB 设备的 sysfs 路径通常为 /sys/bus/usb/devices/1-3(对应总线 1、端口 3),可通过 -p 参数指定路径:
udevadm info -q all -p /sys/bus/usb/devices/1-31.4 usb-devices:解析 sysfs 的 USB 设备信息#
usb-devices 是一个 shell 脚本,它解析 /sys/bus/usb/devices 目录(sysfs 文件系统),以结构化格式输出 USB 设备信息,比 lsusb 更详细(如设备拓扑、驱动、接口等)。
基本用法#
usb-devices # 直接输出所有 USB 设备信息示例输出(节选)#
T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 3 Spd=480 MxCh= 0
D: Ver= 2.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0951 ProdID=1666 Rev=01.00
S: Manufacturer=Kingston
S: Product=DataTraveler G4
S: SerialNumber=00123456789ABCDEF
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
输出字段解析#
T:拓扑信息(Bus=总线号,Lev=层级,Prnt=父设备,Port=端口号,Dev#=设备号,Spd=速度)。D:设备描述(Ver=USB 版本,Cls=设备类,Sub=子类,Prot=协议)。P:厂商和产品信息(Vendor=VID,ProdID=PID,Rev=硬件版本)。S:字符串描述(制造商、产品名、序列号)。C:配置信息(#Ifs=接口数,Cfg#=配置号,MxPwr=最大功耗)。I:接口信息(If#=接口号,Cls=接口类,Driver=驱动名称)。
过滤用法#
结合 grep 筛选特定设备:
usb-devices | grep -A 10 "Kingston" # 显示 Kingston 设备及其后 10 行信息1.5 lsblk:识别 USB 存储设备#
lsblk 用于列出块设备(如硬盘、U盘、分区),适合快速识别 USB 存储设备(如闪存盘、移动硬盘)。
基本用法#
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL # 自定义输出字段示例输出(包含 USB 闪存盘)#
NAME SIZE TYPE MOUNTPOINT MODEL
sda 256G disk SSD
├─sda1 512M part /boot/efi
└─sda2 255G part /
sdb 30G disk DataTraveler G4 # USB 闪存盘
└─sdb1 30G part /media/user/USB # 已挂载的分区
关键参数#
-S:仅显示存储设备(忽略分区)。 输出示例:lsblk -S | grep -i usbNAME HCTL TYPE VENDOR MODEL REV TRAN sdb 6:0:0:0 disk Kingston DataTraveler G4 1.00 usb-o <字段>:自定义输出字段(如NAME,SIZE,MODEL,TRAN中的TRAN表示传输协议,usb即为 USB 设备)。
1.6 lshw:全面硬件信息中的 USB 设备#
lshw(Hardware Lister)是一款全面的硬件信息工具,可通过 -class usb 参数专门列出 USB 控制器及设备,支持多种输出格式(文本、JSON、XML)。
基本用法#
sudo lshw -class usb # 需 root 权限,列出所有 USB 相关硬件示例输出(节选)#
*-usb:1
description: Mass storage device
product: DataTraveler G4
vendor: Kingston
physical id: 3
bus info: usb@1:3
version: 1.00
serial: 00123456789ABCDEF
capabilities: usb-2.10
configuration: driver=usb-storage maxpower=200mA speed=480Mbit/s
关键参数#
-short:简洁模式,仅输出设备路径和名称。 输出示例:sudo lshw -short -class usbH/W path Device Class Description ========================================================== /0/100/14/1/3 /dev/bus/usb/001/003 usb DataTraveler G4-json:以 JSON 格式输出(适合脚本解析)。sudo lshw -json -class usb > usb_info.json
2. 常见使用场景与实践#
| 场景需求 | 推荐工具 | 核心命令示例 |
|---|---|---|
| 快速列出所有 USB 设备 | lsusb | lsusb 或 lsusb -t(树形) |
| 查看设备接入时的内核日志 | dmesg | `dmesg -T |
| 获取设备 VID/PID 和路径 | lsusb + udevadm | lsusb -v -s 001:003 或 udevadm info -n /dev/bus/usb/001/003 |
| 详细设备拓扑和驱动信息 | usb-devices | `usb-devices |
| 识别 USB 存储设备(U盘) | lsblk | lsblk -o NAME,SIZE,MODEL,TRAN |
| 生成结构化硬件报告(含 USB) | lshw | sudo lshw -json -class usb > report.json |
3. 最佳实践#
-
更新
usb.ids数据库:
lsusb依赖/usr/share/hwdata/usb.ids解析 VID/PID 对应的设备名称,定期更新可确保新设备名称正确显示:sudo update-usbids # Debian/Ubuntu 系统 # 或手动下载:sudo wget http://www.linux-usb.org/usb.ids -O /usr/share/hwdata/usb.ids -
优先使用结构化输出工具:
脚本自动化时,避免解析lsusb的纯文本输出,优先选择lshw -json、udevadm -q json等结构化格式,便于提取字段。 -
区分 USB 版本与速度:
通过lsusb -t或usb-devices中的Spd字段识别设备速度(如480M=USB 2.0,5000M=USB 3.0,10000M=USB 3.1 Gen2)。 -
注意权限问题:
lsusb -v、lshw等工具需 root 权限才能获取完整信息,普通用户可能只能看到部分内容。
4. 故障排查示例#
问题:插入 USB 闪存盘后,系统未识别,无挂载提示。
排查步骤:
-
用
lsusb确认设备是否被物理检测:lsusb | grep -i kingston # 若输出为空,可能是硬件接触不良或设备损坏 -
用
dmesg查看内核错误日志:dmesg -T | grep -i "usb 1-3" # 替换为实际总线和设备号若出现
device descriptor read/64, error -71等错误,可能是 USB 端口供电不足或设备故障。 -
用
usb-devices检查驱动加载:usb-devices | grep -A 5 "ProdID=1666" | grep "Driver="若
Driver=usb-storage存在,说明驱动正常;若无驱动,可能是内核模块缺失(需加载usb-storage模块)。 -
用
lsblk确认块设备是否存在:lsblk -S | grep -i usb若输出为空,可能是设备未被识别为存储设备;若存在但无分区,可能需要格式化。
5. 总结#
Linux 提供了丰富的工具用于列出和管理 USB 设备,从快速概览的 lsusb 到深入内核日志的 dmesg,从结构化解析的 usb-devices 到存储专用的 lsblk,每种工具都有其适用场景。掌握这些工具的使用方法,结合最佳实践,可高效完成 USB 设备识别、调试和故障排查工作。
6. 参考资料#
lsusb手册:man lsusbdmesg手册:man dmesgudevadm手册:man udevadmusb-devices文档:/usr/share/doc/usb-devices/README(部分系统)- Linux 内核 USB 文档:https://www.kernel.org/doc/html/latest/usb/index.html
- USB 设备 ID 数据库:http://www.linux-usb.org/usb.ids
lshw项目主页:https://launchpad.net/lshw