通过 USB ID 仓库在 Linux 上识别更多设备

一个开源项目包含所有已知 USB 设备 ID 的公共仓库。
151 位读者喜欢这篇文章。
Testing Linux hardware compatibility with USB sticks

Opensource.com

市场上有数千种 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:

不幸的是,这没有提供我希望找到的细节。 初始输出中出现的两个字段 idVendoridProduct 都为空。 有一些帮助,因为向下扫描一点会显示“Mouse”一词。 A-HA! 所以,这个设备是我的鼠标。

USB ID 仓库

这让我想知道如何填充这些字段,不仅为我自己,也为其他 Linux 用户。 事实证明,已经有一个开源项目用于此:USB ID 仓库。 它是所有已知 USB 设备 ID 的公共仓库。 它也用于各种程序中,包括 USB 实用程序,以显示人类可读的设备名称。

您可以从网站浏览仓库中的特定设备,也可以下载数据库。 也欢迎用户提交新数据。 这就是我为我的鼠标所做的事情,它不存在。

更新您的 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 仓库? 如果是这样,请在评论中分享您的反应。

接下来阅读什么
标签
Alan Formy-Duval Opensource.com Correspondent
Alan 拥有 20 年的 IT 经验,主要在政府和金融领域。 他最初是增值经销商,然后转到系统工程。 Alan 的背景是高可用性集群应用程序。 他在 Oracle Press/McGraw Hill 的“Oracle Solaris 11 系统管理”一书中编写了“用户和组”以及“Apache 和 Web 堆栈”章节。

6 条评论

这种事情应该在没有用户输入的情况下自动填充。 如果 Linux 要继续作为桌面操作系统,它将必须收集一些信息。 让所有隐私类型的人选择加入,但不要浪费这个机会。 我们仍然被狠狠地踢了一脚。 现在是 2020 年,HiDPI 支持仍然是个笑话。 我们是最后一个获得一切的,并且差距很大。 我们必须做得更好。

请注意,仅仅因为您可以在 Linux 上手动更新某些东西并不意味着您必须这样做。 这种数据确实会随着重大升级而更新,无需用户输入; 本文是关于如何在发生这种情况之前更新它的。 没有哪个操作系统可以跟上市场上发布的每个 USB 设备,并在没有某种外部数据库来跟踪它们的情况下提供有关每个设备的元数据。 这是现状。

回复 Bernard (未验证)

有趣的文章... 但是我似乎找不到在 Ubuntu 20.04 中执行此操作的方法
有什么想法吗?

JJ,似乎 18.04 之后的 Ubuntu 发行版不再使用该脚本。 相反,USB ID 文件现在由包“usb-ids”维护。 以下命令将检查更新。

# apt --only-upgrade install usb.ids

该文件的注释确实提到可以从 http://www.linux-usb.org/usb.ids 获取最新版本,因此可以手动更新该文件。 我将把它与义务性的“自担风险”警告一起留下。

感谢您引起我们的注意。

回复 JJ

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 授权。
© . All rights reserved.