Udev 符号链接创建问题

Udev 符号链接创建问题

我正在编写一个 udev 规则来为 USB 摄像头创建符号链接,但它似乎不起作用。

以下行已添加到文件 /etc/udev/rules.d/99-econ.rules

但是我无法使符号链接工作。我尝试重新启动 udev 服务、重新启动计算机,以及拔下设备并将其重新插入计算机。

SUBSYSTEM=="video", ATTRS{idVendor}=="2560", ATTRS{idProduct}=="c110", ATTRS{serial}=="321CC601", SYMLINK+="usb_camera"

知道我做错了什么吗?

谢谢!

答案1

您的规则在语法上是正确的。但是您可能需要检查一些简单的事情。

0)去掉它ATTRS{serial}=="321CC601",。你不需要它(编辑->) 除非您有多个其他方面相同的设备,否则您需要通过序列号来区分。

1)确保正确识别您的 USB 设备。

# plug your device in a convenient usb port
$ lsusb  # <- check IDs for vendor and product
$ udevadm monitor --property 
# Above (^^^^) will monitor your device events continuously, 
# in particular every thing that is plugged/unplugged in a usb port.
# Unplug yr device and type CTRL-C in terminal to stop monitoring

2)检查您之前记下的 ID 是否udevadm monitor --property与您拔下设备时的输出相对应。

3)确保"SUBSYSTEM=="..."符合要求。
这可能是正确的,但对于带有存储区域的 USB 摄像头(我可能错误地认为这是你的情况),你主要看到的属性如下: ,,,,,,,...或者SUBSYSTEM=usb将test on 替换为test onSUBSYSTEM=scsi_hostSUBSYSTEM=scsiSUBSYSTEM=scsi_diskSUBSYSTEM=scsi_deviceSUBSYSTEM=scsi_generic

SUBSYSTEMID_TYPE=="..."

HTH。欢迎反馈。

答案2

如果您在video4linux子系统上进行匹配,则需要使用该级别上可用的属性。

要查看属性的层次结构,请使用分配给网络摄像头的udevam当前videoX设备:

$ udevadm info -a /dev/video0
  looking at device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0/video4linux/video0':
    KERNEL=="video0"
    SUBSYSTEM=="video4linux"
    DRIVER==""
    ATTR{dev_debug}=="0"
    ATTR{index}=="0"
    ATTR{name}=="GENERAL WEBCAM: GENERAL WEBCAM"
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0':
    KERNELS=="1-1.1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="uvcvideo"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="0e"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{iad_bFirstInterface}=="00"
    ATTRS{iad_bFunctionClass}=="0e"
    ATTRS{iad_bFunctionProtocol}=="00"
    ATTRS{iad_bFunctionSubClass}=="03"
    ATTRS{iad_bInterfaceCount}=="02"
    ATTRS{interface}=="GENERAL WEBCAM"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1':
    KERNELS=="1-1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{idProduct}=="2247"
    ATTRS{idVendor}=="1b3f"
    ATTRS{product}=="GENERAL WEBCAM"
    ATTRS{serial}=="JH0909_20201026_v004"
    ...

在这种情况下,您可以看到ATTRS{idProduct}ATTRS{idVendor}在带有 的块中定义SUBSYSTEMS=="usb",但不在带有 的块中定义SUBSYSTEM=="video4linux"。在该块中,没有产品或供应商 ID,也没有序列号。但是,在我的例子中,我可以使用 来ATTR{name}过滤此网络摄像头(因为我只连接了其中一个):

ACTION=="add", SUBSYSTEM=="video4linux", ATTR{name}=="GENERAL WEBCAM: GENERAL WEBCAM", SYMLINK+="webcamUsb"

欲了解更多信息,请务必阅读http://reactivated.net/writing_udev_rules.html

相关内容