Linux Surface Cams arbeiten endlich, unter Fedora 38

Das war ja schon immer der Genickbruch, wenn man einem Windowsfan sein Linuxsurface unter die Nase gerieben hat und dann gingen die Kameras nicht. Nun, das hat ein Ende, dank Fedora 38 Bleeding Edge.

Linux Surface Cams arbeiten endlich, unter Fedora 38

Ich hatte ja schon vor einiger Zeit berichtet, daß meine Frontkamera Ihren Dienst aufgenommen hat, aber die Rückkamera noch nicht lief. Das ist jetzt mit libcamera 0.0.4 Geschichte. Alles was es für den Erfolg brauchte, war ein Toolbox Container mit Fedora 38 minimal, Cheese und LibCamera Installation 🙂

Mein Stable OS ist z.Z. auf dem Tablet noch Fedora 36. Da gabs es die passende Version von Libcamera nicht für, für F37 auch nicht, aber das ist eine andere Sache 😉 Wenn Ihr also ein Surface habt und Eure Cams endlich nutzen wollt, dann macht Ihr genau das hier:

$ toolbox create -d fedora -r 38 && toolbox enter fedora-toolbox-38
$ sudo dnf install libcamera* cheese
$ qcam
oder
$ cheese

Das war es schon. Zugegeben, noch etwas unhandlich, weil man die Toolbox starten muß, aber bestimmt automatisierbar. Wer Toolbox nicht kennt, wir hatten dazu im Linux am Dienstag schon mal einen Vortrag wegen DNF5 Tests. Toolsbox ist ein CLI-Frontend für Podman, was wiederum ein Dockerderivat ist. Container, die man für Docker erzeugt hat, funktionieren damit auch. So ein Container ist ein bisschen umständlich zu beenden, aber ansonsten ganz harmlos 😉

Der Vorteil von Podman über Docker ist, daß Docker nur mit Kerneln zurecht kommt, die keine C2groups benutzen, was bei Fedora voreingestellt ist. Deswegen macht es mehr Sinn Podman zu nutzen.

Genug geredet, ein Bild muß her 😀

Rearcam 1280×720 Surface Pro 4

Das Bild sieht noch abartig aus, weil weder die automatische Helligkeitsregelung sinnvoll arbeitet, noch der Autofocus, von der SD Auflösung wollen wir gar nicht erst anfangen 😉 Ach ja, das Bild ist zu allem Überfluß auch noch spiegelverkehrt 😀

Das wird schon werden, so in 6 weiteren Jahren 😉

Die Platte in Tokyo einhängen

Die Idee ist schon fast zehn Jahre alt, aber es hat wohl eine Weile gedauert bis es funktioniert hat. Der Traum in Tokyo ein USB-Gerät in einen PC zu hängen und in Kenia zu benutzen, funktioniert tatsächlich. Die Lösung lautet: USBIP

Wie funktioniert das ?

Es gibt einen USBIP-Server und einen Clienten. Der Server bindet Geräte ein und stellt Sie im Netz zur Verfügung. Der Server sorgt auch dafür, daß das Gerät lokal nicht mehr zur Verfügung steht. Damit kann es bei der Benutzung keine Kollisionen geben. Der Client verbindet sich zum Server und bindet das USB-Gerät dann lokal ein und stellt es, wie jedes andere Gerät zur Verfügung.

Damit das funktioniert müssen einige Kernel-Module geladen werden. Praktischerweise ist alles was man so braucht im Paket dabei. Alles in allem ein ziemlich übersichtlicher Vorgang.

Die Installation

Die Installation ist ganze einfach:

sudo dnf -y install usbip

Das wars schon.

WARNUNG

Wie man im Beispiel sehen wird, greifen die Befehle direkt auf IP Adressen zu. D.h. wenn Ihr ein Gerät freigebt, kann jeder, der es über das Netzwerk erreichen kann, es auch benutzen. Das kann im Einzelfall ein Problem werden. Daher ist eine Begrenzung des Zugriffs per IP-Firewall zwingend notwendig.

Der USBIPd stellt die Option zur Verfügung, sich auf einen bestimmten Port zubinden :

–tcp-port PORT Listen on TCP/IP port PORT.

Damit kann man, zumindest theoretisch, mehrere Dienste parallel benutzen und somit die Freigabe per Firewall regeln.

Beispiel – Eine Kamera benutzen

Der Server hat IP 192.168.0.103. Auf dem wurden zur Vorbereitung folgende Befehle ausgeführt:

[root@warrior marius]# modprobe usbip-host
[root@warrior marius]# usbipd &

nun müssen wir natürlich noch wissen, welches Device wir überhaupt freigeben müssen:

[root@warrior marius]# usbip list -l
– busid 2-3 (0ac8:0302)
Z-Star Microelectronics Corp. : ZC0302 Webcam (0ac8:0302)

[root@warrior marius]# usbip bind -b 2-3
usbip: info: bind device on busid 2-3: complete

„usbip list -l“ listet die zur Verfügung stehenden lokalen Geräte auf.
„usbip bind -b 2-3“ bindet das USB Gerät mit der ID 2-3 an den usbipd, so daß es exportiert werden kann.

Auf der Clientseite ist das ähnlich einfach:

[root@eve marius]# modprobe vhci-hcd

Das Kernelmodul i.d.R. immer nötig, es können aber auch andere Module zusätzlich benötigt werden.

[root@eve marius]# usbip list -r 192.168.0.103
Exportable USB devices
======================
– 192.168.0.103
2-3: Z-Star Microelectronics Corp. : ZC0302 Webcam (0ac8:0302)
: /sys/devices/pci0000:00/0000:00:14.0/usb2/2-3
: (Defined at Interface level) (00/00/00)

Wie man sehen kann, ist das Gerät jetzt verfügbar. Nun müssen wir es noch lokal einfügen:

[root@eve marius]# usbip attach -r 192.168.0.103 -b 2-3

und nun können wir es benutzen, da es wie jede andere WebCam als Videogerät zur Verfügung gestellt wurde:

[root@eve marius]# camorama -d /dev/video0
… jede Menge unnötige Fehlermeldungen später …
name = medium
name = large

Wenn man es wieder abmelden will, muß man den lokalen USBIP Port kennen:

[root@eve marius]# usbip port
Imported USB devices
====================
Port 00: <Port in Use> at Full Speed(12Mbps)
Z-Star Microelectronics Corp. : ZC0302 Webcam (0ac8:0302)
12-1 -> usbip://192.168.0.103:3240/2-3
-> remote bus/dev 002/004
[root@eve marius]# usbip detach -p 00
usbip: info: Port 0 is now detached!

Das wars. Jetzt noch auf dem Server mit unbind entfernen:

[root@warrior marius]# usbip unbind -b 2-3
usbip: info: unbind device on busid 2-3: complete

und das Gerät ist wieder lokal benutzbar.

Anwendungen

Per SSH-VPN könnte man damit z.b. WebCams in Rechenzentren benutzen, oder Festplatten einbinden, die vollverschlüsselt sind, auch wenn der „Server“ kompromittiert wurde, denn die Verschlüsselung läuft auf dem lokalen Rechner, ein MITM-Angriff kann damit nicht stattfinden. USB-Tastaturen und Mäuse würden auch lustige Sachen erlauben 😉