当 USB 设备在 Linux 中连接时,内核会为它们分配一个次设备号(即 中的 0 /dev/ttyUSB0
)。似乎如果我有一个设备/dev/ttyUSB0
,当我将其移除并插入新的 USB 设备时,新设备将获得一个不同的设备号。但是,如果我等待足够长的时间或添加足够的设备,最终将获得设备编号 0。内核如何决定何时重用设备编号 0?
有关更多上下文:我有大量 USB 设备连接到服务器,并且我使用次设备号来跟踪它们。我想检测何时添加新设备以及何时删除旧设备。我担心如果新设备可以分配与已删除的旧设备相同的设备编号,那么我将不知道该设备已被替换。
答案1
我将半回答我自己的问题:我找不到任何关于如何重用设备编号的明确文档,但我确实找到了一种为设备分配更唯一编号的方法。
诀窍是使用udev
的IMPORT
语句来生成随机数,例如以下规则:
KERNEL=="ttyUSB*", IMPORT{program}="/bin/bash -c 'echo FOORAND=$RANDOM'", SYMLINK+="my-device-%n-%E{FOORAND}"
将创建到 ttyUSB 设备的符号链接,例如/dev/my-device-0-3853
.当添加新设备时,它将获得一个新的随机数。
包含内核号 ( %n
) 以及随机数,以确保任一时刻存在的符号链接都是总是独特的。