市场上有数千种 USB 设备——键盘、扫描仪、打印机、鼠标以及无数其他可在 Linux 上运行的设备。它们的供应商详细信息存储在 USB ID 仓库中。
lsusb
Linux `lsusb` 命令列出有关连接到系统的 USB 设备的信息,但有时信息不完整。例如,我最近注意到我的一个 USB 设备的品牌未被识别。设备功能正常,但列出我连接的 USB 设备的详细信息时没有提供任何识别信息。这是我的 `lsusb` 命令的输出
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:082c Logitech, Inc.
Bus 001 Device 003: ID 0951:16d2 Kingston Technology
Bus 001 Device 002: ID 18f8:1486
Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
正如您在最后一列中看到的,有一个设备没有制造商描述。为了确定设备是什么,我必须对我的 USB 设备树进行更深入的检查。幸运的是,`lsusb` 命令有更多选项。其中之一是 `-D device`,用于获取每个设备的详细信息,正如手册页所解释的那样
“不要扫描 /dev/bus/usb 目录,而是仅显示有关给定设备文件的设备的信息。设备文件应类似于 /dev/bus/usb/001/001。此选项显示详细信息,如 v 选项;您必须是 root 用户才能执行此操作。”
我认为将设备路径传递给 lsusb 命令并不容易理解,但在仔细阅读手册页和初始输出后,我能够确定如何构造它。USB 设备驻留在 UDEV 文件系统中。它们的设备路径从 USB 设备目录 `/dev/bus/usb/` 开始。路径的其余部分由设备的 Bus ID 和 Device ID 组成。我的非描述性设备是 Bus 001,Device 002,转换为 001/002,并完成路径 `/dev/bus/usb/001/002`。现在我可以将此路径传递给 `lsusb`。我还将管道连接到 `more`,因为那里通常有很多信息
$ lsusb -D /dev/bus/usb/001/002 |more
Device: ID 18f8:1486
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x18f8
idProduct 0x1486
bcdDevice 1.00
iManufacturer 0
iProduct 1
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 59
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 100mA
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 0
HID Device Descriptor:
不幸的是,这没有提供我希望找到的细节。初始输出中出现的两个字段 `idVendor` 和 `idProduct` 都是空的。有一些帮助,因为向下扫描一点会显示单词 Mouse。啊哈!所以,这个设备是我的鼠标。
USB ID 仓库
这让我想到我如何填充这些字段,不仅为我自己,也为其他 Linux 用户。事实证明,已经有一个开源项目用于此目的:USB ID 仓库。它是一个公开仓库,其中包含 USB 设备中使用的所有已知 ID。它也用于各种程序,包括 USB Utilities,以显示人类可读的设备名称。

(Alan Formy-Duval, CC BY-SA 4.0)
您可以从网站浏览仓库以查找特定设备,也可以下载数据库。也欢迎用户提交新数据。这就是我为我的鼠标所做的事情,它之前是缺失的。
更新您的 USB ID
USB ID 数据库存储在一个名为 `usb.ids` 的文件中。此位置可能因 Linux 发行版而异。
在 Ubuntu 18.04 上,此文件位于 `/var/lib/usbutils` 中。要更新数据库,请使用命令 `update-usbids`,您需要以 root 权限或使用 `sudo` 运行该命令
$ sudo update-usbids
如果有新文件可用,它将被下载。当前文件将被备份并替换为新文件
$ ls -la
total 1148
drwxr-xr-x 2 root root 4096 Jan 15 00:34 .
drwxr-xr-x 85 root root 4096 Nov 7 08:05 ..
-rw-r--r-- 1 root root 614379 Jan 9 15:34 usb.ids
-rw-r--r-- 1 root root 551472 Jan 15 00:34 usb.ids.old
最新版本的 Fedora Linux 将数据库文件存储在 `/usr/share/hwdata` 中。此外,没有更新脚本。相反,数据库在名为 `hwdata` 的软件包中维护。
# dnf info hwdata
Installed Packages
Name : hwdata
Version : 0.332
Release : 1.fc31
Architecture : noarch
Size : 7.5 M
Source : hwdata-0.332-1.fc31.src.rpm
Repository : @System
From repo : updates
Summary : Hardware identification and configuration data
URL : https://github.com/vcrhonek/hwdata
License : GPLv2+
Description : hwdata contains various hardware identification and configuration data,
: such as the pci.ids and usb.ids databases.
现在我的 USB 设备列表在这个以前未命名的设备旁边显示了一个名称。将其与上面的输出进行比较
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:082c Logitech, Inc. HD Webcam C615
Bus 001 Device 003: ID 0951:16d2 Kingston Technology
Bus 001 Device 014: ID 18f8:1486 [Maxxter]
Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
您可能会注意到,随着仓库定期更新新设备和有关现有设备的详细信息,其他设备描述也会发生变化。
提交新数据
有两种提交新数据的方式:使用 Web 界面或通过电子邮件发送特殊格式的补丁文件。在开始之前,我通读了提交指南。首先,我必须注册一个帐户,然后我需要使用项目的提交系统来提供我的鼠标的 ID 和名称。添加任何 USB 设备的过程都是相同的。
您使用过 USB ID 仓库吗? 如果是,请在评论中分享您的反应。
6 条评论