Vorschau

Proxmox: USB Passthrough für LXC Container (Z-Wave UZB1)

Proxmox: USB Passthrough an LXC Container (UZB-1 Z-Wave USB Stick)

Zusätzlich zum Proxmox und Proxmox: LXC Tutorial möchte ich heute gerne zeigen, wie man einen USB Stick zu einem Container durchreicht. Ich habe so meinen UZB1 Z-Wave USB Stick zu einer LXC mit Ubuntu und FHEM durchgereicht. Analog dazu kannst du jeden CUL oder andere USB-Geräte durchreichen.

Inhalt

Vorbereitungen in Proxmox

Als erster wählen wir uns über SSH in unseren Proxmox Server ein.

ssh root@192.168.178.XX

Nun stoppen wir den LXC Container, an den das USB-Gerät durchgereicht werden soll

pct stop 113

Die Nummer enspricht deiner VM / LXC – ID in Proxmox. Diese findest du im Proxmox Webinterface heraus

Mit folgendem Befehl kannst du nun die verbundenen USB-Geräte auflisten. Es empfiehlt sich zuerst eine Auflistung ohne eingesteckten USB-Stick anzufertigen und dann nochmal, nachdem der Stick eingsteckt wurde

lsusb

Wie du auf dem folgendem Screenshot erkennen kannst, heißt mein UZB1 Stick „Sigma Designs, Inc. und hat die BUS Nummer 1 und Device Nummer 18. Du hast vermutlich eine andere Nummer -> notiere dir diese.

Shell Screenshot

Mittels folgendem Befehl kannst du nun den DeviceTree anzeigen. Wichtig: Trage hier deine BUS und DEVICE Nummer ein

ls -l /dev/bus/usb/001/018

Es werden erneut zwei Zahlen ausgegeben, wobei nur die erste für uns relevant ist

crw-rw-r– 1 root root 189, 17 Jul 12 18:35 /dev/bus/usb/001/018

Die Nummer 189 notierst du dir ebenfalls. Als nächstes müssen wir die Konfigurationsdatei für den LXC Container finden und editieren. Höchstwahrscheinlich findest du deine Konfigurationsdatei unter /etc/pve/nodes/pve/lxc – Schaue dazu am besten noch im Proxmox Webinterface welche ID dein Container hat.

Mit folgendem Befehl wechselst du in den Ordner mit den Konfigurationsdateien

cd /etc/pve/nodes/pve/lxc

mit „ls“ kannst du dir dann den Ordnerinhalt anzeigen lassen

Shell Screenshot

nano 113.conf

Hier fügen wir folgende Zeilen am Ende der Datei ein

lxc.cgroup.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/bus/usb/001/018 dev/bus/usb/001/018 none bind,optional,create=file

Trage hier entsprechend die BUS und Devicenummer, sowie die Nummer bei der Ausgabe von ls -l /dev/bus ….. ein

In meinem Fall mit dem UZB1 hat das aber noch nicht ausgereicht. Es wird ein Gerät mit dem Namen ttyACM0 angelegt. Dieses müssen wir ebenfalls durchreichen

Führe folgenden Befehl aus und notiere dir wieder die erste Nummer

ls -l /dev/ttyACM0

Dann bearbeiten wir nochmal die LXC Konfig-Datei:

sudo nano 113.conf

Und fügen am Ende nochmal zwei Zeilen hinzu

lxc.cgroup.devices.allow: c 166:* rwm
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file

Am Ende sieht die Konfig-Datei in etwas so aus:

Dann statten wir das Gerät ttyACM0 noch mit den nötigen Rechten aus

chmod o+rw /dev/ttyACM0

Zuletzt starten wir den LXC Container erneut und können im nächsten Punkt überprüfen, ob alles soweit geklappt hat

pct start 113

Überprüfung im Container

Verbinde dich mittels SSH mit deinem LXC

ssh NUTZERNAME@IP-ADRESSE

mit „lsusb“ kannst du dir auch hier die USB-Geräte anzeigen lassen. Ob das Gerät ttyACM0 angelegt wurde erfährst du unter den Devices:

Shell Screenshot

cd /dev
ls

Fazit

Zugegeben, ein wenig kompliziert ist es leider schon, allerdings funktioniert es wirklich einwandfrei. Wenn du dieses Tutorial auch bei anderen Geräte erfolgreich getestet hast würde ich mich über einen kurzen Kommentar freuen und könnte dies diesem Artikel hinzufügen.

Über den Author

Emanuel

teilt seine Begeisterung im Bereich Technik, DIY und Hausautomatisierung gerne auf seinem Blog coldcorner.de

Abonnieren
Benachrichtige mich bei
27 Kommentare
Ältester
Neuster Am meisten bewertet
Inline Feedbacks
View all comments
Baerny
5 Jahre zuvor

Hallo Emanuel, ich habe alles genau so gemacht wie beschrieben. Installiert habe ich Debian 9.3. Jetzt wollte ich einen USB Stick wie hier beschrieben durchreichen. Leider scheitert es schon an dem ersten Befehl „pct stop 102“. Es kommt dann „command not found.“ Auch der Befehl lsusb wird mit „command not found“ beantwortet. Hast du eine Idee woran es liegen könnte.

RoDo
Reply to  Baerny
5 Jahre zuvor

Für lsusb musst du da erst folgendes installieren:

sudo apt-get install usbutils

Andy
5 Jahre zuvor

Hallo,

ich steige gerade vom Raspy auf einen Nuc8i3 um. Von diesem Blog inspiriert nutze ich Proxmox und LXC. Das hat soweit auch geklappt und fhem läuft bereits.

Jetzt versuche ich den JeeLink vom Raspberry an den Nuc zu bekommen und bin dabei wie oben beschrieben vorgegangen. Leider stoße ich hier aber auf Probleme.

lsusb funktioniert noch und bringt folgende Antwort

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 8087:0aaa Intel Corp.
Bus 001 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Dabei ist der Future Technology Devices International der JeeLink

Bei ls -la /dev/ttyACM* treten Probleme auf und ich bekomme folgende Antwort:

ls: cannot access ‚/dev/ttyACM*‘: No such file or directory

ls -la /dev/ttyUSB* sieht dann wieder besser aus:

crw-rw—- 1 root dialout 188, 0 Feb 19 11:54 /dev/ttyUSB0

Laut Anleitung benötige ich aber auch die Werte der ttyACM abfrage.

Hast Du eine Idee weshalb bei mir hier die Fehlermeldung kommt und wie ich das Problem lösen kann?

Felix
Reply to  Andy
5 Jahre zuvor

Hallo Andy,
bist du weiter gekommen? Habe ein ähnliches Problem mit einem 3D-Drucker…

Bzgl. fhem habe ich das so gelöst, dass ich fhem unter proxmox laufen habe und den CUL an einem Raspi mit Raspbian. Den CUL kannst du dann mit ser2net o.Ä. an die VM weiterreichen. Damit hast du dann die Performace der VW und den CUL trotzdem angebunden (ggf. sogar dezentral, das war bei mir der ausschlaggebende Punkt – großer Server steht im Keller und CUL aufgrund der Reichweite im Erdgeschoss).

Viele Grüße
Felix

Arne
Reply to  Andy
5 Jahre zuvor

Hi,

ich habe da ein ähnlich gelagertes Problem. Ich hatte testweise einen CUL von meinem (noch produktiven) Raspberry Pi abgezogen und mittels dieser Anleitung auch durchgereicht bekommen. Nun habe ich das gleiche (der CUL steckt inzwischen wieder im Raspi) mit einem Bluetooth-Stick probiert.
Der BT-Stick hat die gleichen Daten, wie vorher der CUL (gleicher Steckplatz), in meinem Fall 002/002, nach Umstecken in einen anderen Port dann 002/003.

root@pve:~# lsusb
Bus 001 Device 002: ID 8087:8001 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ls -l /dev/bus/usb/002/003 liefert dann aber ein unerwartet Ergebnis:
crw-rw-r– 1 root root 189, 130 Jun 6 08:22 /dev/bus/usb/002/003
Hier werden also zwei Nummern ausgegeben, die 189 hatte ich auch beim CUL (und nur die) angezeigt bekommen. Daher habe ich mal vermutet, dass 130 hier die richtige Nummer wäre.

DIe 100.conf sieht so aus:
lxc.cgroup.devices.allow: c 130:* rwm
lxc.mount.entry: /dev/bus/usb/002/003 dev/bus/usb/002/003 none bind,optional,create=file

Aber ls -la /dev/ttyACM* liefert mir dann das gleiche Ergebnis wie bei Andy.

Stephan
5 Jahre zuvor

Hallo,
ich habe das gleiche Problem wie Andy, mit eine zigbee stick (von dresden eletronik).
irgendwie komme ich nicht weiter. Habt ihr inzwischen eine Lösung gefunden?
Gruß Stephan

Arne Schuch
5 Jahre zuvor

Hallo ich noch mal,
ich bin noch nicht so richtig weiter gekommen. Das Thema Bluetooth habe ich erstmal dran gegeben, ist auch nicht so wichtig. Wichtig wäre mir aber, mehrere USB-Sticks durchzuschleifen. Neben einem zigbee2mqtt-Stiick muss da noch ein CUL dran.
Ich kann mich drehen und wenden wie ich will, ALLE Sticks bekommen die gleiche Nummer (189) und unterscheiden sich nur durch das, was dahinter kommt (129; 132, 133).
lsusb liefert:
Bus 001 Device 002: ID 8087:8001 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 006: ID 03eb:204b Atmel Corp. LUFA USB to Serial Adapter Project
Bus 002 Device 005: ID 03eb:204b Atmel Corp. LUFA USB to Serial Adapter Project
Bus 002 Device 002: ID 0451:16a8 Texas Instruments, Inc.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Im Moment sind sogar drei Sticks angeschlossen, einer davon kommt wieder raus.
Mit ls -l /dev/bus/usb/002/00* erhalte ich
root@pve:/etc/pve/nodes/pve/lxc# ls -l /dev/bus/usb/002/00*
crw-rw-r– 1 root root 189, 128 Jun 11 14:04 /dev/bus/usb/002/001
crw-rw-r– 1 root root 189, 129 Jul 15 11:14 /dev/bus/usb/002/002
crw-rw-r– 1 root root 189, 132 Jul 15 11:57 /dev/bus/usb/002/005
crw-rw-r– 1 root root 189, 133 Jul 15 11:58 /dev/bus/usb/002/006

Da scheint noch der BT-Dongle bei zu sein, den habe ich aber schon wieder gezogen. Frage ist, kann ich mit den BEIDEN Zahlen irgendetwas anfangen? Nur die zweite Nummer zu verwenden bringt keinen Erfolg.

LG,
Arne

Arne
5 Jahre zuvor

Hallo,
funktioniert sehr gut bei mir.
Allerdings muss ich nach jedem Reboot vom Proxmox Server chmod o+rw /dev/ttyACM0 ausführen.
Gibt es eine permanente Lösung?
Gruß Arne

SG
5 Jahre zuvor

hier ebenfalls DresdenElektronik Conbee Stick. Einschließlich hier gehts nicht weiter: chmod o+rw /dev/ttyACM0. Jemnd eine Lösng?

Klaus
4 Jahre zuvor

Ich steige gerade vom einem Raspi auf einen Zotac mit Proxmox um.
Bei mir funktioniert es so:
wenn bei Euch ls -la /dev/ttyUSB* statt ls -la /dev/ttyACM* funktioniert, dann muss die letzte Zeile in der xxx.conf
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
statt
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
sein.
So hat es zumindest bei mir funktioniert.
lg

Stefan
4 Jahre zuvor

Hi,

danke für die Anleitung, funktioniert für meinen CC2531 sehr gut. Nach einem Reboot des Proxmox Hosts, muss ich jedoch die Rechte per CHMOD neu setzen.
Weißt du wie ich das automatisch nach dem Reboot setzen kann?
Gruß,
Stefan

vitala
4 Jahre zuvor

Hi,

Ich hab bei meinem Stick Aeon Lab S2 ein Problem, alle paar Tage verliert er im Container unter /dev/Zwavestick und ttyAMC seine rechte . Ich muss den Container dann Neustarten, danach funktioniert er wieder. Hast ähnliche Probleme beobachtet?

Dietmar
4 Jahre zuvor

Hallo Emanuel
Bei mir läuft der Iobroker in einem Container unter Proxmox. Der ZigbeStick im Raspberry läuft super. Da ich mit dem System
umziehe, habe ich alles nach deiner Anleitung gemacht. Scheint alles soweit geklappt zu haben, die Einträge habe ich auch in der 202.conf. Aber ttyACM0 wird unter /dev nicht erstellt.?? Da ich eher keine Ahnung von der Materie habe, weiss ich auch nicht wo ich suchen soll. Kannst du mir weiterhelfen?

SooL
3 Jahre zuvor

Hallo,

ich habe nun erfolgreich einen enoclean usb-Stick eingebunden und im IOBroker installiert.
Vielleicht kann ich Jemandem weiter helfen:

1. Bei mir wechselt nach jedem einstecken des Sticks die Device Nummer und wird nach einem reboot wieder zurück gesetzt. Deshalb kan es sein, dass man die Device Nummer noch einmal in der xxx.conf anpassen muss.
2. nach jedem reboot muss der Befehl „chmod o+rw /dev/ttyXXXX“ ausgeführt werden.
Dazu kan man einen cronjob erstellen.
In der Shell von PVE:
crontab -e //erstellt die cron Datei, falls noch nicht vorhanden und öffent sie im Editor
@reboot chmod o+rw /dev/ttyXXXX // den Befehl als neue Zeile einfügen. ttyXXXX steht dabei für euer Gerät

MIchael
3 Jahre zuvor

Hallo,

es ist eine tolle Anleitung, die schon vielen geholfen hat. Leider ist sie nicht permanent. Vielleicht hast du ja Lust, sie zu überarbeten?

Also,

zuerst sollte man die USB Schnittstelle nicht mit den Zahlen belegen, da diese bei einem Restart anders sein könnten. Dies würde im Teil so aussehen:
lxc.cgroup.devices.allow: c 189:* rwm
lxc.cgroup.devices.allow: c 166:* rwm
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
lxc.mount.entry: /dev/serial/by-id/usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0019430CEE-if00 dev/serial/by-id/usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0019430CEE-if00 none bind,optional,create=file

Die Befehle um diese Werte zu bekommen, hast du ja eigentlich schon genannt.

Dann sollte man die ttyACM0 beim Start für den Stick freigeben.
Dies erreicht man, wenn man eine Rule beim start anlegt.
Und zwar in der Datei (ggf. erstellen) /etc/udev/rules.d/50-myusb.rules
Hier folgendes eintragen: ACTION==“add“, KERNEL==“ttyACM[0-9]*“, ATTRS{idVendor}==“ffff“, ATTRS{idProduct}==“0005″, MODE=“0666″

Die Befehle fir idVendor und idProduct hast du ja auch.

Viel Erfolg und danke, das meine ersten Versuche mit der Anleitung klappten!

robbsen
3 Jahre zuvor

Erstmal danke, die Anleitung hat gut funktioniert soweit. Das „Reboot“ Problem kann ich bestätigen.
Als Lösungsansatz habe ich folgendes gefunden, ggf. kommt ja damit einer weiter und kann seine Erkenntnisse hier noch mal teilen

https://qastack.com.de/ubuntu/58119/changing-permissions-on-serial-port

DerAndere
Reply to  robbsen
3 Jahre zuvor

Moin Moin,
ich habe es endlich geschafft das auch bei einem reboot der USB stick weiter gereicht wird. Die oben genannte Vorgehensweise ist eine Möglichkeit. Einfacher ist es jedoch mit der ID vom USB Stick zu arbeiten.
Gefunden hab ich das hier : https://forum.iobroker.net/topic/29761/gel%C3%B6st-cc2531-an-proxmox-an-lxc-durchreichen-scheitert/26
Dazu ein Cronjob wie SooL es beschrieben hat.

dhzl84
Reply to  robbsen
2 Jahre zuvor

Das Reboot-Problem lässt sich per Hook-Script beseitigen.
Ich reiche die iGPU der APU an einen LXC durch, die letzte Zeile wird bei jedem Containerstart ausgeführt.

lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
lxc.hook.autodev: sh -c „chown root:video /dev/dri/renderD128“

Markus
3 Jahre zuvor

Hallo,
vielen Dank für die super Anleitung.
Habe alles wie beschrieben ausgeführt und es klappte auf Anhieb!

Thx – perfekt!

Markus Mohnen
2 Jahre zuvor

Zur Lösung des „reboot“ Problems: Es kommt bei jedem unplug/plug des USB Sticks vor, nicht nur beim reboot.
Zur Lösung als root auf dem pve Rechner eine Datei /etc/udev/rules.d/50-myusb.rules anlegen mit diesem Inhalt:

KERNEL==“ttyUSB[0-9]*“,MODE=“0666″

Bei Systemen/Stick wo ein /dev/ttyACM angelegt wird entsprechend:

KERNEL==“ttyACM[0-9]*“,MODE=“0666″

Danach einmal den Stick entfernen und wieder einstecken und dann die Berechtigung mit „ls -al /dev/tty*“ überprüfen.

Carsten
Reply to  Markus Mohnen
1 Jahr zuvor

Danke dir für die Info. Ich habe einen DVB Stick, der auch als dvb in dev erkannt wird. Dementsprechend würde ich es mit dvb bzw adapter0 versuchen,richtig?

Stefan
1 Jahr zuvor

Hallo Emanuel,

habe gerade versucht mit deiner Anleitung einen Conbee II Stick unter Proxmox in einem Ubuntu 22.04 LXC Container mit Deconz zum laufen zu bringen.

Leider hat dies nicht funktioniert. Ich konnte alle Befehle problemlos abarbeiten und die .conf Datei anpassen. Wenn ich unter PVE in der Shell die /dev aufliste ist das ttyACM0 zu sehen. Unter der virtuellen Maschine in der Shell leider nicht.

In der .conf steht noch unprivileged: 1. Kann das etwas damit zu tun haben?

Gruss Stefan

marc
1 Jahr zuvor

Danke! Bei mir hat es geholfen.