在Linux系统中,udev是一个设备管理工具,它负责动态管理设备节点,为系统中的硬件设备提供统一的命名和管理机制。通常情况下,很多人会使用UUID(通用唯一识别码)来进行udev规则的配置,因为UUID具有唯一性,能确保设备的准确识别。在某些场景下,我们可能不希望使用UUID来做udev,比如当设备的UUID不可靠或者我们更倾向于根据设备的其他特性来进行管理时。

不用UUID做udev,我们可以通过设备的硬件信息来配置udev规则。设备的硬件信息包含了很多可以用于识别设备的关键内容,例如设备的厂商ID、产品ID、序列号等。以USB设备为例,每个USB设备都有其独特的厂商ID和产品ID,这些信息可以在设备插入系统时被检测到。我们可以利用这些信息来编写udev规则,从而实现对设备的管理。
要获取设备的硬件信息,我们可以使用一些工具。例如,`lsusb` 命令可以列出系统中所有的USB设备,并显示它们的厂商ID和产品ID。假设我们有一个USB存储设备,通过 `lsusb` 命令得到其厂商ID为 `0x1234`,产品ID为 `0x5678`,我们就可以基于这些信息来编写udev规则。
编写udev规则的文件通常存放在 `/etc/udev/rules.d/` 目录下,我们可以创建一个新的规则文件,比如 `99-usb-storage.rules`。在这个文件中,我们可以使用以下规则来识别并命名该USB存储设备:
“`plaintext
SUBSYSTEM==”block”, ATTRS{idVendor}==”1234″, ATTRS{idProduct}==”5678″, SYMLINK+=”my_usb_storage”
“`
上述规则的含义是:当检测到一个块设备(`SUBSYSTEM==”block”`),并且其厂商ID为 `1234`,产品ID为 `5678` 时,为该设备创建一个符号链接 `my_usb_storage`。这样,无论该设备被分配到哪个设备节点(如 `/dev/sdb` 或 `/dev/sdc` 等),我们都可以通过 `my_usb_storage` 这个符号链接来访问它。
除了厂商ID和产品ID,序列号也是一个重要的识别信息。有些设备的序列号是唯一的,我们可以通过序列号来更精确地识别设备。同样,我们可以使用 `udevadm info` 命令来获取设备的序列号信息。假设我们得到了一个USB设备的序列号为 `ABC123`,我们可以编写如下规则:
“`plaintext
SUBSYSTEM==”block”, ATTRS{serial}==”ABC123″, SYMLINK+=”unique_usb_device”
“`
使用设备的硬件信息来配置udev规则,相比使用UUID有一些优势。硬件信息通常更加稳定,不受设备分区或者文件系统的影响。例如,当设备的分区被重新格式化时,UUID可能会发生变化,但设备的厂商ID、产品ID和序列号一般不会改变。硬件信息可以更直观地反映设备的特性,方便我们进行设备管理和调试。
也需要注意一些问题。使用硬件信息进行udev规则配置时,可能会存在设备信息重复的情况。比如,不同批次的同一款设备可能具有相同的厂商ID和产品ID,这就需要结合其他信息(如序列号)来进行区分。
在Linux系统中不用UUID做udev是可行的,通过利用设备的硬件信息,我们可以实现灵活、稳定的设备管理。这种方法在实际应用中具有重要的意义,特别是在对设备管理有特殊需求的场景下,能够更好地满足用户的个性化需求。
