Kann ich ein Gerät von under / dev für mehrere Hosts freigeben?

6

Hier ist die Situation. Ich habe ein Videogerät /dev/video0auf einem VMware-Server und möchte über eine virtuelle Maschine auf dieses Gerät zugreifen. Aus irgendeinem Grund kann ich das Gerät jedoch nicht direkt mit der VM verbinden, es muss jedoch mit dem Host verbunden sein.

Kann ich ein Gerät unter /devVerwendung von NFS, Samba, sshfs oder einem anderen Protokoll zwischen zwei Hosts freigeben, da unter Unix-Philosophie eigentlich alles nur eine Datei ist , damit ein Linux auf einem Server auf Geräte auf einem anderen Server zugreifen kann?

Josh
quelle
3
Einer der wenigen Fälle, in denen mein erster Gedanke ist: "Dies wäre einfacher, wenn Sie Plan 9 verwenden würden"
Steven D
@Steven D: Das war im Wesentlichen auch mein erster Gedanke :-)
SamB

Antworten:

9

Nein.

Sie können eine Gerätedatei über NFS oder ein anderes Netzwerkdateisystem exportieren. Die Bedeutung der Gerätedatei hängt jedoch von dem Computer ab, auf dem Sie sie öffnen. Wenn Sie /dev/video0über NFS von einem Server-Computer auf einen Client-Computer exportieren , sieht der Client-Computer nur "Zeichengerät 81: 0" und interpretiert es als sein eigenes Videoaufnahmegerät. Der Client-Computer muss nicht einmal dieselbe Gerätenummernzuweisung wie der Server haben. Beispielsweise würde ein OpenBSD-Client dieselbe Datei wie der Pseudo-Terminal-Treiber sehen , da sich char 81: 0 unter OpenBSD befindet.

Was Sie verlangen, wäre sehr schön, aber auch sehr schwer. Jede Anfrage auf dem Client müsste an den Server weitergeleitet werden und umgekehrt. Es müsste eine spezifische Unterstützung für einzelne Fahrer geben. Beispielsweise verlassen sich einige Treiber auf den gemeinsamen Speicher zwischen dem Prozess und dem Kernel, und eine transparente Unterstützung im gesamten Netzwerk wäre in vielen Fällen schwierig und unerschwinglich teuer. Ich weiß nicht, ob der Videoaufnahmetreiber gemeinsam genutzten Speicher verwendet, aber da er wahrscheinlich große Datenmengen asynchron überträgt, erwarte ich dies.

Linux bietet spezielle Unterstützung für Netzwerkblockgeräte . Sie sind nicht auf ein Netzwerkdateisystem angewiesen. Die Gerätedatei ist nur auf dem Client vorhanden, und ein Dämon auf dem Server emuliert ein physisches Blockgerät (es leitet die Vorgänge möglicherweise von und zu einem realen physischen Gerät weiter, liest und schreibt jedoch häufig in eine Image-Datei).

Sie sollten nach einer Lösung suchen, die speziell für die Videoaufnahme geeignet ist. Versuchen Sie, so viel datenintensiven Teil auf dem Computer auszuführen, an den das physische Gerät angeschlossen ist. Oder suchen Sie eine Lösung für eine virtuelle Maschine, die den direkten Zugriff auf das physische Gerät innerhalb der virtuellen Maschine unterstützt (ich weiß nicht, ob eine Host- / Gastlösung dies tut; Hypervisor-basierte Lösungen sind wahrscheinlicher).

Gilles 'SO - hör auf böse zu sein'
quelle
Netzwerkblockgerät. Danke für diesen Tipp! Genau das, wonach ich gesucht habe. Es ist eine großartige Möglichkeit, ddeine Festplatte ohne Verwendung eines Schraubendrehers auf eine andere Maschine zu übertragen.
Christian
1
@Christianssh root@othermachine cat /dev/sdb >/dev/sdc
Gilles 'SO- hör auf böse zu sein'
1
Ich weiß, dass es dumm ist, aber irgendwie vertraue ich catwichtigen Binärdaten nicht. Muss ein tief vergrabenes Trauma sein, an das ich mich nicht bewusst erinnere. Und nein, ich bin kein Hund; das ist es nicht.
Christian
2
@Christian Einige ältere Unix-Systeme hatten Textverarbeitungswerkzeuge, die Binärdaten nicht korrekt behandelten, aber ich bezweifle, dass dies jemals angewendet catwurde und auf jeden Fall catauf allen aktuellen Systemen funktioniert. GNU-Dienstprogramme (die unter Linux) haben Binärdaten immer korrekt behandelt, es war von Anfang an ein Entwurfsziel. Die Verwendung von ddBinärdaten ist eine Gewohnheit, die aus den Tagen der Magnetbänder stammt. Auf modernen Linux-Systemen ist dies nicht nur eine unnötige Komplikation, sondern sogar langsamer .
Gilles 'SO - hör auf böse zu sein'
Ok, vielleicht werde ich dann aktiv gegen meine irrationalen Einwände arbeiten;)
Christian
4

Zusätzlich zu Gilles Antwort - solange Sie nicht beabsichtigen, ioctls in einer Datei zu erstellen, handelt es sich lediglich um einen Stream. Also, wenn Sie vor Gast gelaufen sind

# mkfifo /dev/fakevideo0
# ssh host cat /dev/video0 > /dev/fakevideo0

/ dev / fakevideo0 verhält sich wie ein Puffer. Wenn Sie also davon lesen, erhalten Sie einen Stream von der Kamera.

Maciej Piechotka
quelle
Würde dieses Verfahren für die bidirektionale Kommunikation funktionieren? Zum Beispiel möchte ich dies mit einer seriellen Schnittstelle tun.
Portforwardpodcast
1
@portforwardpodcast Ich glaube nicht, dass es einfach funktionieren wird - Sie müssten es wahrscheinlich in eine Unix-Pipe einwickeln, damit Sie möglicherweise ein Programm / Skript auf beiden Seiten schreiben müssen.
Maciej Piechotka
1
Danke für die Rückmeldung. Ich habe gerade diese Seite gefunden, die hervorragend für Serien mit zwei Richtungen über tcp / ip funktioniert. Dest-unreach.org/socat/doc/socat-ttyovertcp.txt
portforwardpodcast
Dies funktioniert nicht gut für Video, da der Standard-Pipe-Puffer 4K
h4unt3r
0

Dies beantwortet die Frage von OP nicht, aber es gibt dieses Tool namens netevent unter https://github.com/Blub/netevent , mit dem Sie ioctl-Geräte /dev/input/event*zwischen Computern freigeben können . Ich habe es persönlich selbst versucht und es hat bei mir funktioniert.

Ritiek
quelle
Die ursprüngliche Frage des OP zu / dev / video ist längst irrelevant;) Ich bin schon lange von diesem alten Setup weggezogen. Aber netevent sieht für andere Situationen interessant aus ...
Josh