LXC Container USB Geraete durchreichen

OCCU für Betriebssysteme basierend auf Debian

Moderator: Co-Administratoren

Antworten
quickmic
Beiträge: 518
Registriert: 20.01.2011, 14:39
Hat sich bedankt: 5 Mal
Danksagung erhalten: 4 Mal

LXC Container USB Geraete durchreichen

Beitrag von quickmic » 13.01.2019, 10:28

Fuer CCUs die in LXC Containern laufen, gibt es immer wieder die Frage wie man USB Geraete durchgereicht bekommt.

Ein kurzes Vorwort zu LXC.
LXC ist ein Containerformat was bedeutet es ist KEIN Betriebssystememulator. Es wird keine CPU emuliert wie z.b. bei qemu. Das hat vor und Nachteile.
Groesster Vorteil, weit weniger Ressourcenverbrauch. Nachteil, man verwendet den Kernel des Hosts und ist nicht so flexibel. z.b. Windows geht in LXC nicht, es muss ja der Windowskernel verwendet werden. Auch ARM-Kernels laufen nicht via LXC aus dem selben Grund (nicht ganz richtig, aber ich spreche hier nur von x86/amd64 Installationen des Hosts).
btw, Docker basiert auf dem selben Konzept und ist nur eine Abwandlung von LXC.
Wenn beide Moeglichkeiten zur Verfuegung stehen, wurde ich immer LXC bevorzugen aber das ist Geschmackssache.
Docker basiert urspruenglich ebenfalls auf LXC -> https://de.wikipedia.org/wiki/Docker_(Software)

https://www.techdivision.com/blog/lxc-v ... f-lxc.html

Zum Durchreichen (auf Proxmox LXC):
Wie gesagt verwendet LXC den Kernel des Hosts. Deshalb muessen auch Kerneloperationen am Host durchgefuehrt werden damit auch die Container (VMs) diese nutzen koennen.
Konkretes Beispiel, man will den HMIP-Stick im Container verwenden. Das erfordert ein Laden von Kernelmodulen.... Folgende 2 Kommandos:

Code: Alles auswählen

modprobe cp210x
sh -c 'echo 1b1f c020 > /sys/bus/usb-serial/drivers/cp210x/new_id
Diese muessen am Host getriggert werden (am Besten irgendwo waehrend des Bootprozesses (Austostart)).
Wenn das erledigt ist, wird ein neues serielles Geraet am Host erstellt. z.b. /dev/ttyUSB0.
Jetzt fehlt noch die Durchreichung an den CCU Container. Dazu muss man zuerst die IDs des Geraetes herrausfinden.

Da wir im Falle des HMIP Stick das /dev/ttyUSB0 durchreichen muessen, checken wir die IDs:

Code: Alles auswählen

ls -l /dev/ttyUSB0
Ausgabe:

Code: Alles auswählen

crw-rw---- 1 root dialout 188, 0 Jan 13 10:07 /dev/ttyUSB0
Das sind unsere IDs: "188, 0"
Im Falle von Proxmox muss das nun durchgereicht werden. Dazu muss die Config des Containers bearbeitet werden:
Bei mir hat die CCU VM die ID 212 (sieht man in der WebUI von Proxmox). Die bearbeiten wir also z.b. mit nano:

Code: Alles auswählen

nano /etc/pve/lxc/212.conf
Und schreiben was unten dazu:

Code: Alles auswählen

lxc.cgroup.devices.allow: c 188:0 rwm
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
fertig. Damit das uebernommen wird, Container Stop/Start. Nicht rebooten, da wird die Config nicht neu geladen.


Jetzt zum HM-CFG-USB2. Da ist das etwas komplizierter aber gleiches Prinzip.
Der HM-CFG-USB2 ist kein serielles Geraet.

Wir lassen uns die IDs der usb Gerete amzeigen mittels "lsusb"
Da kommt dann ca sowas raus:

Code: Alles auswählen

Bus 012 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 011 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 009 Device 005: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 009 Device 006: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 009 Device 004: ID 2109:2812 VIA Labs, Inc. VL812 Hub
Bus 009 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 009 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 009 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 010 Device 002: ID 2109:0812 VIA Labs, Inc. VL812 Hub
Bus 010 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 1b1f:c00f eQ-3 Entwicklung GmbH HM-CFG-USB/HM-CFG-USB-2 [HomeMatic Configuration adapter]
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Hier sehen wir also bereits das Geraet:

Code: Alles auswählen

Bus 004 Device 002: ID 1b1f:c00f eQ-3 Entwicklung GmbH HM-CFG-USB/HM-CFG-USB-2 [HomeMatic Configuration adapter]
Bus ist 004, Device ist 002. Jetzt mussen wir weitere IDs checken anhand dieser Infos:

Code: Alles auswählen

ls -l /dev/bus/usb/004/002
Dann kommt sowas raus:

Code: Alles auswählen

crw-rw-r-- 1 root root 189, 385 Jan 13 10:20 /dev/bus/usb/004/002
Das sind nun unsere IDs "189, 385" (wie oben beim HMIP-Stick) die wir durchreichen muessen.
Wieder muss die Container-config Datei geaendert werden. In meinem Falle so:

Code: Alles auswählen

lxc.cgroup.devices.allow: c 189:385 rwm
lxc.mount.entry: /dev/bus/usb/004/002 dev/bus/usb/004/002 none bind,optional,create=file
Fertig


Bei anderen LXC Implementierungen laueft das System gleich, die Config des Containers und die Speicherorder der Configs werden aber anders sein.

DerGraf
Beiträge: 46
Registriert: 23.09.2016, 17:45
Danksagung erhalten: 1 Mal

Re: LXC Container USB Geraete durchreichen

Beitrag von DerGraf » 30.03.2019, 11:14

Sehr gute Anleitung.

Ich bevorzuge allerdings zusätzlich die Erstellung eines eigenen Devices. Damit gibt es keinen Ärger bei einer Portänderung wie z.B. beim einfachen USB Stecker umstöpseln.

Zur Geräte ID wird noch die Seriennummer benötigt. Herauszufinden ist diese Seriennummer mit

Code: Alles auswählen

udevadm info --name=/dev/ttyUSB0 --attribute-walk
Dann einfach nach ATTRS{serial}=="*******" Ausschau halten.

Anschießend wird am Host eine "udev Regel" unter /etc/udev/rules.d/ erstellt. Beispiel:

Code: Alles auswählen

nano /etc/udev/rules.d/99-usb-serial.rules

Dort wird dann die Regel mit den entsprechenden Geräte-IDs, der Seriennummer und dem neuen Gerätnamen eingefügt. Ein Beispoel für HMIP-RF-USB:

Code: Alles auswählen

SUBSYSTEM=="tty", ATTRS{idVendor}=="1b1f", ATTRS{idProduct}=="c020", ATTRS{serial}=="3014***************", SYMLINK+="hmip-rfusb"
Abspeichern, fertig. Ein

Code: Alles auswählen

udevadm trigger
erledigt den Rest. Nun sollte es ein /dev/hmip-rfusb geben, welches dann wie in der Anleitung beschrieben an den Container durchgereicht wird, mit dem einzigem Unterschied das nicht /dev/ttyUSB0 sondern /dev/hmip-rfusb durchgereicht werden muss.

Code: Alles auswählen

lxc.mount.entry: /dev/hmip-rfusb dev/ttyUSB0 none bind,optional,create=file
Hoffentlich ist es einigermaßen Verständlich :lol:

Gruß DerGraf
126 Kanäle in 28 Geräten und 15 CUxD-Kanäle in 5 CUxD-Geräten
CCU2 Firmware 2.41.9 - CUxD 2.10 - eMail 1.6.8 - XML-API 1.18

quickmic
Beiträge: 518
Registriert: 20.01.2011, 14:39
Hat sich bedankt: 5 Mal
Danksagung erhalten: 4 Mal

Re: LXC Container USB Geraete durchreichen

Beitrag von quickmic » 25.05.2019, 19:33

Gute Idee, ich habe die Rules fuer meine USB Webcams, die ich als Ueberwachungskameras verwende, entsprechend modifiziert.
Hatte mich immer genervt, dass nach einem Server-Reboot die Reihenfolge manchmal anders geladen wurden und ich oft die config aendern musste.

ikuzus600
Beiträge: 3
Registriert: 04.12.2022, 11:55
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 1 Mal

(gelöst) Re: LXC Container USB Geraete durchreichen

Beitrag von ikuzus600 » 04.12.2022, 12:05

Ist für mich gelöst! Bin auf RaspberryMatic in einer VM umgestiegen. Damit klappt es.


@quickmic

Hi, ich habe Probleme mit dem Durchreichen des HM-IP Stick. Er wird zwar im LXC mit vollen Rechten angezeigt, ich kann ihn aber in der HM WebGui nicht finden. Der CFG-USB Stick hingegen funzt einwandfrei. Den IP Stick habe ich analog zum CFG Stick an den LXC durchgereicht.

Diese Vorgehensweise klappt bei mir nicht ====>
"Zum Durchreichen (auf Proxmox LXC):
Wie gesagt verwendet LXC den Kernel des Hosts. Deshalb muessen auch Kerneloperationen am Host durchgefuehrt werden damit auch die Container (VMs) diese nutzen koennen.
Konkretes Beispiel, man will den HMIP-Stick im Container verwenden. Das erfordert ein Laden von Kernelmodulen.... Folgende 2 Kommandos:
CODE: ALLES AUSWÄHLEN

modprobe cp210x
sh -c 'echo 1b1f c020 > /sys/bus/usb-serial/drivers/cp210x/new_id
Diese muessen am Host getriggert werden (am Besten irgendwo waehrend des Bootprozesses (Austostart)).
Wenn das erledigt ist, wird ein neues serielles Geraet am Host erstellt. z.b. /dev/ttyUSB0."

==> Ich erhalte kein Gerät in /dev/ttyUSB* vom IT-Stick aus. Wenn ich die Befehle manuell ausführe, komme ich bei sh -c..... in eine Shellausgabe ähnlich einer Influx-DB?? Wenn ich den Befehlssatz in die fstab integriere, komme ich nicht mehr auf die PVE-WebGui.
Kannst Du bitte die genaue Vorgehensweise zum korrekten Einbinden in die PVE aufzeigen?

Danke Dir.

Gruß

Antworten

Zurück zu „x86-CCU“