FHEM auf WD MyBook WorldEdition (White Light)

Begonnen von thd, 07 Januar 2014, 18:18:49

Vorheriges Thema - Nächstes Thema

thd

Ich habe FHEM bei mir auf einem WD MyBook WorldEdition eingerichtet. Das ist ein NAS mit 2 * 2 TByte Festplatte und arm Prozessor.

root-Zugang zum Gerät erlangt man mit der mitgelieferten Firmware per ssh.

Ich verwende ein Debian wheezy chroot, allerdings ist wheezy schwierig einzurichten, weil das Gerät einen angepassten Kernel 2.6.24.4 verwendet und die libc von wheezy für Kernel ab 2.6.26 compiliert ist. Das Problem kann durch neu compilieren der wheezy libc für Kernel 2.6.24 aus den Quellcodes gelöst werden. Debian squeeze macht da keine Schwierigkeiten und kann normal per debootstrap installiert werden. Es wird die armel Debian Portierung benötigt, armhf geht auf diesem Gerät nicht.

Im chroot können also die meisten Debian Programme installiert werden, aber der mit dem Gerät mitgelieferte Kernel umfasst fast keine Gerätetreiber.

http://mybookworld.wikidot.com/compiling-white-light-modules-from-source

beschreibt, wie man eigene Kerneltreiber compiliert. Im Anhang die Datei wd_modules.tar.gz enthält einige Gerätetreiber für CUL, RS232-Schnittstellen incl. der aktuellen Version der FTDI-Treiber mit Support für DIGITUS DA-70159 4*RS232 USB Dongles (bei reichelt.de für 30€).

Laden kann man die Gerätetreiber per insmod:

/ # cat /etc/init.d/S99yzbluez
#!/bin/sh
#TARGET=/opt/lenny
#TARGET=/opt/squeeze
TARGET=/opt/wheezy
MODULES=/lib/modules/2.6.24.4/kernel

case "$1" in
start)
    insmod $MODULES/net/bluetooth/bluetooth.ko
    insmod $MODULES/net/bluetooth/sco.ko
    insmod $MODULES/net/bluetooth/l2cap.ko
    insmod $MODULES/net/bluetooth/rfcomm/rfcomm.ko
   
    insmod $MODULES/drivers/bluetooth/hci_usb.ko

    chroot $TARGET /etc/init.d/dbus start
    chroot $TARGET /etc/init.d/bluetooth start
#    chroot $TARGET su -c "nohup /home/herd/projekt/hmland/hmcfgusb/hmland -p 1234 -l 127.0.0.1 &" herd
   
#   chroot $TARGET /etc/init.d/fhem start
    ;;
stop)
    chroot $TARGET /etc/init.d/bluetooth stop
    chroot $TARGET /etc/init.d/dbus stop
    ;;
esac


/ # cat /etc/init.d/S99zfhem
#!/bin/sh
TARGET=/opt/wheezy

case "$1" in
start)
    insmod /lib/modules/2.6.24.4/kernel/drivers/usb/serial/usbserial.ko
    insmod /lib/modules/2.6.24.4/kernel/drivers/usb/serial/pl2303.ko
    sleep 1
    insmod /lib/modules/2.6.24.4/kernel/drivers/usb/serial/ftdi_sio.ko
    insmod /lib/modules/2.6.24.4/kernel/drivers/usb/class/cdc-acm.ko

    sleep 3
    mount -t usbfs none $TARGET/dev/bus/usb

    HMDEV=$(awk '/^$/ { DEV=""; } /^T: / { DEV=$8; } /^P:  Vendor=1b1f/ { printf("%03d", DEV); }' $TARGET/dev/bus/usb/devices)
   
    chgrp 502 $TARGET/dev/bus/usb/001/$HMDEV
    chmod g+w $TARGET/dev/bus/usb/001/$HMDEV
    chroot $TARGET su -c "nohup /home/herd/projekt/hmland/hmcfgusb/hmland -p 1234 -l 127.0.0.1 -r 0 &" herd

    chroot $TARGET /bin/stty  -F /dev/ttyUSB1 9600 evenp crtscts cs7 inpck parmrk eol 10 icanon
   
    chroot $TARGET /etc/init.d/fhem start
    ;;
stop)
    chroot $TARGET /etc/init.d/fhem stop
    ;;
esac

---
Das wurzel-Dateisystem des Geräts hat nicht allzu viel platz für ein chroot und das /DataVolume Dateisystem ist nicht recht für ein chroot geeignet. Mit einem Loopback mount kann man das umgehen:

dd if=/dev/zero of=/DataVolume/wheezy-dev.raw count=1 size=1024 seek=8000000
mke2fs -j /DataVolume/wheezy-dev.raw
mkdir /mnt/wheezy-dev
mount /DataVolume/wheezy-dev.raw /mnt/wheezy-dev -o loop -t ext3

---

Die Datei hotplug-hmusb.tar.gz enthält Steuerdateien, um für einen HomeMatic USB Dongle die Berechtigungen so zu setzen, dass er von hmland ohne root rechte angesprochen werden kann.

Die USB Seriellen Schnittstellen muss man im chroot mit mknod anlegen, etwa so:

mknod /dev/ttyACM0 c 166 0

mknod /dev/ttyUSB0 c 188 0
mknod /dev/ttyUSB1 c 188 1
mknod /dev/ttyUSB2 c 188 2
mknod /dev/ttyUSB3 c 188 3

Hier legt man auch die Berechtigungen fest:

chgrp dialout /dev/ttyUSB* /dev/ttyACM*
chmod g+rw /dev/ttyUSB* /dev/ttyACM*

---

Die Datei qemu-i386-static.tar.gz enthält ein Kompilat von qemu für die Ausführung von i386 binärcode auf dem alten 2.6.24.4 er Kernel. Das kann man in ein i386 chroot in /usr/bin kopieren und binfmt entsprechend aufsetzen (Es ist statisch gebunden)

https://bugs.launchpad.net/qemu/+bug/739785
https://wiki.debian.org/QemuUserEmulation

TARGET=/mnt/wheezy-dev

case "$1" in
start)
    insmod /lib/modules/2.6.24.4/kernel/fs/binfmt_misc.ko
    mount /DataVolume/wheezy-dev.raw /mnt/tmp -o loop -t ext3
    mount -t binfmt_misc none $TARGET/mnt/binfmt
    mount -t proc none $TARGET/proc

    echo ':qemu-i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:/usr/bin/qemu-i386:' >$TARGET/mnt/binfmt/register
   
    chroot $TARGET su -c "/home/tksuite/etc/init.d/tksuitectl start" tksuite

--

Die Datei libc-wd.tar.bz2 im Anhang enthält die Änderungen an der wheezy libc, damit sie mit dem alten Kernel funktioniert.