Linux usb-devices命令

usb-devices 是一个用于显示当前系统USB设备详细信息的命令,它可以列出所有USB设备的拓扑结构、驱动信息、设备描述符等,对于USB设备调试和问题排查非常有用。

命令简介

usb-devices 命令是 usbutils 软件包的一部分,它通过读取 /sys/bus/usb/devices/ 目录下的信息来显示USB设备的详细配置。

主要功能
  • 显示USB设备拓扑结构
  • 列出设备厂商ID和产品ID
  • 显示设备驱动信息
  • 查看设备速度规格
  • 显示设备配置描述符
  • 查看设备电源管理信息
注意事项
  • 需要root权限查看完整信息
  • 输出信息较为详细,可能需要筛选
  • 某些信息取决于内核版本
  • 虚拟USB设备可能不会显示

安装方法

usb-devices 通常包含在 usbutils 包中:

Ubuntu/Debian
sudo apt update
sudo apt install usbutils
CentOS/RHEL
sudo yum install usbutils
检查是否已安装: 运行 which usb-devicesusb-devices --version 2>/dev/null || echo "未安装"

语法格式

usb-devices [选项]
参数说明:
  • 选项:可选参数,用于控制输出格式或筛选设备
  • -h--help:显示帮助信息
  • -V--version:显示版本信息

输出解读

usb-devices 的输出格式比较固定,每个USB设备输出一个块,块之间用空行分隔:

输出字段说明
字段 说明
T: 设备拓扑信息 (Topology)
B: 带宽信息 (Bandwidth)
D: 设备描述符 (Device Descriptor)
P: 产品ID字符串 (Product string)
S: 序列号 (Serial number)
C: 配置描述符 (Configuration Descriptor)
I: 接口描述符 (Interface Descriptor)
A: 设备属性 (Attributes)
M: 制造商字符串 (Manufacturer string)
E: 端点描述符 (Endpoint Descriptor)
* 表示当前激活的配置或接口
示例输出解读:
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=05.04
S:  Manufacturer=Linux 5.4.0-91-generic 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

关键字段解释:

  • Bus=01:USB总线编号
  • Lev=00:设备在拓扑中的层级(0表示根集线器)
  • Spd=480:设备速度(单位Mbps)
  • Vendor=1d6b:厂商ID(十六进制)
  • ProdID=0002:产品ID(十六进制)
  • Driver=hub:当前使用的驱动
  • #Ifs=1:接口数量
USB速度标识

Spd=字段中,数字代表不同的USB速度规格:

速度值 规格 说明
1.5 低速 (Low Speed) USB 1.0/1.1,主要用于键盘、鼠标等
12 全速 (Full Speed) USB 1.1,最大12Mbps
480 高速 (High Speed) USB 2.0,最大480Mbps
5000 超高速 (SuperSpeed) USB 3.0,最大5Gbps
10000 超高速+ (SuperSpeed+) USB 3.1 Gen2,最大10Gbps
20000 超高速+ (SuperSpeed+) USB 3.2,最大20Gbps

使用示例

示例1:基本使用

查看所有USB设备信息:

sudo usb-devices

注意:普通用户也可以运行,但可能需要sudo才能看到完整信息。

查看普通用户权限下的信息:

usb-devices
示例2:筛选特定设备

使用grep筛选特定厂商的设备:

sudo usb-devices | grep -A10 -B2 "Vendor=8087"

查找特定产品ID的设备:

sudo usb-devices | grep -B5 "ProdID=0024"

只显示有问题的设备(无驱动):

sudo usb-devices | grep -B3 -A3 "Driver=(none)"
示例3:查看设备统计信息

统计USB设备总数:

sudo usb-devices | grep "^T:" | wc -l

按速度统计设备数量:

sudo usb-devices | grep "Spd=" | sort | uniq -c

列出所有USB驱动:

sudo usb-devices | grep "Driver=" | sort -u
示例4:设备诊断

查看设备层级关系(拓扑结构):

sudo usb-devices | grep "^T:"

输出示例:

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh=12
T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
T:  Bus=01 Lev=01 Prnt=01 Port=02 Cnt=02 Dev#=  3 Spd=12   MxCh= 4

解析:

  • Lev=00:根集线器(第0层)
  • Lev=01 Prnt=01:父设备是设备#1
  • Lev=01 Prnt=01 Port=02:连接到父设备的端口2
示例5:脚本中使用

检测特定设备是否存在:

#!/bin/bash
VENDOR_ID="0x8087"
PRODUCT_ID="0x0024"

if sudo usb-devices | grep -q "Vendor=${VENDOR_ID#0x} ProdID=${PRODUCT_ID#0x}"; then
    echo "设备已连接"
    # 获取设备详细信息
    DEVICE_INFO=$(sudo usb-devices | grep -B10 -A10 "Vendor=${VENDOR_ID#0x} ProdID=${PRODUCT_ID#0x}")
    echo "$DEVICE_INFO"
else
    echo "设备未连接"
fi

监控USB设备插拔事件(简化版):

#!/bin/bash
echo "开始监控USB设备变化..."
OLD_COUNT=$(sudo usb-devices | grep "^T:" | wc -l)

while true; do
    NEW_COUNT=$(sudo usb-devices | grep "^T:" | wc -l)
    if [ "$OLD_COUNT" -ne "$NEW_COUNT" ]; then
        echo "USB设备数量变化: $OLD_COUNT -> $NEW_COUNT"
        OLD_COUNT=$NEW_COUNT
        # 显示新增设备
        echo "当前USB设备列表:"
        sudo usb-devices | grep "^T:"
    fi
    sleep 2
done
示例6:高级诊断

检查USB电源管理信息:

sudo usb-devices | grep -B2 -A2 "MxPwr="

查看设备配置描述符:

sudo usb-devices | grep -B3 "C: #Cfgs="

比较插拔前后的设备差异:

# 保存当前状态
sudo usb-devices > /tmp/usb_before.txt

# 插入/拔出设备后
sudo usb-devices > /tmp/usb_after.txt

# 比较差异
diff /tmp/usb_before.txt /tmp/usb_after.txt | grep -E "^[<>]"

实用技巧

快速查找
  • 使用grep -B5 -A5显示匹配行的前后内容
  • 使用grep -i忽略大小写搜索
  • 结合sortuniq进行统计
  • 使用awk提取特定字段
故障排除
  • 检查Driver=(none)的设备
  • 查看设备速度是否符合预期
  • 检查电源是否充足(MxPwr字段)
  • 查看设备是否在正确的总线上
常用命令组合

提取所有设备的厂商和产品ID:

sudo usb-devices | grep "Vendor=" | awk '{print $2, $3}' | sort -u

查看USB设备树状结构:

sudo usb-devices | awk '/^T:/ {
    lev=$3; gsub(/Lev=/, "", lev);
    prnt=$4; gsub(/Prnt=/, "", prnt);
    port=$5; gsub(/Port=/, "", port);
    printf "%" (lev*4) "s", "";
    printf "└─ 设备#%s (父设备:%s, 端口:%s)\n", prnt, prnt, port;
}'
数据解析脚本

创建JSON格式的设备信息:

#!/bin/bash
echo "["
sudo usb-devices | awk '
BEGIN { first=1 }
/^T:/ {
    if (!first) print "  },"
    first=0
    split($0, arr, " ")
    printf "  {\n"
    printf "    \"bus\": \"%s\",\n", substr(arr[2], 5)
    printf "    \"level\": \"%s\",\n", substr(arr[3], 5)
    printf "    \"speed\": \"%s\",\n", substr(arr[7], 5)
}
/^D:/ && /Vendor=/ {
    split($0, arr, " ")
    for (i in arr) {
        if (arr[i] ~ /^Vendor=/) {
            split(arr[i], v, "=")
            printf "    \"vendor_id\": \"%s\",\n", v[2]
        }
        if (arr[i] ~ /^ProdID=/) {
            split(arr[i], p, "=")
            printf "    \"product_id\": \"%s\",\n", p[2]
        }
    }
    printf "    \"driver\": \"%s\"\n", substr($NF, 8)
}
END {
    if (!first) print "  }"
    print "]"
}' | grep -v "^$"
USB相关命令
  • lsusb - 列出USB设备基本信息
  • usbhid-dump - 转储USB HID设备数据
  • usbview - 图形化USB设备查看器
  • udevadm - 管理设备事件和属性
  • dmesg - 查看内核消息(包含USB事件)
设备信息命令
  • lspci - 列出PCI设备
  • lsblk - 列出块设备
  • lscpu - 显示CPU信息
  • lsmod - 显示已加载的模块
  • dmesg - 显示内核环形缓冲区
命令比较

usb-deviceslsusb 的主要区别:

特性 usb-devices lsusb
信息详细程度 非常详细,显示所有描述符 相对简洁,基本信息
输出格式 固定格式,易于解析 可定制格式,支持多种选项
拓扑显示 清晰显示设备层级关系 需要-t参数显示拓扑
驱动信息 显示每个接口的驱动 不显示驱动信息
使用场景 设备调试、驱动开发 快速查看、日常使用

建议:

  • 日常查看USB设备使用 lsusblsusb -t
  • 设备调试和问题排查使用 usb-devices
  • 编写脚本时根据需要选择合适的命令
注意事项
  • usb-devices 显示的是内核USB子系统的信息,可能与实际物理连接有差异
  • 某些USB设备可能在休眠状态时不显示
  • 虚拟USB设备(如虚拟摄像头)可能不会出现在输出中
  • 输出信息取决于内核版本和USB驱动实现
  • 对于加密或特殊保护的设备,某些信息可能不可见
  • 频繁运行usb-devices可能对系统性能有轻微影响