【问题标题】:Create device symlink with udev based on device response, not udev device info根据设备响应而不是 udev 设备信息使用 udev 创建设备符号链接
【发布时间】:2011-04-15 22:17:40
【问题描述】:

我有三个不同的串行设备连接到三个 USB 串行转换器 (FTDI USB-RS232)。如果我连接它们,我会按预期获得通用设备名称 /dev/ttyUSBx。当我尝试编写一些 udev 规则时,udevadm 向我显示三个设备的相同输出,但某些设备序列号属性除外。

这些序列号会在每台设备上发生变化,因此如果我使用不同的 USB 串行转换器,我的规则将不再适用。因此,我需要一种与连接到串行转换器的特定设备通信并通过其响应识别它的方法。

"Writing udev rules" HOWTO,关于使用 PROGRAM 功能调用外部程序来命名设备的内容如下:

PROGRAM 用于运行产生设备名称的程序(除此之外它们不应该做任何事情)。在执行这些程序时,设备节点尚未创建,因此无法以任何方式对设备进行操作,

规则示例: SUBSYSTEM=="usb", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"

所以我无法从那里写入 /dev/ttyUSBx 来识别设备。然后,我有 RUN 功能,但它似乎无法创建新的 SYMLINK,因为 udev 不会得到 RUN 的输出。

规则示例: SUBSYSTEM=="usb", RUN="/bin/program"

我可以通过 RUN 脚本指示 udev 创建符号链接吗?或者我可以从那里手动创建该符号链接吗?

谢谢

【问题讨论】:

    标签: linux serial-port udev usbserial


    【解决方案1】:

    串口一连上电脑就自动盲聊是一件很可怕的事情。你确定你要这么做吗?首先,这将需要一些时间,如果 udev 在创建它之前必须等待结果,这将延迟设备节点的出现。如果设备碰巧断电或其串行端口断开连接,那么您将无法正确命名它(并且您需要超时才能检测到这一点)。最后,如果连接了您期望的设备之外的另一台设备,您可能会向它发送垃圾,从而产生意想不到的后果。

    您可以考虑依靠适配器的序列号来区分它们,并以一致的方式将每个适配器与外部设备相关联。如果您的适配器甚至真实序列号而不是像 00000000 这样的占位符字符串,那么您已经很幸运了!

    尽管如此,这就是你要做的。

    正如您所怀疑的,您不能使用RUN,因为太晚了,设备节点已经创建。你必须使用PROGRAM。在您的程序中,您将不得不使用mknod 自己创建设备节点,因为 udev 还没有完成它。您应该在临时位置创建一个临时节点并在程序退出之前将其销毁。

    ### Create the temporary device node in /tmp
    device="/tmp/udev_device_guesser.$$"
    # Note: mknod does not appear to be vulnerable to a symlink attack
    mknod "$device" c "$MAJOR" "$MINOR"
    
    ### Use this device node to query what's attached to the serial port
    insert your code here
    
    ### Get rid of the temporary node
    rm -f "$device"
    exit 0
    

    【讨论】:

    • 不错的解决方案。感谢您的详细解答
    【解决方案2】:

    实际上可以使用PROGRAM 根据设备响应创建设备符号链接,尽管有文档说明。它仅适用于符号链接,而不适用于设备名称。

    请注意,与您的 AFTER 匹配并指定 SYMLINK 的每条规则都应该是这样的,

    SYMLINK+=
    

    因此您的 SIMLINK 规范将与新的规范连接。在其他情况下,您的符号链接将被删除。

    了解udev 中发生了什么的最佳方法是将日志级别设置为调试:

    sudo udevadm control --log-priority=debug
    

    您可以在 /var/log/messages/var/log/syslog 中找到这些日志,具体取决于您的发行版。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 2011-11-02
      • 2012-01-15
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      相关资源
      最近更新 更多