为了实验目的,我购买了一些 wifi 和蓝牙设备,并且计划再购买一些。
但是,当两个或多个相同类型的设备插入集线器时,lsusb
会列出该设备的多个实例。
例如。 Realtek wifi 适配器作为 USB id 0bda:f179
。如果有 3 个,则该 id 将出现 3 次。
Linux 有什么方法可以唯一地识别它们,不仅是当它们插入同一台机器时,而且在其他机器上也是如此?
例如,网络适配器上刻有 MAC 地址,USB 磁盘驱动程序也有一些与之关联的 ID,但我不知道这些无线适配器和蓝牙设备。
我希望它是他们的 MAC 地址,但在无线适配器中,当它们连接到我的接入点时,甚至在ifconfig
列表中,它总是不同的。我怀疑 Linux 每次都会给他们新的 MAC,除非是设备本身。
USB 标准是否指定了唯一标识每个设备的方式,无论它是什么类型?
答案1
在 Linux 中,您可以使用乌德夫系统根据各种标准为 USB 设备分配唯一标识符,例如设备的供应商和产品 ID、序列号或其在系统 USB 总线上的物理位置。这使您可以唯一地标识设备,即使它们具有相同的 USB ID。
要查找无线网络适配器的 MAC 地址,您可以使用ip或者如果配置命令。但是,正如您所注意到的,MAC 地址可能会根据设备所连接的网络而变化。这是因为出于隐私原因,某些无线适配器使用随机 MAC 地址。
蓝牙设备还具有称为蓝牙设备地址的唯一标识符(BD_ADDR),类似于 MAC 地址。可以使用 hcitool 或 bluetoothctl 命令查看BD地址蓝牙设备的。
关于USB标准,它确实为USB设备指定了唯一的序列号,但并非所有设备都有一个。如果设备确实有序列号,您可以使用它来唯一标识该设备。但是,如果设备没有序列号,您仍然可以使用其他条件(例如供应商和产品 ID)将其与具有相同 USB ID 的其他设备区分开来。
答案2
我想你已经回答了你自己的问题 - Linux 确实跟踪它们 - USB id 不是唯一的标识符,它标识设备的类型。当涉及磁盘驱动器和网卡时,将多个相同设备插入主机的情况并不罕见。内核首先枚举设备(基于发现的顺序),并根据设备类型和发现的顺序应用内部命名方案,然后是 udev可能应用备用命名系统(通常是为了使设备名称持久存在,无论它们被发现的顺序如何)。
通常,交换同一类设备的 2 个设备的物理连接将导致交换内核分配的名称。
如果设备类型具有内核已知的独特特征(请参阅 udevinfo),则可以配置 udev 以根据匹配这些属性应用备用名称。大多数设备都会显示序列号。Udev 还可以运行外部程序以在运行时发现要匹配的其他属性 - 另请参阅https://www.reactivated.net/writing_udev_rules.html