将网络摄像头分配给特定的/ dev / video#

我的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购买的,它们用于监控不同的区域)。 那么我的案例规则是什么? 谢谢

没有Udev规则的解决方案

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

使用Udev规则的解决方案

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

 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" 

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

次要说明

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

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

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

我可能还会简单地将规则文件name-video-devices.rules ,即保留前导号码。 执行规则时可能无关紧要,因此不需要使用(相当高的)25的优先级。