Weisen Sie einer bestimmten / dev / video # eine Webcam zu

8

Ich habe drei Webcams auf meinem Ubuntu-Server 14.04. Die Ausgabe von 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

Ich möchte jedem eine bestimmte / dev / video # zuweisen. Ich habe gelesen, dass ich in /etc/udev/rules.d/ eine udev-Regel erstellen muss, aber das meiste, was ich gelesen habe, scheint veraltet zu sein und ich möchte meinem Server keine Probleme bereiten. Ich dachte daran, eine 25-Namen-Video-Geräte.Regeln zu erstellen, die Folgendes enthalten:

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"

Das zusätzliche Problem, das ich habe, ist, dass 2 der 3 Webcams identisch zu sein scheinen (obwohl dies nicht der Fall ist, werden sie bei ebay gekauft und zur Überwachung eines anderen Bereichs verwendet). Was wären die Regeln für meinen Fall? Vielen Dank

bomberb17
quelle

Antworten:

7

Lösung ohne Udev-Regeln

Es besteht die Möglichkeit, dass video4linux Ihnen bereits stabile Gerätenamen zur Verfügung gestellt hat. Möglicherweise möchten Sie die Verzeichnisse /dev/v4l/by-id/und /dev/v4l/by-path/dafür überprüfen . Schließen Sie Ihre Geräte an verschiedene USB-Anschlüsse an und vergleichen Sie die erstellten Gerätenamen, um sicherzustellen, dass sie wirklich stabil sind.

Lösung mit Udev-Regeln

Ansonsten hängt es davon ab, ob Ihre beiden scheinbar identischen Geräte mindestens eine unterschiedliche Seriennummer haben, auf die udev zugreifen kann. Sie können dies herausfinden, indem Sie lsusbim folgenden Befehl die richtige Nummer für „Bus“ und „Gerät“ aus Ihrer Ausgabe verwenden:

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

Wenn im ersten Block von Schlüssel / Wert-Paaren eine Ausgabe wie die folgende vorhanden ist und die Seriennummer zwischen den beiden Geräten unterschiedlich ist, können Sie diese in Ihren udev-Regeln verwenden:

ATTR {serial} == "68974689267119892"

Ihre udev-Regeln könnten dann so aussehen:

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"

Wenn es keine Seriennummer (oder eine ähnliche eindeutige Nummer) gibt, sehe ich nur die folgende Möglichkeit: Sie müssten sicherstellen, dass Ihre Geräte immer an denselben USB-Anschlüssen angeschlossen bleiben. In diesem Fall könnten Sie Regeln wie diese verwenden:

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"

Sie müssten herausfinden, welche KERNELIDs verwendet werden sollen, indem Sie den udevadmoben genannten Befehl erneut ausführen und nach dem KERNELSchlüssel / Wert-Paar suchen .

Kleinere Anmerkungen

Es kann schöner / besser sein, nur neue Symlinks anstelle neuer Gerätenamen zu erstellen und diese möglicherweise sogar in einem gemeinsamen Verzeichnis zu gruppieren:

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

Die vorherige Regel würde beispielsweise einen Gerätesymlink bei erstellen /dev/foo/video10.

Ich würde wahrscheinlich auch einfach die Regeldatei benennen name-video-devices.rules, dh die führende Nummer weglassen. Es spielt wahrscheinlich keine Rolle, wann die Regeln ausgeführt werden, sodass keine (ziemlich hohe) Priorität von 25 verwendet werden muss.

Chriki
quelle
2
Korrigieren Sie mich, wenn ich falsch liege, aber es scheint, dass NAME nicht geändert werden kann, außer im Sonderfall von Netzwerkgeräten. Von man udev: NAME The name to use for a network interface. The name of a device node cannot be changed by udev, only additional symlinks can be created. Von udevadm test <devpath>:NAME="/dev/video99" ignored, kernel device nodes can not be renamed; please fix it in /etc/udev/rules.d/50-blah.rules:5
Knio