没有 Udev 规则的解决方案

没有 Udev 规则的解决方案

我的 Ubuntu 服务器 14.04 上有三个网络摄像头。lsusb 的输出:

Bus 006 Device 002: ID 0bda:8153 Realtek Semiconductor Corp.
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 2537:1066
Bus 004 Device 002: ID 05e3:0616 Genesys Logic, Inc.
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 005: ID 1871:0101 Aveo Technology Corp. UVC camera (Bresser microscope)
Bus 003 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 003 Device 003: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 005: ID 046d:0807 Logitech, Inc. Webcam B500
Bus 001 Device 004: ID 1871:0101 Aveo Technology Corp. UVC camera (Bresser microscope)
Bus 001 Device 003: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

我想为每个设备分配一个特定的 /dev/video#。我读到过必须在 /etc/udev/rules.d/ 中创建一个 udev 规则,但我读到的大部分内容似乎都过时了,我不想给我的服务器造成问题。我考虑创建一个包含以下内容的 25-name-video-devices.rules:

SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="1871", SYSFS{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="1871", SYSFS{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="046d", SYSFS{idProduct}=="0807", NAME="video12"

我遇到的另一个问题是,3 个网络摄像头中有 2 个看起来完全相同(虽然它们不是,它们是从 ebay 购买的,用于监控不同的区域)。那么我的情况应该遵循什么规则?谢谢

答案1

没有 Udev 规则的解决方案

video4linux 可能已经为您提供了稳定的设备名称。您可能需要检查目录/dev/v4l/by-id//dev/v4l/by-path/进行检查。将您的设备连接到不同的 USB 端口并比较创建的设备名称以确保它们确实稳定。

使用 Udev 规则的解决方案

否则,这取决于您的两个看似相同的设备是否至少具有不同的序列号,而该序列号可由 udev 访问。您可以lsusb在以下命令中使用输出中的正确“总线”和“设备”编号来找到这一点:

udevadm info --attribute-walk /dev/bus/usb/003/005

如果在第一个键/值对块中存在类似以下的输出,并且两个设备之间的序列不同,那么您可以在 udev 规则中使用它:

ATTR{序列号}=="68974689267119892"

你的 udev 规则可能如下所示:

SUBSYSTEM=="usb", ATTR{serial}=="68974689267119892", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="usb", ATTR{serial}=="12345698798725654", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="0807", NAME="video12"

如果有序列号(或类似的唯一)则我只看到以下可能性:您必须确保您的设备始终连接到相同的 USB 端口。在这种情况下,您可以使用以下规则:

SUBSYSTEM=="usb", KERNEL=="2-3", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="usb", KERNEL=="2-4", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="usb", KERNEL=="2-2", ATTR{idVendor}=="046d", ATTR{idProduct}=="0807", NAME="video12"

KERNEL您必须通过再次运行udevadm上面提到的命令并查找KERNEL键/值对来找出要使用的ID。

次要说明

只创建新的符号链接而不是新的设备名称可能会更好/更好,甚至可以将它们分组在一个公共目录下:

SUBSYSTEM=="usb", KERNEL=="2-3", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", SYMLINK+="foo/video10"

例如,前面的规则将在 处创建设备符号链接/dev/foo/video10

我可能还会简单地命名规则文件name-video-devices.rules,即省去前导数字。规则的执行时间可能并不重要,因此无需使用 (相当高的) 优先级 25。

相关内容