在 Linux 上如何创建 by-id?

Pit*_*kos 7 linux id dev

在端口上粘贴一个 USB 微控制器(类似于 Arduino)会创建这两个文件:

/dev/serial/by-id/usb-MBED_MBED_CMSIS-DAP_10105a42e87da33c103dccfb6bc235360a97-if01
/dev/disk/by-id/usb-MBED_microcontrolleur_10105a42e87da33c103dccfb6bc235360a97-0:0
Run Code Online (Sandbox Code Playgroud)

在这种情况下,id 是由程序动态生成的还是硬编码在设备本身的某个地方?

如果它是动态创建的:

  1. 它是如何精确创建的?
  2. 它只存在于 Linux 机器上吗?

Ale*_* P. 6

by-id符号链接是按udev规则创建的(并且特定于使用 的操作系统udev

您可以在以下位置找到具体规则/lib/udev/rules.d

对于serial以下设备60-persistent-serial.rules

ENV{.ID_PORT}=="", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$env{ID_USB_INTERFACE_NUM}"
ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$env{ID_USB_INTERFACE_NUM}-port$env{.ID_PORT}"
Run Code Online (Sandbox Code Playgroud)

对于disk以下设备60-persistent-storage.rules

KERNEL=="sd*|sr*|cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
Run Code Online (Sandbox Code Playgroud)


lem*_*eze 6

文件名由udev生成,但里面的id来自设备本身:

如果您运行lsusb -v并搜索它,您会发现它是设备的序列号:

...
iManufacturer        MBED
iProduct             microcontrolleur
iSerial              10105a42e87da33c103dccfb6bc235360a97
Run Code Online (Sandbox Code Playgroud)

或类似的东西。


这是怎么发生的?

假设 U 盘安装在/mnt/tmp. 在我的系统上,我得到:

$ udevadm info --device-id-of-file /mnt/tmp
8:17
Run Code Online (Sandbox Code Playgroud)

现在运行它并搜索8:17

$ udevadm info --export-db | less
...
P: /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1
N: sdb1
W: 61
S: block/8:17
S: disk/by-id/usb-pqi_IntelligentStick_AA04212900042956-0:0-part1
Run Code Online (Sandbox Code Playgroud)

这为我们提供了与 udevadm 一起使用的设备路径。运行它并搜索您的设备 ID(AA042...在我的情况下)

$ udevadm test /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1 2>&1 | less
...
udev_rules_apply_to_event: LINK 'disk/by-id/usb-pqi_IntelligentStick_AA04212900042956-0:0-part1' /lib/udev/rules.d/60-persistent-storage.rules:31
Run Code Online (Sandbox Code Playgroud)

这为我们提供了所有 udev 规则 + 应用的行号(60-persistent-storage.rules:31等)

这是文件名的来源:

$ /lib/udev/usb_id /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb
pqi_IntelligentStick_AA04212900042956-0:0
Run Code Online (Sandbox Code Playgroud)