Turris Omnia: Z-Wave-Stick in LXC nutzen
Hinweis: Dieser Artikel wurde ursprünglich auf klein-gedruckt.de veröffentlicht.
Nachdem ich meinen Turris Omnia halbwegs eingerichtet habe und der LXC-Container aufgesetzt ist, möchte ich meinen FHEM-Server in einem Container auf dem Turris Omnia betreiben. Als Voraussetzung dafür muss ich zunächst den Z-Wave.Me-USB-Stick innerhalb meines virtuellen LXC-Containers ansprechen können. In dieser Anleitung gehe ich davon aus, dass ein Debian Jessie Container bereits mit einer funktionierenden FHEM-Installation angelegt wurde und funktioniert.
Anmerkung: Im Folgenden müssen alle Kommandozeilen die mit host # beginnen im OpenWRT auf dem Turris Omnia, also dem Host, ausgeführt werden. Beginnt die Kommandozeile mit lxc #, müssen die Befehle innerhalb des LXC-Containers ausgeführt werden.
1| Kernel Modul installieren
Zunächst muss auf dem Host ein fehlendes Kernel-Modul installiert werden:
host # opkg update && opkg install kmod-usb-acm
Anschließend den Z-Wave-Stick anschließen überprüfen ob der Stick erkannt und das Device /dev/ttyACME0
angelegt wurde:
host # dmesg [141895.418113] usb 2-1.2: new full-speed USB device number 10 using xhci-hcd [141895.508103] usb 2-1.2: device descriptor read/64, error -32 [141895.708086] usb 2-1.2: device descriptor read/64, error -32 [141895.908049] usb 2-1.2: new full-speed USB device number 11 using xhci-hcd [141895.998051] usb 2-1.2: device descriptor read/64, error -32 [141896.198040] usb 2-1.2: device descriptor read/64, error -32 [141896.397999] usb 2-1.2: new full-speed USB device number 12 using xhci-hcd [141896.398109] usb 2-1.2: Device not responding to setup address. [141896.608076] usb 2-1.2: Device not responding to setup address. [141896.817957] usb 2-1.2: device not accepting address 12, error -71 [141897.097920] usb 2-1.2: new full-speed USB device number 14 using xhci-hcd [141897.209507] cdc_acm 2-1.2:1.0: ttyACM0: USB ACM device host # ls -la /dev/ttyACM0 crw-r--r-- 1 root root 166, 0 Dec 10 14:39 /dev/ttyACM0
Wichtig ist dabei die Nummer 166 in der letzten Zeile. Diese muss in der LXC-Konfiguration angegeben werden, damit das Device entsprechend an LXC durchgereicht wird.
2| LXC-Config anpassen
Damit ist das Device auf dem Host-System bereits verfügbar. Da ich aber mein FHEM-Service auf einer virtuellen Maschine anbieten will, muss das Device noch dem entsprechenden LXC-Container zugeordnet werden. Dazu in der Datei /srv/lxc/$container/config
auf dem Host folgende Zeilen ergänzen ($container
muss natürlich mit dem eigenen Container-Namen ausgetauscht werden):
host # echo -n "Name des zu bearbeitenden Containers: " && read container Name des zu bearbeitenden Containers: <your_container_name_here> host # cat >> /srv/lxc/"$container"/config << EOF # # USB-Devices für LXC-Container bereitstellen ############################################# # /dev/bus/usb für lsusb im LXC-Container bereitstellen # beseitigt Fehlermeldung "unable to initialize libusb: -99" lxc.mount.entry = /dev/bus/usb dev/bus/usb none bind,optional,create=dir 0 0 # Zugriff auf Z-Wave.Me-Stick (ZME_UZB1) für FHEM erlauben lxc.cgroup.devices.allow = c 166:* rwm lxc.mount.entry = /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file 0 0 EOF
3| hotplug einrichten
Damit FHEM auf das Device zugreifen kann müssen noch die Berechtigungen für das Device innerhalb des Gast-OS angepasst werden. Leider nutzt OpenWRT hotplug und nicht udev, so dass ich für die Einrichtung das Script /etc/hotplug.d/usb/10-usb_permissions
auf dem Host angelegt habe (siehe auch Artikel 'Turris Omnia: Arduino Nano USB in LXC nutzen'):
host # cat >> /etc/hotplug.d/usb/10-usb_permissions <<EOF case "$ACTION" in add) # Für Debug-Zwecke in /var/log/messages Device-Details ausgeben, wenn ein USB-Device angeschlossen wird logger -t DEBUG "hotplug usb: action='$ACTION' product='$PRODUCT' type='$TYPE' interface='$INTERFACE'" # Einstellungen pro Device vornehmen: case "$PRODUCT" in # Berechtigungen für Z-Wave-Device setzen 658/200/*) logger -t DEBUG "hotplug usb: ZME_UZB1 angeschlossen!" if [ -e /dev/ttyACM0 ] ; then chmod 664 /dev/ttyACM0 chown root:plugdev /dev/ttyACM0 fi ;; # Berechtigungen für pilight-USB-Nano setzen 403/6001/*) logger -t DEBUG "hotplug usb: Arduino Nano angeschlossen!" if [ -e /dev/ttyUSB0 ] ; then chmod 664 /dev/ttyUSB0 chown root:plugdev /dev/ttyUSB0 fi ;; esac ;; remove) ;; esac EOF
4| Gruppe einrichten
Jetzt muss noch die Gruppe plugdev
auf dem Host und dem Gast-Systeme angelegt werden, falls diese nicht sowieso schon existiert.
lxc # grep plugdev: /etc/group || (groupadd -r plugdev && grep plugdev /etc/group) plugdev:x:46: host # groupadd -g 46 plugdev
Wichtig: Die Group-ID der plugdev-Gruppe muss auf dem Gast und Host-Betriebssystem identisch sein. Daher muss die Gruppen-ID im zweiten Kommando (-g Parameter) ggf. angepasst werden.
Wenn der Z-Wave-Stick jetzt nochmal neu angesteckt wird, so sollte das Device folgende Berechtigungen auf dem Host zugewiesen bekommen:
host # ls -la /dev/ttyACM0 crw-rw-r-- 1 root plugdev 166, 0 Dec 10 18:27 /dev/ttyACM0
5| Container neu starten
Passt alles kann der LXC-Container neu gestartet werden:
host # lxc-stop -r -n $container
Sobald der Container wieder erreichbar ist sollte das Device nun auch im Gast-OS mit den korrekten Berechtigungen verfügbar sein:
lxc # ls -la /dev/ttyACM0 crw-rw-r-- 1 root plugdev 166, 0 Dec 10 18:27 /dev/ttyACM0
Alle Benutzer, die auf das Device zugreifen sollen, müssen jetzt noch zur neuen Gruppe hinzugefügt werden. Damit FHEM funktioniert muss der entsprechende Benutzer im Gast-System noch in die Gruppe eingefügt werden:
lxc # usermod -a -G plugdev fhem
Danach sollte die Einrichtung soweit abgeschlossen sein und ein entsprechendes Z-Wave-Device kann in FHEM mit folgendem Kommando angelegt werden:
define ZWAVE1 ZWDongle /dev/ttyACM0@115200
Kommentare