linux lsusb命令

提示:lsusb命令用于显示系统中所有USB总线和连接的USB设备信息,是USB设备管理和故障排查的重要工具。

命令简介

lsusb 是Linux系统中用于显示USB设备信息的命令。它列出系统中所有USB总线、USB控制器以及连接到这些总线的USB设备。通过lsusb,用户可以查看USB设备的厂商ID、产品ID、设备类别、接口信息等,对于USB设备识别、驱动安装和故障排查非常有帮助。

命令语法

lsusb [选项]

常用选项

选项 说明
-v, --verbose 显示详细信息(包括设备描述符、配置描述符等)
-t, --tree 以树状图显示USB设备层次结构
-s [[bus]:][devnum] 只显示指定总线编号和/或设备编号的设备
-d [vendor]:[product] 只显示指定厂商ID和产品ID的设备
-D 设备文件 直接从设备文件读取信息,不扫描/dev/bus/usb
--device=/dev/bus/usb/BBB/DDD 显示指定USB设备的详细信息
-V, --version 显示版本信息
-h, --help 显示帮助信息
-i 文件 使用指定的USB ID数据库文件
-p 路径 从指定路径读取USB设备信息
-P 协议 指定USB协议(usbfs或sysfs)
-u 显示USB设备的通用接口
-c 显示配置信息
-x 以十六进制显示设备描述符

USB设备地址格式

USB设备地址由总线编号和设备编号组成:

总线编号:设备编号

例如:001:003 表示:
- 总线编号: 001
- 设备编号: 003

输出字段解析

字段 说明 示例
Bus USB总线编号 001
Device 设备在该总线上的编号 003
ID 厂商ID:产品ID 8087:0029
Vendor 厂商ID(十六进制) 8087
Product 产品ID(十六进制) 0029
Class 设备类别 Hub(集线器)
SubClass 设备子类 00
Protocol 设备协议 01
MaxPower 最大功率(毫安) 100mA
Speed 设备速度 480M(USB 2.0)
Manufacturer 制造商名称 Intel Corp.
Product 产品名称 Integrated Rate Matching Hub
SerialNumber 序列号 0000:00:1a.0

使用示例

示例1:基本使用

显示系统中所有USB设备的基本信息:

# 显示所有USB设备
lsusb

# 示例输出:
# Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
# Bus 001 Device 004: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
# Bus 001 Device 003: ID 0bda:818b Realtek Semiconductor Corp. RTL8192EU 802.11b/g/n WLAN Adapter
# Bus 001 Device 002: ID 8087:0029 Intel Corp. Integrated Rate Matching Hub
# Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

示例2:显示详细信息

显示USB设备的详细信息:

# 显示所有USB设备的详细信息
lsusb -v

# 显示特定设备的详细信息
lsusb -s 001:003 -v

# 显示特定厂商设备的详细信息
lsusb -d 0bda: -v

# 示例输出(部分):
# Bus 001 Device 003: ID 0bda:818b Realtek Semiconductor Corp. RTL8192EU 802.11b/g/n WLAN Adapter
# Device Descriptor:
#   bLength                18
#   bDescriptorType         1
#   bcdUSB               2.10
#   bDeviceClass          239 Miscellaneous Device
#   bDeviceSubClass         2 ?
#   bDeviceProtocol         1 Interface Association
#   bMaxPacketSize0        64
#   idVendor           0x0bda Realtek Semiconductor Corp.
#   idProduct          0x818b RTL8192EU 802.11b/g/n WLAN Adapter
#   bcdDevice            2.00
#   iManufacturer           1 Realtek
#   iProduct                2 802.11n WLAN Adapter
#   iSerial                 3 00e04c000001
#   bNumConfigurations      1
#   Configuration Descriptor:
#     bLength                 9
#     bDescriptorType         2
#     wTotalLength          125
#     bNumInterfaces          2
#     bConfigurationValue     1
#     iConfiguration          0
#     bmAttributes         0x80
#       (Bus Powered)
#     MaxPower              500mA

示例3:以树状图显示

以树状图显示USB设备层次结构:

# 以树状图显示USB设备
lsusb -t

# 示例输出:
# /:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
#     |__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
# /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
#     |__ Port 3: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
#         |__ Port 1: Dev 3, If 0, Class=Wireless, Driver=rtl8192eu, 480M
#         |__ Port 2: Dev 4, If 0, Class=Mass Storage, Driver=usb-storage, 480M

示例4:按条件筛选设备

按总线、设备编号或ID筛选显示:

# 显示特定总线上的所有设备
lsusb -s 001

# 显示特定设备(总线001,设备003)
lsusb -s 001:003

# 显示特定厂商的所有设备
lsusb -d 0bda:

# 显示特定厂商和产品的设备
lsusb -d 0bda:818b

# 显示特定设备类别的设备
lsusb | grep -i "mass storage"
lsusb | grep -i "hub"
lsusb | grep -i "wireless"
lsusb | grep -i "keyboard"
lsusb | grep -i "mouse"
lsusb | grep -i "camera"
lsusb | grep -i "audio"

示例5:显示设备描述符

以十六进制显示USB设备描述符:

# 显示设备描述符(十六进制格式)
lsusb -x

# 显示特定设备的描述符
lsusb -s 001:003 -x

# 示例输出:
# Bus 001 Device 003: ID 0bda:818b Realtek Semiconductor Corp. RTL8192EU 802.11b/g/n WLAN Adapter
# Device Descriptor:
#   bLength                18
#   bDescriptorType         1
#   bcdUSB               0201
#   bDeviceClass          00
#   bDeviceSubClass       00
#   bDeviceProtocol       00
#   bMaxPacketSize0       40
#   idVendor           0bda
#   idProduct          818b
#   bcdDevice          0200
#   iManufacturer         01
#   iProduct              02
#   iSerialNumber         03
#   bNumConfigurations    01

示例6:显示配置信息和接口

显示USB设备的配置和接口信息:

# 显示配置信息
lsusb -c

# 显示通用接口信息
lsusb -u

# 显示特定设备的接口信息
lsusb -s 001:003 -u

# 组合多个选项
lsusb -v -t  # 详细信息和树状图结合
lsusb -v -x  # 详细信息和十六进制描述符结合

示例7:监控USB设备变化

使用watch命令监控USB设备的变化:

# 每2秒刷新一次USB设备列表
watch -n 2 lsusb

# 监控并高亮显示变化
watch -n 1 -d lsusb

# 监控特定设备的详细信息
watch -n 1 "lsusb -s 001:003 -v | head -30"

# 结合journalctl监控USB事件
journalctl -f | grep -i usb

# 监控USB内核消息
sudo dmesg -w | grep -i usb

示例8:在脚本中使用lsusb

在脚本中提取和处理USB设备信息:

#!/bin/bash

# 脚本1:检测连接的USB设备
echo "=== USB设备检测报告 ==="
echo "检测时间: $(date)"
echo ""

# 统计USB设备数量
TOTAL_DEVICES=$(lsusb | wc -l)
echo "1. USB设备总数: $TOTAL_DEVICES"

# 统计不同类型的设备
echo ""
echo "2. 按设备类型分类:"
HUB_COUNT=$(lsusb | grep -i "hub" | wc -l)
STORAGE_COUNT=$(lsusb | grep -i "mass storage" | wc -l)
WIFI_COUNT=$(lsusb | grep -i "wireless\|wlan\|802.11" | wc -l)
echo "   USB集线器: $HUB_COUNT"
echo "   存储设备: $STORAGE_COUNT"
echo "   无线网卡: $WIFI_COUNT"

# 列出所有存储设备
echo ""
echo "3. USB存储设备列表:"
lsusb | grep -i "mass storage" | while read line; do
    BUS_DEV=$(echo $line | awk '{print $2":"$4}' | tr -d ':')
    echo "   $line"
    # 获取设备文件路径
    DEV_PATH="/dev/bus/usb/${BUS_DEV%:*}/${BUS_DEV#*:}"
    if [ -e "$DEV_PATH" ]; then
        echo "   设备文件: $DEV_PATH"
    fi
done

# 脚本2:检查特定设备是否存在
check_usb_device() {
    local vendor=$1
    local product=$2

    if lsusb -d ${vendor}:${product} > /dev/null 2>&1; then
        echo "USB设备 ${vendor}:${product} 已连接"
        return 0
    else
        echo "USB设备 ${vendor}:${product} 未连接"
        return 1
    fi
}

# 检查特定的USB设备
echo ""
echo "4. 特定设备检查:"
check_usb_device "0bda" "818b"  # RTL8192EU无线网卡
check_usb_device "0781" "5583"  # SanDisk U盘
check_usb_device "046d" "c52b"  # Logitech无线接收器

# 脚本3:获取USB设备详细信息
get_usb_device_info() {
    local bus=$1
    local dev=$2

    echo "设备信息:"
    echo "========="
    lsusb -s ${bus}:${dev} -v | grep -E "(idVendor|idProduct|iManufacturer|iProduct|iSerial|bMaxPower|bcdUSB|bDeviceClass)" | head -20
}

# 使用示例
# get_usb_device_info 001 003

常见USB设备类别

类别代码 类别名称 说明
00 Device 设备(在接口级别定义)
01 Audio 音频设备(耳机、麦克风等)
02 Communications and CDC Control 通信设备(调制解调器等)
03 HID (Human Interface Device) 人机接口设备(键盘、鼠标、游戏手柄等)
05 Physical 物理设备(力反馈设备等)
06 Image 图像设备(摄像头、扫描仪等)
07 Printer 打印机
08 Mass Storage 大容量存储设备(U盘、移动硬盘等)
09 Hub USB集线器
0a CDC Data CDC数据设备
0b Smart Card 智能卡读卡器
0d Content Security 内容安全设备
0e Video 视频设备(网络摄像头等)
0f Personal Healthcare 个人医疗设备
10 Audio/Video Devices 音视频设备
e0 Wireless Controller 无线控制器(蓝牙、Wi-Fi等)
ef Miscellaneous 杂项设备
fe Application Specific 特定应用设备
ff Vendor Specific 厂商特定设备

常见厂商ID

厂商ID 厂商名称 常见产品
1d6b Linux Foundation USB根集线器
8087 Intel Corp. USB控制器、集线器
0bda Realtek Semiconductor 无线网卡、读卡器、声卡
046d Logitech, Inc. 鼠标、键盘、摄像头
045e Microsoft Corp. 鼠标、键盘、游戏手柄
0781 SanDisk Corp. U盘、存储卡
0951 Kingston Technology U盘、存储设备
04e8 Samsung Electronics 手机、存储设备
0483 STMicroelectronics 开发板、调试器
0cf3 Atheros Communications 无线网卡、蓝牙适配器
04f2 Chicony Electronics 摄像头、键盘
05ac Apple, Inc. iPhone、iPad、键盘、鼠标
0489 Foxconn / Hon Hai 无线网卡、蓝牙设备
0b05 ASUSTek Computer 无线网卡、主板设备
04ca Lite-On Technology 摄像头、读卡器

在脚本中使用lsusb

#!/bin/bash

# 脚本1:USB设备自动挂载检测
USB_MONITOR_SCRIPT="/tmp/usb_monitor.sh"
cat > $USB_MONITOR_SCRIPT << 'EOF'
#!/bin/bash
# USB设备监控脚本

PREV_COUNT=$(lsusb | wc -l)
echo "开始监控USB设备连接/断开..."
echo "初始USB设备数量: $PREV_COUNT"

while true; do
    CURRENT_COUNT=$(lsusb | wc -l)

    if [ $CURRENT_COUNT -gt $PREV_COUNT ]; then
        echo "$(date): 新USB设备已连接"
        echo "新设备信息:"
        lsusb | tail -$((CURRENT_COUNT - PREV_COUNT))

        # 这里可以添加挂载逻辑
        # for device in $(ls /dev/sd* 2>/dev/null | grep -E 'sd[a-z][0-9]*$'); do
        #     mount_point="/mnt/$(basename $device)"
        #     mkdir -p $mount_point
        #     mount $device $mount_point 2>/dev/null && echo "已挂载 $device 到 $mount_point"
        # done
    elif [ $CURRENT_COUNT -lt $PREV_COUNT ]; then
        echo "$(date): USB设备已断开"
        # 这里可以添加卸载逻辑
    fi

    PREV_COUNT=$CURRENT_COUNT
    sleep 2
done
EOF

chmod +x $USB_MONITOR_SCRIPT
echo "监控脚本已创建: $USB_MONITOR_SCRIPT"
echo "运行: bash $USB_MONITOR_SCRIPT"

# 脚本2:USB设备信息导出
echo ""
echo "USB设备信息导出到CSV:"
OUTPUT_CSV="/tmp/usb_devices_$(date +%Y%m%d_%H%M%S).csv"
echo "Bus,Device,ID,Vendor,Product,Manufacturer,ProductName" > $OUTPUT_CSV

lsusb | while read line; do
    BUS=$(echo $line | awk '{print $2}')
    DEVICE=$(echo $line | awk '{print $4}' | tr -d ':')
    ID=$(echo $line | awk '{print $6}')
    VENDOR_ID=$(echo $ID | cut -d: -f1)
    PRODUCT_ID=$(echo $ID | cut -d: -f2)

    # 获取详细信息的制造商和产品名
    DETAILS=$(lsusb -s ${BUS}:${DEVICE} -v 2>/dev/null)
    MANUFACTURER=$(echo "$DETAILS" | grep -i "iManufacturer" | head -1 | cut -d: -f2 | sed 's/^[ \t]*//')
    PRODUCT_NAME=$(echo "$DETAILS" | grep -i "iProduct" | head -1 | cut -d: -f2 | sed 's/^[ \t]*//')

    echo "$BUS,$DEVICE,$ID,$VENDOR_ID,$PRODUCT_ID,\"$MANUFACTURER\",\"$PRODUCT_NAME\"" >> $OUTPUT_CSV
done

echo "USB设备信息已导出到: $OUTPUT_CSV"

# 脚本3:检查USB端口速度
echo ""
echo "USB端口速度检查:"
lsusb -t | grep -E "Port [0-9]+:" | while read line; do
    PORT=$(echo $line | grep -o "Port [0-9]\+:" | head -1)
    SPEED=$(echo $line | grep -o "[0-9]\+M")
    CLASS=$(echo $line | grep -o "Class=[^,]*" | cut -d= -f2)
    DRIVER=$(echo $line | grep -o "Driver=[^,]*" | cut -d= -f2)

    echo "$PORT | 速度: $SPEED | 类别: $CLASS | 驱动: $DRIVER"
done

USB版本和速度

USB版本 最大速度 发布日期 颜色代码
USB 1.0 1.5 Mbps (低速) 1996年1月 白色
USB 1.1 12 Mbps (全速) 1998年9月 白色
USB 2.0 480 Mbps (高速) 2000年4月 黑色
USB 3.0 (USB 3.1 Gen1) 5 Gbps (超速) 2008年11月 蓝色
USB 3.1 (USB 3.1 Gen2) 10 Gbps 2013年7月 蓝绿色
USB 3.2 20 Gbps 2017年9月 红色
USB4 40 Gbps 2019年8月 未指定

注意事项

  1. lsusb命令通常需要root权限才能访问所有USB设备信息
  2. 某些USB设备可能需要在驱动加载后才能被lsusb识别
  3. USB设备编号在系统重启或设备重新插拔后可能会改变
  4. 虚拟化环境中的USB设备可能与物理设备有不同的ID
  5. lsusb使用/usr/share/misc/usb.ids数据库文件来解析厂商和设备名称
  6. 可以手动更新USB ID数据库:sudo update-usbids
  7. 对于USB存储设备,还需要使用lsblk命令查看块设备信息
  8. USB设备的序列号可能因设备而异,有些设备可能没有序列号
  9. 在容器环境中,lsusb可能无法工作或只能显示有限信息

故障排查

# 1. lsusb命令不存在
# 检查是否安装
which lsusb
# 安装(如果需要)
# Ubuntu/Debian: sudo apt-get install usbutils
# RHEL/CentOS: sudo yum install usbutils

# 2. USB设备未被识别
# 检查内核消息
dmesg | grep -i usb
sudo dmesg -w

# 重新加载USB驱动
sudo modprobe -r usbhid
sudo modprobe usbhid

# 重新扫描USB总线
sudo sh -c 'echo 1 > /sys/bus/usb/devices/usb1/rescan'
sudo sh -c 'echo 1 > /sys/bus/usb/devices/usb2/rescan'

# 3. 设备权限问题
# 查看USB设备文件权限
ls -la /dev/bus/usb/*/*

# 临时设置权限
sudo chmod 666 /dev/bus/usb/*/*

# 永久解决方案:添加用户到dialout组
sudo usermod -a -G dialout $USER

# 4. 更新USB ID数据库
sudo update-usbids

# 手动下载最新数据库
wget http://www.linux-usb.org/usb.ids
sudo cp usb.ids /usr/share/misc/usb.ids

# 5. 检查USB端口电源管理
# 禁用USB自动挂起
for i in /sys/bus/usb/devices/*/power/control; do
    echo on > "$i"
done

# 6. 查看USB内核模块
lsmod | grep -i usb
lsmod | grep -i hid

# 7. 检查USB控制器
lspci | grep -i usb
lspci -v | grep -i xhci\|ehci\|ohci -A 5

# 8. 重置USB设备
# 查找设备路径
lsusb -t
# 卸载设备驱动
sudo sh -c "echo '0bda:818b' > /sys/bus/usb/drivers/usb/unbind"
sudo sh -c "echo '0bda:818b' > /sys/bus/usb/drivers/usb/bind"

# 9. 查看USB设备文件描述符
sudo lsusb -D /dev/bus/usb/001/003

USB设备描述符详解

# USB设备描述符字段说明:
# bLength: 描述符长度(18字节)
# bDescriptorType: 描述符类型(1表示设备描述符)
# bcdUSB: USB规范版本号(如0201表示USB 2.1)
# bDeviceClass: 设备类别
# bDeviceSubClass: 设备子类
# bDeviceProtocol: 设备协议
# bMaxPacketSize0: 端点0的最大包大小
# idVendor: 厂商ID
# idProduct: 产品ID
# bcdDevice: 设备版本号
# iManufacturer: 制造商字符串索引
# iProduct: 产品字符串索引
# iSerialNumber: 序列号字符串索引
# bNumConfigurations: 配置数量

# 查看完整的USB描述符树
sudo lsusb -v 2>/dev/null | less

# 查看特定设备的配置描述符
sudo lsusb -s 001:003 -v 2>/dev/null | grep -A 20 "Configuration Descriptor"

相关命令

  • lspci - 显示PCI设备信息
  • lsblk - 显示块设备信息(用于USB存储设备)
  • dmesg - 查看内核消息,包括USB设备连接信息
  • udevadm - udev设备管理工具,可监控USB事件
  • mount - 挂载USB存储设备
  • umount - 卸载USB存储设备
  • blkid - 显示块设备属性,包括USB存储设备
  • fdisk - 磁盘分区工具,可用于USB存储设备
  • usb-devices - 显示USB设备信息的脚本
  • usbview - 图形化USB设备查看器