OpenWRT: Unterschied zwischen den Versionen

Aus FHEMWiki
(Die Seite wurde neu angelegt: „= Installation von FHEM incl. OpenWRT auf einem Router/Kleinstcomputer z.B. TP-LINK MR3020 = Wer nicht unbedingt eine Fritz!Box braucht sondern einfach nur FHE…“)
 
(Anpassung von <source>-Tags nach <syntaxhighlight>)
 
(27 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= Installation von FHEM incl. OpenWRT auf einem Router/Kleinstcomputer z.B. TP-LINK MR3020 =
== Einleitung ==
 
Hier sind zwei alternative Installationswege beschrieben.
 
* Im ersten Kapitel wird beschrieben, wie Openwrt auf einem Gerät mit wenig(er) internem Speicher eingerichtet werden kann. Hier wird OpenWRT zuerst aus den Sourcen erstellt und ein Overlay für die PERL-Pakete eingerichtet.
* Das zweite Kapitel beschreibt, wie OpenWRT mit PERL im internen Speicher (6MB) installiert wird. Es werden keine Pakete selbst gebaut, sondern die Nightly-Snapshots verwendet. FHEM wird auf einem USB-Stick eingerichtet.
 
== Installation von FHEM incl. OpenWRT auf einem Router/Kleinstcomputer z.B. TP-LINK MR3020 ==
Wer nicht unbedingt eine Fritz!Box braucht sondern einfach nur FHEM ohne laufenden PC betreiben will, kann auch OpenWRT auf einem Router nutzen, z.B. dem sehr günstigen (25 Euro März 2012) und stromsparenden (ca. 1 Watt) TP-LINK MR3020.
Wer nicht unbedingt eine Fritz!Box braucht sondern einfach nur FHEM ohne laufenden PC betreiben will, kann auch OpenWRT auf einem Router nutzen, z.B. dem sehr günstigen (25 Euro März 2012) und stromsparenden (ca. 1 Watt) TP-LINK MR3020.


Bitte beachten: Es kann keine Garantie übernommen werden, dass der Router bei Befolgung dieser Anleitung "kaputt" geht, z.B. dadurch, dass er bei Fehlkonfiguration im Netz nicht mehr erreichbar ist. Der Umbau erfolgt auf eigene Gefahr.
Bitte beachten: Es kann keine Garantie übernommen werden, dass der Router bei Befolgung dieser Anleitung "kaputt" geht, z.B. dadurch, dass er bei Fehlkonfiguration im Netz nicht mehr erreichbar ist. Der Umbau erfolgt auf eigene Gefahr.


== Vorraussetzungen ==
=== Vorraussetzungen ===
* Der Router (in diesem Howto ist der TP-LINK MR3020 verwendet worden, OpenWRT wird aber prinzipiell immer gleich aufgesetzt
* Der Router (in diesem Howto ist der TP-LINK MR3020 verwendet worden, OpenWRT wird aber prinzipiell immer gleich aufgesetzt
* Ein USB Stick, da die Flash-Speicher der Router zu klein sind
* Ein USB Stick, da die Flash-Speicher der Router zu klein sind
* optional ein passiver USB-Hub (wenn der Router nur einen USB Port hat und ein CUL Stick betrieben werden soll)
* optional ein passiver USB-Hub (wenn der Router nur einen USB Port hat und ein CUL Stick betrieben werden soll)
* Ein Linux-PC zum Erstellen des Images. Dies kann auch eine virtuelle Maschine sein. Der Autor hat Ubuntu 10.11 verwendet.
* Ein Linux-PC zum Erstellen des Images. Dies kann auch eine virtuelle Maschine sein. Der Autor hat Ubuntu 10.11 verwendet.
== Vorbereiten des USB-Sticks ==
=== Vorbereiten des USB-Sticks ===
Auf einem USB Stick müssen zwei Partitionen angelegt werden, eine als Auslagerungsspeicher für den RAM und eine für das Dateisystem auf dem später auch Perl und FHEM installiert werden. Das geht am besten mit dem Tool <code>fdisk</code> auf dem vorbereiteten Linux-PC. Dazu den Stick anstöpseln und per Aufruf von <code>fdisk -l</code> die Lister der gefundenen "Festplatten" anzeigen lassen. Eine davon ist der USB-Stick, z.B. an seiner Größe zu erkennen (500Mb reichen locker aus). In der Ausgabe z.B. nach einer Zeile suchen, die sinngemäß so aussieht: <code>Disk /dev/sdc: 484 MB, 484442112 bytes</code>. In diesem Fall ist der USB-Stick das Gerät "/dev/sdc".
Auf einem USB Stick müssen zwei Partitionen angelegt werden, eine als Auslagerungsspeicher für den RAM und eine für das Dateisystem auf dem später auch Perl und FHEM installiert werden. Das geht am besten mit dem Tool <code>fdisk</code> auf dem vorbereiteten Linux-PC. Dazu den Stick anstöpseln und per Aufruf von <code>fdisk -l</code> die Lister der gefundenen "Festplatten" anzeigen lassen. Eine davon ist der USB-Stick, z.B. an seiner Größe zu erkennen (500Mb reichen locker aus). In der Ausgabe z.B. nach einer Zeile suchen, die sinngemäß so aussieht: <code>Disk /dev/sdc: 484 MB, 484442112 bytes</code>. In diesem Fall ist der USB-Stick das Gerät "/dev/sdc".


Daraufhin kann fdisk für das Gerät aufgerufen werden. Detaillierte ANleitungen für fdisk finden sich im Internet. Vereinfacht ist folgender Vorgang auszuführen (alle Daten gehen auf dem Stick verloren!).
Daraufhin kann fdisk für das Gerät aufgerufen werden. Detaillierte ANleitungen für fdisk finden sich im Internet. Vereinfacht ist folgender Vorgang auszuführen (alle Daten gehen auf dem Stick verloren!).


<nowiki>fdisk /dev/sdc
<syntaxhighlight lang=bash>
fdisk /dev/sdc
o
o
n
n
Zeile 27: Zeile 35:
1
1
82
82
w</nowiki>
w
</syntaxhighlight>
 
Danach ist der Stick partitioniert. Ein erneuter Aufruf von <code>fdisk -l</code> sollte ungefähr folgendes ERgebnis liefern:
Danach ist der Stick partitioniert. Ein erneuter Aufruf von <code>fdisk -l</code> sollte ungefähr folgendes ERgebnis liefern:


  <nowiki>Disk /dev/sdc: 484 MB, 484442112 bytes
  Disk /dev/sdc: 484 MB, 484442112 bytes
2 heads, 63 sectors/track, 7509 cylinders
2 heads, 63 sectors/track, 7509 cylinders
Units = cylinders of 126 * 512 = 64512 bytes
Units = cylinders of 126 * 512 = 64512 bytes
Disk identifier: 0x8c5e341e
Disk identifier: 0x8c5e341e
  Device Boot  Start    End  Blocks  Id System
  Device Boot  Start    End  Blocks  Id System
/dev/sdc1        1    993    62527+ 82 Linux swap / Solaris
/dev/sdc1        1    993    62527+ 82 Linux swap / Solaris
/dev/sdc2      994    7509  410508  83 Linux</nowiki>
/dev/sdc2      994    7509  410508  83 Linux
 
Jetzt müssen die Partitionen noch formatiert werden. Vorsicht: Nur hier heisst der Stick /dev/sdc. Er kann auch anders heissen! Wenn ihr die falschen Namen verwendet, könntet ihr eure Festplatte löschen! /dev/sdc1 ist durch /dev/&lt;euer-sdx&gt;1 zu ersetzen
Jetzt müssen die Partitionen noch formatiert werden. Vorsicht: Nur hier heisst der Stick /dev/sdc. Er kann auch anders heissen! Wenn ihr die falschen Namen verwendet, könntet ihr eure Festplatte löschen! /dev/sdc1 ist durch /dev/&lt;euer-sdx&gt;1 zu ersetzen


<nowiki>mkswap /dev/sdc1
<syntaxhighlight lang=bash>
mkswap /dev/sdc1
mkfs.ext4 /dev/sdc2
mkfs.ext4 /dev/sdc2
sync</nowiki>
sync
</syntaxhighlight>
 
Der Stick ist nun fertig vorbereitet und wird im Linux-PC nicht mehr benötigt. Er kann jetzt in den Router
Der Stick ist nun fertig vorbereitet und wird im Linux-PC nicht mehr benötigt. Er kann jetzt in den Router


== Bauen des OpenWRT-Images ==
=== Bauen des OpenWRT-Images ===
Um OpenWRT zu bauen, müssen die entsprechenden Werkzeuge auf dem Linux-PC installiert sein. Unter Ubuntu geht das so:
Um OpenWRT zu bauen, müssen die entsprechenden Werkzeuge auf dem Linux-PC installiert sein. Unter Ubuntu geht das so:
<syntaxhighlight lang=bash>
sudo apt-get -y install build-essential libncurses5-dev zlib-dev libssl-dev git-core
</syntaxhighlight>


<nowiki>sudo apt-get -y install subversion build-essential</nowiki>
OpenWRT kann am besten von GitHub ausgecheckt werden.
OpenWRT kann am besten aus dem Subversion ausgecheckt werden.
<syntaxhighlight lang=bash>
git clone git://github.com/openwrt/openwrt.git
</syntaxhighlight>


<nowiki>svn co svn://svn.openwrt.org/openwrt/trunk openwrt</nowiki>
Das Auschecken dauert eine Weile, aber das ist noch gar nichts, das Bauen dauert noch viel länger. Sobald alles runtergeladen ist, wird in das Verzeichnis gewechselt und die Konfiguration vorgenommen
Das Auschecken dauert eine Weile, aber das ist noch gar nichts, das Bauen dauert noch viel länger. Sobald alles runtergeladen ist, wird in das Verzeichnis gewechselt und die Konfiguration vorgenommen
<syntaxhighlight lang=bash>
cd openwrt
make menuconfig
</syntaxhighlight>


<nowiki>cd openwrt
make menuconfig</nowiki>
Für die Konfiguration muss die Architektur des Routers bekannt sein. Diese kann auf der [http://www.openwrt.org OpenWRT-Seite] nachgeschlagen werden. der TP-LINK MR3020 hat eine <code>ar71xx</code>-Architektur.
Für die Konfiguration muss die Architektur des Routers bekannt sein. Diese kann auf der [http://www.openwrt.org OpenWRT-Seite] nachgeschlagen werden. der TP-LINK MR3020 hat eine <code>ar71xx</code>-Architektur.


Als erstes also die ARchitektur auswählen (Hier: <code>ar71xxx/ar91xxx</code>)
Als erstes also die Architektur auswählen (Hier: <code>ar71xxx/ar91xxx</code>)
Zweitens kann beim Target-Profile zumeinst genau der Router ausgewählt werden (Notfalls auf der OpenWRT-Seite nachlesen)
Zweitens kann beim Target-Profile meinst genau der Router ausgewählt werden (Notfalls auf der OpenWRT-Seite nachlesen)


Optional kann nun unter <code>Image-Configuration</code> bereits eine Netzwerkkonfiguration eingestellt werden, die der Router dann nach seinem Hochfahren hat. Wenn der Router in ein bestehendes Netz mit bestehenden DHCP-Server und Adressraum eingebunden wird, ist das sinnvoll. Wer das hat, weiss auch, was hier einzustellen ist. Standardmäßig ist die Adresse 192.168.1.1 vorgegeben. Die Konfiguration kann auch später jederzeit geändert werden.
Optional kann nun unter <code>Image-Configuration</code> bereits eine Netzwerkkonfiguration eingestellt werden, die der Router dann nach seinem Hochfahren hat. Wenn der Router in ein bestehendes Netz mit bestehenden DHCP-Server und Adressraum eingebunden wird, ist das sinnvoll. Wer das hat, weiss auch, was hier einzustellen ist. Standardmäßig ist die Adresse 192.168.1.1 vorgegeben. Die Konfiguration kann auch später jederzeit geändert werden.
Zeile 69: Zeile 89:
** kmod-loop (kann man immer mal brauchen)
** kmod-loop (kann man immer mal brauchen)
** kmod-scsi-generic
** kmod-scsi-generic
</li><li>Filesystems
* Filesystems
* kmod-fs-ext4 (davon wollen wir später booten, vom USB-Stick
** kmod-fs-ext4 ''(davon wollen wir später vom USB-Stick booten)''
</li><li>USB-Support
* USB-Support
* kmod-usb-acm (für CUL)
** kmod-usb-acm ''(für CUL)''
* kmod-usb-hid
** kmod-usb-hid
* kmod-usb-ohci
** kmod-usb-ohci
* kmod-usb-serial
** kmod-usb-serial
* kmod-usb-serial-ftdi
** kmod-usb-serial-ftdi
* kmod-usb-storage-extras
** kmod-usb-storage-extras
* kmod-usb-uhci
** kmod-usb-uhci
* kmod-usb2
** kmod-usb2
</li></ul>
 
Unter Utilities noch folgendes aktivieren
Unter Utilities noch folgendes aktivieren
* Filesystem
* Filesystem
** e2fsprogs
** e2fsprogs
</li><li>disc
* disc
* fdisk (für Analysezwecke sinnvoll)
** fdisk ''(für Analysezwecke sinnvoll)''
* swap-utils
** swap-utils
</li></ul>
 
Nun kann - in aller Ruhe - alles gebaut werden durch Eingabe von
Nun kann - in aller Ruhe - alles gebaut werden durch Eingabe von
<syntaxhighlight lang=bash>
make
</syntaxhighlight>


<nowiki>make</nowiki>
=== Vorbereiten des Routers ===
== Vorbereiten des Routers ==
Das ganze kann bis zu mehrere Stunden laufen. Nun ist Zeit, den Router ins Netzwerk einzubinden. Wie genau, hängt von der persönlichen Konstellation ab. Der TP-Link MR3020 hat standardmäßig die IP-Adresse 192.168.0.254. Viele andere Router haben z.B. 192.168.0.1. Ich empfehle, das Update auf jeden Fall nicht über WLAN sondern ein Netzwerkkabel zu machen. Die meisten Router haben einen aktivierten DHCP-Server. Ein angestöpselter Windows-PC bekommt dann von ihm eine IP-Adresse zugewiesen. Beim MR3020 kann dann die Weboberfläche über [http://192.168.0.254 http://192.168.0.254] erreicht werden. (User/Passwort: admin/admin)
Das ganze kann bis zu mehrere Stunden laufen. Nun ist Zeit, den Router ins Netzwerk einzubinden. Wie genau, hängt von derpersönlichen Konstellation ab. Der TP-Link MR3020 hat standardmäßig die IP-Adresse 192.168.0.254. Viele andere Router haben z.B. 192.168.0.1. Ich empfehle, das Update auf jeden Fall nicht über WLAN sondern ein Netzwerkkabel zu machen. Die meisten Router haben einen aktivierten DHCP-Server. Ein angestöpselter Windows-PC bekommt dann von ihm eine IP-Adresse zugewiesen. Beim MR3020 kann dann die Weboberfläche über [http://192.168.0.254 http://192.168.0.254] erreicht werden. (User/Passwort: admin/admin)


== Installation von OpenWRT auf dem Router ==
=== Installation von OpenWRT auf dem Router ===
In der Weboberfläche des Routers gibt es irgendwo einen Menüpunkt zum Firmware-Upgrade. Beim MR3020 erreichbar unter System Tools / Firmware Upgrade. Sobald das Bauen von OpenWRT fertig ist, liegt das Image im Unterordner bin/&lt;architektur&gt;/. Es sollte das Image genommen werden, was den Namen des Routers sowie "squashfs" sowie "factory" im Dateinamen enthält. Dieses muss jetzt im Webinterface wie beschrieben ausgewählt werden und hochgeladen werden. Alle Bestätigungsmeldungen und "Wollen-Sie-Das-auch-Wirklich"-Fragen natürlich bestätigen.  
In der Weboberfläche des Routers gibt es irgendwo einen Menüpunkt zum Firmware-Upgrade. Beim MR3020 erreichbar unter System Tools / Firmware Upgrade. Sobald das Bauen von OpenWRT fertig ist, liegt das Image im Unterordner <code>bin/<architektur>/</code>. Es sollte das Image genommen werden, was den Namen des Routers sowie "squashfs" sowie "factory" im Dateinamen enthält. Dieses muss jetzt im Webinterface wie beschrieben ausgewählt werden und hochgeladen werden. Alle Bestätigungsmeldungen und "Wollen-Sie-Das-auch-Wirklich"-Fragen natürlich bestätigen.  


Nach einer Weile sollte dann der Router unter 192.168.1.1 anpingbar sein (von Linux aus: <code>ping 192.168.1.1</code>) bzw. unter der in der Image Configuration eingestellten IP. Wenn das nicht geht, kann man den Router auch ein 2. mal starten, da sollte man dann aber nach dem Flashen mal 10 Minuten Geduld haben (also Stecker raus/rein). Auf keinen Fall zu früh machen, dann könnte es sein, dass er gar nicht mehr hochfährt!
Nach einer Weile sollte dann der Router unter 192.168.1.1 anpingbar sein (von Linux aus: <code>ping 192.168.1.1</code>) bzw. unter der in der Image Configuration eingestellten IP. Wenn das nicht geht, kann man den Router auch ein 2. mal starten, da sollte man dann aber nach dem Flashen mal 10 Minuten Geduld haben (also Stecker raus/rein). Auf keinen Fall zu früh machen, dann könnte es sein, dass er gar nicht mehr hochfährt!


Zunächst muss man sich nun per telnet verbinden.  
Zunächst muss man sich nun per telnet verbinden.  
 
<syntaxhighlight lang=bash>
<nowiki>telnet 192.168.1.1</nowiki>
telnet 192.168.1.1
</syntaxhighlight>
Nun ist man schon im OpenWRT eingeloggt. Das erste und einzige, was in diesem Login nun gemacht wird, ist, per
Nun ist man schon im OpenWRT eingeloggt. Das erste und einzige, was in diesem Login nun gemacht wird, ist, per
 
<syntaxhighlight lang=bash>
<nowiki>passwd</nowiki>
passwd
</syntaxhighlight>
ein Passwort zu setzen. Danach kann man sich mit
ein Passwort zu setzen. Danach kann man sich mit
 
<syntaxhighlight lang=bash>
<nowiki>exit</nowiki>
exit
ausloggen. Nun kann man per SSH eine Verbindung herstellen, da ja jetzt ein Passwort gesetzt ist
</syntaxhighlight>
 
ausloggen. Ab jetzt ist <code>telnet</code> zur Sicherheit deaktiviert und man kann per <code>ssh</code> eine Verbindung herstellen, da ja jetzt ein Passwort gesetzt ist
<nowiki>ssh 192.168.1.1</nowiki>
<syntaxhighlight lang=bash>
ssh root@192.168.1.1
</syntaxhighlight>
Für den weiteren Verlauf ist es notwendig, dass der Router Internetzugang hat. Dazu muss man ggf. von Hand in der Datei <code>/etc/config/network</code> die Netzwerkeinstellungen entsprechend anpassen.
Für den weiteren Verlauf ist es notwendig, dass der Router Internetzugang hat. Dazu muss man ggf. von Hand in der Datei <code>/etc/config/network</code> die Netzwerkeinstellungen entsprechend anpassen.
 
<syntaxhighlight lang=bash>
<nowiki>vi /etc/config/network</nowiki>
vi /etc/config/network
</syntaxhighlight>
Zur Bedienung von vi z.B. [http://wiki.openwrt.org/doc/uci/network hier]
Zur Bedienung von vi z.B. [http://wiki.openwrt.org/doc/uci/network hier]


Wichtig ist die IP-Adresse, die Netzmaske, das Gateway und der DNS-Server. Bitte genau auf Tippfehler achten. Bei einer fehlenden Konfiguration ist der Router nicht mehr erreichbar. Nach abspeichern kann die neue Konfiguration aktiviert werden
Wichtig ist die IP-Adresse, die Netzmaske, das Gateway und der DNS-Server. Bitte genau auf Tippfehler achten. Bei einer fehlenden Konfiguration ist der Router nicht mehr erreichbar. Nach abspeichern kann die neue Konfiguration aktiviert werden
 
<syntaxhighlight lang=bash>
<nowiki>/etc/init.d/network restart</nowiki>
/etc/init.d/network restart
</syntaxhighlight>
Falls sich auch die IP-Adresse geändert hat, mit ssh wie oben neu anmelden. Als nächstes soll der USB-Stick eingebunden werden, dazu sind einige Pakete zu installieren. OpenWRT hat einen eingebauten Paketmanager zur Nachinstallation von Software direkt aus dem Netz. Zunächst wird nur das installiert, was in den internen Speicher des Routers muss. Das Root-Dateisystem soll anschließend durch den USB-Stick erweitert werden, um dann dorthin die meiste Software zu installieren. Viele Details hierzu finden sich [http://wiki.openwrt.org/doc/howto/extroot hier]
Falls sich auch die IP-Adresse geändert hat, mit ssh wie oben neu anmelden. Als nächstes soll der USB-Stick eingebunden werden, dazu sind einige Pakete zu installieren. OpenWRT hat einen eingebauten Paketmanager zur Nachinstallation von Software direkt aus dem Netz. Zunächst wird nur das installiert, was in den internen Speicher des Routers muss. Das Root-Dateisystem soll anschließend durch den USB-Stick erweitert werden, um dann dorthin die meiste Software zu installieren. Viele Details hierzu finden sich [http://wiki.openwrt.org/doc/howto/extroot hier]
 
<syntaxhighlight lang=bash>
<nowiki>opkg update
opkg update
opkg install block-mount</nowiki>
opkg install block-mount
</syntaxhighlight>
Bei einem Aufruf von  
Bei einem Aufruf von  
 
<syntaxhighlight lang=bash>
<nowiki>fdisk -l</nowiki>
fdisk -l
</syntaxhighlight>
sollte der an dem Router angeschlossene Stick bereits zu sehen sein (analog zu oben). Hiermit lässt sich dann auch rausfinden, wie das Gerät auf dem Router heisst. In den meisten Fällen dürfte dies <code>/dev/sda</code> sein. In diesem Fall können wir nun das Dateisystem einbinden und dann die Dateien aus dem internen Speicher dorthin kopieren.
sollte der an dem Router angeschlossene Stick bereits zu sehen sein (analog zu oben). Hiermit lässt sich dann auch rausfinden, wie das Gerät auf dem Router heisst. In den meisten Fällen dürfte dies <code>/dev/sda</code> sein. In diesem Fall können wir nun das Dateisystem einbinden und dann die Dateien aus dem internen Speicher dorthin kopieren.
 
<syntaxhighlight lang=bash>
<nowiki>mkdir /mnt/sda2
mkdir /mnt/sda2
mount /dev/sda2 /mnt/sda2
mount /dev/sda2 /mnt/sda2
tar -C /overlay -cvf - . | tar -C /mnt/sda2 -xf -</nowiki>
tar -C /overlay -cvf - . | tar -C /mnt/sda2 -xf -
</syntaxhighlight>
Nun kann auch schon die Konfiguration so umgestellt werden, dass beim nächsten Neustart der USB-Stick mit ins Root-Filesystem eingebunden wird. Dazu ist die Konfigurationsdatei <code>/etc/config/fstab</code> zu editieren.
Nun kann auch schon die Konfiguration so umgestellt werden, dass beim nächsten Neustart der USB-Stick mit ins Root-Filesystem eingebunden wird. Dazu ist die Konfigurationsdatei <code>/etc/config/fstab</code> zu editieren.
 
<syntaxhighlight lang=bash>
<nowiki>vi /etc/config/fstab</nowiki>
vi /etc/config/fstab
</syntaxhighlight>
Diese sollte danach ungefähr so aussehen, wobei das von Router zu Router abweichen kann. Der automatische Block für "home" kann bearbeitet werden und der Spap-Block ebenfalls auf (hier) /dev/sda1 angepasst werden
Diese sollte danach ungefähr so aussehen, wobei das von Router zu Router abweichen kann. Der automatische Block für "home" kann bearbeitet werden und der Spap-Block ebenfalls auf (hier) /dev/sda1 angepasst werden


  <nowiki>config global automount
  config global automount
     option from_fstab 1
     option from_fstab 1
     option anon_mount 1
     option anon_mount 1
config global autoswap
config global autoswap
     option from_fstab 1
     option from_fstab 1
     option anon_swap 1
     option anon_swap 1
config mount
config mount
     option target  /overlay
     option target  /overlay
     option device  /dev/sda2
     option device  /dev/sda2
Zeile 150: Zeile 181:
     option enabled 1
     option enabled 1
     option enabled_fsck 1
     option enabled_fsck 1
config swap
config swap
     option device  /dev/sda1
     option device  /dev/sda1
     option enabled 1</nowiki>
     option enabled 1
 
Nun kann die Konfiguration aktiviert und die Box mit eingestecktem Stick neu gestartet werden
Nun kann die Konfiguration aktiviert und die Box mit eingestecktem Stick neu gestartet werden
 
<syntaxhighlight lang=bash>
<nowiki>/etc/init.d/fstab enable
/etc/init.d/fstab enable
reboot</nowiki>
reboot
</syntaxhighlight>
Nun sollte überprüft werden, ob der Stick richtig eingebunden ist
Nun sollte überprüft werden, ob der Stick richtig eingebunden ist
<syntaxhighlight lang=bash>
df -h
</syntaxhighlight>
Die Ausgabe sollte sinngemäß folgende Zeilen enthalten


  <nowiki>df -h</nowiki>
  /dev/sda2        397.7M  19.8M  357.9M  5% /overlay
Die Ausgabe sollte sinngemäß folgende Zeilen enthalten
overlayfs:/overlay  397.7M  19.8M  357.9M  5%


<nowiki>/dev/sda2        397.7M  19.8M  357.9M  5% /overlay
overlayfs:/overlay  397.7M  19.8M  357.9M  5% /</nowiki>
Ist dies nicht der Fall, kann auf der OpenWRT Seite nach Troubleshooting-Möglichkeiten gesucht werden und dann hier fortgesetzt werden.
Ist dies nicht der Fall, kann auf der OpenWRT Seite nach Troubleshooting-Möglichkeiten gesucht werden und dann hier fortgesetzt werden.
Nachdem nun der Stick erfolgreiche eingebunden werden, können die ganzen Pakete installiert werden, die zum Betrieb von FHEM notwendig sind. Da dies eine Vielzahl der perlbase-Pakete ist, sind hier schlichtweg alle verfügbaren perl-Pakete installiert worden. Ebenfalls einige andere nützliche Werkzeuge. Speichermäßig ist das auf dem USB-Stick nicht entscheidend.
Nachdem nun der Stick erfolgreiche eingebunden werden, können die ganzen Pakete installiert werden, die zum Betrieb von FHEM notwendig sind. Da dies eine Vielzahl der perlbase-Pakete ist, sind hier schlichtweg alle verfügbaren perl-Pakete installiert worden. Ebenfalls einige andere nützliche Werkzeuge. Speichermäßig ist das auf dem USB-Stick nicht entscheidend.
 
<syntaxhighlight lang=bash>
<nowiki>opkg update
opkg update
opkg install usbutils luci ntpclient uhttpd perl perl-compress-bzip2 perl-dbi perl-html-parser perl-html-tagset perl-html-tree perl-lockfile-simple \
opkg install usbutils luci ntpclient uhttpd perl perl-compress-bzip2 perl-dbi perl-html-parser perl-html-tagset perl-html-tree perl-lockfile-simple \
perl-net-telnet perl-uri perl-www perl-www-curl perl-www-mechanize perlbase-abbrev perlbase-anydbm-file perlbase-archive perlbase-assert perlbase-attribute \
perl-net-telnet perl-uri perl-www perl-www-curl perl-www-mechanize perlbase-abbrev perlbase-anydbm-file perlbase-archive perlbase-assert perlbase-attribute \
Zeile 183: Zeile 218:
perlbase-selfloader perlbase-shell perlbase-shellwords perlbase-sigtrap perlbase-socket perlbase-sort perlbase-stat perlbase-storable perlbase-switch \
perlbase-selfloader perlbase-shell perlbase-shellwords perlbase-sigtrap perlbase-socket perlbase-sort perlbase-stat perlbase-storable perlbase-switch \
perlbase-symbol perlbase-sys perlbase-syslog perlbase-tainted perlbase-term perlbase-termcap perlbase-test perlbase-text perlbase-thread perlbase-threads \
perlbase-symbol perlbase-sys perlbase-syslog perlbase-tainted perlbase-term perlbase-termcap perlbase-test perlbase-text perlbase-thread perlbase-threads \
perlbase-tie perlbase-time perlbase-unicode perlbase-unicore perlbase-user perlbase-xsloader</nowiki>
perlbase-tie perlbase-time perlbase-unicode perlbase-unicore perlbase-user perlbase-xsloader
</syntaxhighlight>
Das Webinterface "Luci" ist mitinstalliert worden und bietet komfortable Einstellmöglichkeiten für den Router allgemein. Nach einem  
Das Webinterface "Luci" ist mitinstalliert worden und bietet komfortable Einstellmöglichkeiten für den Router allgemein. Nach einem  
 
<syntaxhighlight lang=bash>
<nowiki>/etc/init.d/uhttpd enable
/etc/init.d/uhttpd enable
/etc/init.d/uhttpd start</nowiki>
/etc/init.d/uhttpd start
</syntaxhighlight>
ist es unter <code>[http://192.168.1.1/ http://192.168.1.1/]</code> bzw. der entsprechenden Router-IP erreichbar. Wichtig ist es ggf. den DHCP-Server zu deaktivieren. Die meisten Router können auch als WLAN-Clients konfiguriert werden, sie brauchen also nicht zwangsweise ein Netzwerkkabel. All dies geht über die Weboberfläche.
ist es unter <code>[http://192.168.1.1/ http://192.168.1.1/]</code> bzw. der entsprechenden Router-IP erreichbar. Wichtig ist es ggf. den DHCP-Server zu deaktivieren. Die meisten Router können auch als WLAN-Clients konfiguriert werden, sie brauchen also nicht zwangsweise ein Netzwerkkabel. All dies geht über die Weboberfläche.
Nun kann FHEM auf den Router/Stick kopiert werden. In diesem Beispiel benutzen wir das SVN-Repository
Nun kann FHEM auf den Router/Stick kopiert werden. In diesem Beispiel benutzen wir das SVN-Repository
 
<syntaxhighlight lang=bash>
<nowiki>opkg install subversion-client make libelf
opkg install subversion-client make libelf
mkdir /usr/src
mkdir /usr/src
cd /usr/src
cd /usr/src
svn co https://fhem.svn.sourceforge.net/svnroot/fhem/trunk/fhem
svn co https://svn.fhem.de/fhem/trunk/fhem
cd fhem
cd fhem
make install-pgm2</nowiki>
make install-pgm2
Die Bearbeitung der <code>/etc/fhem.cfg</code> ist nun so durchzuführen, wie bei jeder anderen FHEM-Installation auch. Wenn ein CUL-Stock am Router verwendet werden soll, dann geht dies über den Umweg ser2net, da das Device::Serial - CPAN Modul für OpenWRT nicht standardmäßig zur Verfügung steht
</syntaxhighlight>
Die Bearbeitung der <code>/etc/fhem.cfg</code> ist nun so durchzuführen, wie bei jeder anderen FHEM-Installation auch.  


<nowiki>opkg install ser2net
==== CUL ====
vi /etc/ser2net.conf</nowiki>
Wenn ein [[CUL]] am Router verwendet werden soll, dann geht dies über den Umweg <code>ser2net</code>, da das CPAN Modul <code>Device::Serial</code> in OpenWRT nicht standardmäßig zur Verfügung steht.
<syntaxhighlight lang=bash>
opkg install ser2net
vi /etc/ser2net.conf
</syntaxhighlight>
In der Datei kann alles gelöscht werden und dann genau diese Zeile eingefügt werden:
In der Datei kann alles gelöscht werden und dann genau diese Zeile eingefügt werden:


  <nowiki>27073:raw:300:/dev/ttyACM0:115200 NONE 1STOPBIT 7DATABITS</nowiki>
  27073:raw:300:/dev/ttyACM0:115200 NONE 1STOPBIT 7DATABITS
 
In der fhem.cfg ist die Definition des CUL-Sticks dann folgendermaßen:
In der fhem.cfg ist die Definition des CUL-Sticks dann folgendermaßen:


  <nowiki>define MyCUL CUL 127.0.0.1:27073 3333</nowiki>
  define MyCUL CUL 127.0.0.1:27073 3333
 
Wenn man CUL doch per Device::Serial ansprechen oder andere FHEM Module verwenden will, die auf Device::Serial angewiesen sind, kann man das entsprechende OpenWRT Paket auch selber erstellen.
Wenn man CUL doch per Device::Serial ansprechen oder andere FHEM Module verwenden will, die auf Device::Serial angewiesen sind, kann man das entsprechende OpenWRT Paket auch selber erstellen.
Hinweise dazu gibt es [http://tcb.udarknet.com/dokuwiki/doku.php/projects/securouter/openwrt hier].
Hinweise dazu gibt es [http://tcb.udarknet.com/dokuwiki/doku.php/projects/securouter/openwrt hier].


Nun muss nur noch der Autostart von ser2net und fhem eingebaut werden und die integrierte, stromsparende FHEM-Kiste ist fertig.
Nun muss nur noch der Autostart von ser2net und fhem eingebaut werden und die integrierte, stromsparende FHEM-Kiste ist fertig.
 
<syntaxhighlight lang=bash>
<nowiki>vi /etc/init.d/ser2net</nowiki>
vi /etc/init.d/ser2net
</syntaxhighlight>
mit folgendem Inhalt
mit folgendem Inhalt
 
<syntaxhighlight lang=bash>
<nowiki>#!/bin/sh /etc/rc.common
#!/bin/sh /etc/rc.common
# Ser2Net Init Script
# Ser2Net Init Script
START=10
START=10
Zeile 224: Zeile 269:
stop(){
stop(){
     killall ser2net
     killall ser2net
}</nowiki>
}
</syntaxhighlight>
Danach Ser2Net aktivieren und starten:
Danach Ser2Net aktivieren und starten:
<syntaxhighlight lang=bash>
chmod +x /etc/init.d/ser2net
/etc/init.d/ser2net enable
/etc/init.d/ser2net start
</syntaxhighlight>


<nowiki>chmod +x /etc/init.d/ser2net
==== FHEM beim Systemstart ====
/etc/init.d/ser2net enable
/etc/init.d/ser2net start</nowiki>
Nun noch die Konfiguration für fhem selbst
Nun noch die Konfiguration für fhem selbst
 
<syntaxhighlight lang=bash>
<nowiki>#!/bin/sh /etc/rc.common
#!/bin/sh /etc/rc.common
# FHEM Init Script
# FHEM Init Script
START=11
START=11
Zeile 241: Zeile 290:
stop(){
stop(){
     echo &quot;shutdown&quot; | nc localhost 7072
     echo &quot;shutdown&quot; | nc localhost 7072
}</nowiki>
}
</syntaxhighlight>
Und auch hier aktivieren:
Und auch hier aktivieren:
<syntaxhighlight lang=bash>
chmod +x /etc/init.d/fhem
/etc/init.d/fhem enable
/etc/init.d/fhem start
</syntaxhighlight>
==== Logfiles nicht auf USB-Stick ====
Da das ständige Schreiben 1. langsam und 2. den meisten USB-Sticks nicht gut tut, sollten die Logfiles ins RAM geschrieben werden, also ein Pfad unterhalb von <code>/tmp</code>. Der Speicher ist allerdings begrenzt. Je nach persönlichen Anforderungen muss dann regelmäßig das Log aus dem Speicher gelöscht oder archiviert werden. Z.b. wöchentlich auf den USB Stick oder auf Netzlaufwerke etc. Dies ist mit dem FileLog von alleine möglich (siehe [http://fhem.de/commandref.html#archivecmd]).
----
== Alternative Installation aus den Kompilierten Quellen bei einem Speicher größer 6MB ==
Zunächst wird OpenWRT auf den Router installiert. Auf die Installation des WEB-Interfaces „luci“ kann verzichtet werden.
=== Netzwerk einrichten ===
Der erste Login erfolgt mit <code>telnet</code> (nicht SSH) auf die IP 192.168.1.1 ohne Passwort.
Als erstes sollte mit dem Befehl <code>passwd</code> ein Passwort eingestellt werden.
Sobald das geschehen ist, wird der Telnet-Dienst abgestellt.
Ab jetzt sollte über den SSH-Dienst mit dem eben eingestellten Passwort gearbeitet werden.
Mittels <code>vi</code> kann die LAN-IP-Adresse in der Datei <code>/etc/config/network</code> angepasst werden.
<syntaxhighlight lang=text>
config interface 'lan'
...
      option ipaddr '192.168.178.4'
      option netmask '255.255.255.0'
      option gateway '192.168.178.1'
      option dns '192.168.178.1'
...
</syntaxhighlight>
Die Konfiguration wird mit dem Aufruf von <code>/etc/init.d/network restart</code> übernommen.
Zeitzone in der Datei <code>/etc/config/system</code> einstellen:
<syntaxhighlight lang=text>
config system
...
        option timezone 'CET-1CEST,M3.5.0,M10.5.0/3'
...
</syntaxhighlight>
=== PERL installieren ===


  <nowiki>chmod +x /etc/init.d/fhem
Perl kann wie folgt eingerichtet werden. Je nach verwendetet FHEM-Module müssen weitere PERL-Pakete installiert werden. Für MAX_LAN, HM-CFG-LAN und ECMD reicht die folgende Auswahl:
<syntaxhighlight lang=bash>
opkg update
opkg install perl perl-html-parser perl-html-tagset perl-uri perl-www perlbase-autoloader perlbase-config \
perlbase-ctime perlbase-digest perlbase-dynaloader perlbase-errno perlbase-essential perlbase-fcntl \
perlbase-file perlbase-integer perlbase-io perlbase-math perlbase-mime perlbase-posix perlbase-selectsaver \
perlbase-socket perlbase-symbol perlbase-tie perlbase-time perlbase-timelocal perlbase-xsloader
</syntaxhighlight>
 
=== Einbinden der Partitionen per UUID ===
 
Für die Verwendung eines USB-Sticks müssen weitere Pakete installiert werden:
<syntaxhighlight lang=bash>
opkg update
opkg install kmod-usb-storage block-mount kmod-fs-ext4
</syntaxhighlight>
 
Der USB-Stick benötigt eine Datenpartition, optional kann eine zusätzliche SWAP-Partition eingerichtet werden.
Hierfür kann der Abschnitt "[[#Vorbereiten des USB-Sticks|Vorbereiten des USB-Sticks]]" aus dem vorherigen Kapitel verwendet werden.
 
Erstellen eines Verzeichnisses für den FHEM-Daten-Stick:
<syntaxhighlight lang=bash>
mkdir /mnt/opt
</syntaxhighlight>
 
Mittels des Befehls <code>block</code> kann eine brauchbare fstab-Konfiguration erstellt werden.
An dieser Stelle wird mit den eindeutigen UUIDs gearbeitet.
So ist es beim Betrieb von mehreren Datenspeichern unerheblich, in welcher Reihenfolge diese eingebunden werden.
Dies kann etwas Ärger ersparen.
<syntaxhighlight lang=bash>
block detect > /etc/config/fstab
</syntaxhighlight>
 
Die Konfigurationsdatei <code>/etc/config/fstab</code> muss angepasst werden.
Zunächst sind die Mount-Punkte nicht aktiviert und das Verzeichnis für die Datenpartition muss noch angepasst werden.
Die Option <code>uuid</code> muss unverändert bleiben.
<syntaxhighlight lang=bash>
vi /etc/config/fstab
</syntaxhighlight>
Darin
<syntaxhighlight lang=text>
config 'global'
        ...
config 'mount'
        option  target  '/mnt/opt'
        option  uuid    '...'
        option  enabled '1'
config 'swap'
        option  uuid    '...'
        option enabled '1'
</syntaxhighlight>
 
Über einen Neustart oder <code>/sbin/block mount</code> werden die Partitionen eingebunden.
 
=== Installation von FHEM ===
Die Installation von FHEM ist an vielen Stellen sehr gut beschrieben.
Hier nur die Quick&Dirty Variante.
Die [http://fhem.de/fhem.html#Download aktuellste, stabile Version] herunter laden.
Die Version ''X.Y'' in den folgenden Befehlen bitte entsprechend anpassen:
<syntaxhighlight lang=bash>
cd /mnt/opt/
wget http://fhem.de/fhem-X.Y.tar.gz
opkg update
opkg install tar
tar xfz fhem-X.Y.tar.gz
mv fhem-X.Y fhem
</syntaxhighlight>
 
=== Startskript anlegen ===
 
<syntaxhighlight lang=bash>
touch /etc/init.d/fhem
chmod +x /etc/init.d/fhem
vi /etc/init.d/fhem
</syntaxhighlight>
Darin
<syntaxhighlight lang=bash>
#!/bin/sh /etc/rc.common
# FHEM Init Script
 
START=11
STOP=15
 
cd /mnt/opt/fhem/
 
start() {
  if [ -f /mnt/opt/fhem-X.Y/log ]; then
    mkdir -p /mnt/opt/fhem-X.Y/log
  fi
  /mnt/opt/fhem/fhem.pl /mnt/opt/fhem/fhem.cfg
}
stop(){
  echo "stopping fhem"
  /mnt/opt/fhem/fhem.pl 7072 "shutdown"
  #kill -TERM $(cat /var/run/fhem.pid)
}
restart(){
  echo "restarting"
  mnt/opt/fhem/fhem.pl 7072 "shutdown"
  #kill -TERM $(cat /var/run/fhem.pid)
  /mnt/opt/fhem/fhem.pl /mnt/opt/fhem/fhem.cfg
}
</syntaxhighlight>
 
Init.d-Script aktivieren:
<syntaxhighlight lang=bash>
/etc/init.d/fhem start
/etc/init.d/fhem enable
/etc/init.d/fhem enable
/etc/init.d/fhem start</nowiki>
</syntaxhighlight>
Da das ständige Schreiben 1. langsam und 2. den meisten USB-Sticks nicht gut tut, sollten die Logfiles ins RAM geschrieben werden, also ein Pfad unterhalb von <code>/tmp</code>. Der Speicher ist allerdings begrenzt. Je nach persönlichen Anforderungen muss dann regelmäßig das Log aus dem Speicher gelöscht oder archiviert werden. Z.b. wöchentlich auf den USB Stick oder auf Netzlaufwerke etc. Dies ist mit dem FileLog von alleine möglich -&gt; [http://fhem.de/commandref.html#archivecmd [1]].
 
Ab jetzt sollte FHEM bei jedem Bootvorgang automatisch gestartet werden.
 
=== Anmerkungen ===
* Es sollte sichergestellt werden, dass keine Dateien außerhalb von <code>/mnt/opt/</code> geschrieben werden.
* Die PERL-Version ist leider etwas älter (Version 5.10) an einigen Stellen muss der FHEM-Code angepasst werden. Besonders wenn mit dem „~~“ Operator gearbeitet wurde.
 
[[Kategorie:HOWTOS]]
[[Kategorie:Glossary]]
[[Kategorie:CUL]]

Aktuelle Version vom 26. Juli 2017, 19:00 Uhr

Einleitung

Hier sind zwei alternative Installationswege beschrieben.

  • Im ersten Kapitel wird beschrieben, wie Openwrt auf einem Gerät mit wenig(er) internem Speicher eingerichtet werden kann. Hier wird OpenWRT zuerst aus den Sourcen erstellt und ein Overlay für die PERL-Pakete eingerichtet.
  • Das zweite Kapitel beschreibt, wie OpenWRT mit PERL im internen Speicher (6MB) installiert wird. Es werden keine Pakete selbst gebaut, sondern die Nightly-Snapshots verwendet. FHEM wird auf einem USB-Stick eingerichtet.

Installation von FHEM incl. OpenWRT auf einem Router/Kleinstcomputer z.B. TP-LINK MR3020

Wer nicht unbedingt eine Fritz!Box braucht sondern einfach nur FHEM ohne laufenden PC betreiben will, kann auch OpenWRT auf einem Router nutzen, z.B. dem sehr günstigen (25 Euro März 2012) und stromsparenden (ca. 1 Watt) TP-LINK MR3020.

Bitte beachten: Es kann keine Garantie übernommen werden, dass der Router bei Befolgung dieser Anleitung "kaputt" geht, z.B. dadurch, dass er bei Fehlkonfiguration im Netz nicht mehr erreichbar ist. Der Umbau erfolgt auf eigene Gefahr.

Vorraussetzungen

  • Der Router (in diesem Howto ist der TP-LINK MR3020 verwendet worden, OpenWRT wird aber prinzipiell immer gleich aufgesetzt
  • Ein USB Stick, da die Flash-Speicher der Router zu klein sind
  • optional ein passiver USB-Hub (wenn der Router nur einen USB Port hat und ein CUL Stick betrieben werden soll)
  • Ein Linux-PC zum Erstellen des Images. Dies kann auch eine virtuelle Maschine sein. Der Autor hat Ubuntu 10.11 verwendet.

Vorbereiten des USB-Sticks

Auf einem USB Stick müssen zwei Partitionen angelegt werden, eine als Auslagerungsspeicher für den RAM und eine für das Dateisystem auf dem später auch Perl und FHEM installiert werden. Das geht am besten mit dem Tool fdisk auf dem vorbereiteten Linux-PC. Dazu den Stick anstöpseln und per Aufruf von fdisk -l die Lister der gefundenen "Festplatten" anzeigen lassen. Eine davon ist der USB-Stick, z.B. an seiner Größe zu erkennen (500Mb reichen locker aus). In der Ausgabe z.B. nach einer Zeile suchen, die sinngemäß so aussieht: Disk /dev/sdc: 484 MB, 484442112 bytes. In diesem Fall ist der USB-Stick das Gerät "/dev/sdc".

Daraufhin kann fdisk für das Gerät aufgerufen werden. Detaillierte ANleitungen für fdisk finden sich im Internet. Vereinfacht ist folgender Vorgang auszuführen (alle Daten gehen auf dem Stick verloren!).

fdisk /dev/sdc
o
n
p
1
1
+64M
n
p
2 (drei mal Enter drücken)
t
1
82
w

Danach ist der Stick partitioniert. Ein erneuter Aufruf von fdisk -l sollte ungefähr folgendes ERgebnis liefern:

Disk /dev/sdc: 484 MB, 484442112 bytes
2 heads, 63 sectors/track, 7509 cylinders
Units = cylinders of 126 * 512 = 64512 bytes
Disk identifier: 0x8c5e341e
  Device Boot   Start     End   Blocks  Id System
/dev/sdc1        1     993    62527+ 82 Linux swap / Solaris
/dev/sdc2       994    7509   410508  83 Linux

Jetzt müssen die Partitionen noch formatiert werden. Vorsicht: Nur hier heisst der Stick /dev/sdc. Er kann auch anders heissen! Wenn ihr die falschen Namen verwendet, könntet ihr eure Festplatte löschen! /dev/sdc1 ist durch /dev/<euer-sdx>1 zu ersetzen

mkswap /dev/sdc1
mkfs.ext4 /dev/sdc2
sync

Der Stick ist nun fertig vorbereitet und wird im Linux-PC nicht mehr benötigt. Er kann jetzt in den Router

Bauen des OpenWRT-Images

Um OpenWRT zu bauen, müssen die entsprechenden Werkzeuge auf dem Linux-PC installiert sein. Unter Ubuntu geht das so:

sudo apt-get -y install build-essential libncurses5-dev zlib-dev libssl-dev git-core

OpenWRT kann am besten von GitHub ausgecheckt werden.

git clone git://github.com/openwrt/openwrt.git

Das Auschecken dauert eine Weile, aber das ist noch gar nichts, das Bauen dauert noch viel länger. Sobald alles runtergeladen ist, wird in das Verzeichnis gewechselt und die Konfiguration vorgenommen

cd openwrt
make menuconfig

Für die Konfiguration muss die Architektur des Routers bekannt sein. Diese kann auf der OpenWRT-Seite nachgeschlagen werden. der TP-LINK MR3020 hat eine ar71xx-Architektur.

Als erstes also die Architektur auswählen (Hier: ar71xxx/ar91xxx) Zweitens kann beim Target-Profile meinst genau der Router ausgewählt werden (Notfalls auf der OpenWRT-Seite nachlesen)

Optional kann nun unter Image-Configuration bereits eine Netzwerkkonfiguration eingestellt werden, die der Router dann nach seinem Hochfahren hat. Wenn der Router in ein bestehendes Netz mit bestehenden DHCP-Server und Adressraum eingebunden wird, ist das sinnvoll. Wer das hat, weiss auch, was hier einzustellen ist. Standardmäßig ist die Adresse 192.168.1.1 vorgegeben. Die Konfiguration kann auch später jederzeit geändert werden.

Nun zu den Kernel-Modules. Hier sollte folgendes aktiviert werden (Einiges ist ggf. nicht nötig, aber so geht es). Die Einträge müssen mit "*" und nicht mit "M" selektiert sein, sonst kommen sie nicht ins Image.

  • Block-Devices
    • kmod-ide-core
    • kmod-ide-generic
    • kmod-loop (kann man immer mal brauchen)
    • kmod-scsi-generic
  • Filesystems
    • kmod-fs-ext4 (davon wollen wir später vom USB-Stick booten)
  • USB-Support
    • kmod-usb-acm (für CUL)
    • kmod-usb-hid
    • kmod-usb-ohci
    • kmod-usb-serial
    • kmod-usb-serial-ftdi
    • kmod-usb-storage-extras
    • kmod-usb-uhci
    • kmod-usb2

Unter Utilities noch folgendes aktivieren

  • Filesystem
    • e2fsprogs
  • disc
    • fdisk (für Analysezwecke sinnvoll)
    • swap-utils

Nun kann - in aller Ruhe - alles gebaut werden durch Eingabe von

make

Vorbereiten des Routers

Das ganze kann bis zu mehrere Stunden laufen. Nun ist Zeit, den Router ins Netzwerk einzubinden. Wie genau, hängt von der persönlichen Konstellation ab. Der TP-Link MR3020 hat standardmäßig die IP-Adresse 192.168.0.254. Viele andere Router haben z.B. 192.168.0.1. Ich empfehle, das Update auf jeden Fall nicht über WLAN sondern ein Netzwerkkabel zu machen. Die meisten Router haben einen aktivierten DHCP-Server. Ein angestöpselter Windows-PC bekommt dann von ihm eine IP-Adresse zugewiesen. Beim MR3020 kann dann die Weboberfläche über http://192.168.0.254 erreicht werden. (User/Passwort: admin/admin)

Installation von OpenWRT auf dem Router

In der Weboberfläche des Routers gibt es irgendwo einen Menüpunkt zum Firmware-Upgrade. Beim MR3020 erreichbar unter System Tools / Firmware Upgrade. Sobald das Bauen von OpenWRT fertig ist, liegt das Image im Unterordner bin/<architektur>/. Es sollte das Image genommen werden, was den Namen des Routers sowie "squashfs" sowie "factory" im Dateinamen enthält. Dieses muss jetzt im Webinterface wie beschrieben ausgewählt werden und hochgeladen werden. Alle Bestätigungsmeldungen und "Wollen-Sie-Das-auch-Wirklich"-Fragen natürlich bestätigen.

Nach einer Weile sollte dann der Router unter 192.168.1.1 anpingbar sein (von Linux aus: ping 192.168.1.1) bzw. unter der in der Image Configuration eingestellten IP. Wenn das nicht geht, kann man den Router auch ein 2. mal starten, da sollte man dann aber nach dem Flashen mal 10 Minuten Geduld haben (also Stecker raus/rein). Auf keinen Fall zu früh machen, dann könnte es sein, dass er gar nicht mehr hochfährt!

Zunächst muss man sich nun per telnet verbinden.

telnet 192.168.1.1

Nun ist man schon im OpenWRT eingeloggt. Das erste und einzige, was in diesem Login nun gemacht wird, ist, per

passwd

ein Passwort zu setzen. Danach kann man sich mit

exit

ausloggen. Ab jetzt ist telnet zur Sicherheit deaktiviert und man kann per ssh eine Verbindung herstellen, da ja jetzt ein Passwort gesetzt ist

ssh root@192.168.1.1

Für den weiteren Verlauf ist es notwendig, dass der Router Internetzugang hat. Dazu muss man ggf. von Hand in der Datei /etc/config/network die Netzwerkeinstellungen entsprechend anpassen.

vi /etc/config/network

Zur Bedienung von vi z.B. hier

Wichtig ist die IP-Adresse, die Netzmaske, das Gateway und der DNS-Server. Bitte genau auf Tippfehler achten. Bei einer fehlenden Konfiguration ist der Router nicht mehr erreichbar. Nach abspeichern kann die neue Konfiguration aktiviert werden

/etc/init.d/network restart

Falls sich auch die IP-Adresse geändert hat, mit ssh wie oben neu anmelden. Als nächstes soll der USB-Stick eingebunden werden, dazu sind einige Pakete zu installieren. OpenWRT hat einen eingebauten Paketmanager zur Nachinstallation von Software direkt aus dem Netz. Zunächst wird nur das installiert, was in den internen Speicher des Routers muss. Das Root-Dateisystem soll anschließend durch den USB-Stick erweitert werden, um dann dorthin die meiste Software zu installieren. Viele Details hierzu finden sich hier

opkg update
opkg install block-mount

Bei einem Aufruf von

fdisk -l

sollte der an dem Router angeschlossene Stick bereits zu sehen sein (analog zu oben). Hiermit lässt sich dann auch rausfinden, wie das Gerät auf dem Router heisst. In den meisten Fällen dürfte dies /dev/sda sein. In diesem Fall können wir nun das Dateisystem einbinden und dann die Dateien aus dem internen Speicher dorthin kopieren.

mkdir /mnt/sda2
mount /dev/sda2 /mnt/sda2
tar -C /overlay -cvf - . | tar -C /mnt/sda2 -xf -

Nun kann auch schon die Konfiguration so umgestellt werden, dass beim nächsten Neustart der USB-Stick mit ins Root-Filesystem eingebunden wird. Dazu ist die Konfigurationsdatei /etc/config/fstab zu editieren.

vi /etc/config/fstab

Diese sollte danach ungefähr so aussehen, wobei das von Router zu Router abweichen kann. Der automatische Block für "home" kann bearbeitet werden und der Spap-Block ebenfalls auf (hier) /dev/sda1 angepasst werden

config global automount
   option from_fstab 1
   option anon_mount 1
config global autoswap
   option from_fstab 1
   option anon_swap 1
config mount
   option target  /overlay
   option device  /dev/sda2
   option fstype  ext4
   option options rw,sync
   option enabled 1
   option enabled_fsck 1
config swap
   option device  /dev/sda1
   option enabled 1

Nun kann die Konfiguration aktiviert und die Box mit eingestecktem Stick neu gestartet werden

/etc/init.d/fstab enable
reboot

Nun sollte überprüft werden, ob der Stick richtig eingebunden ist

df -h

Die Ausgabe sollte sinngemäß folgende Zeilen enthalten

/dev/sda2        397.7M   19.8M  357.9M  5% /overlay
overlayfs:/overlay   397.7M   19.8M  357.9M  5%

Ist dies nicht der Fall, kann auf der OpenWRT Seite nach Troubleshooting-Möglichkeiten gesucht werden und dann hier fortgesetzt werden. Nachdem nun der Stick erfolgreiche eingebunden werden, können die ganzen Pakete installiert werden, die zum Betrieb von FHEM notwendig sind. Da dies eine Vielzahl der perlbase-Pakete ist, sind hier schlichtweg alle verfügbaren perl-Pakete installiert worden. Ebenfalls einige andere nützliche Werkzeuge. Speichermäßig ist das auf dem USB-Stick nicht entscheidend.

opkg update
opkg install usbutils luci ntpclient uhttpd perl perl-compress-bzip2 perl-dbi perl-html-parser perl-html-tagset perl-html-tree perl-lockfile-simple \
perl-net-telnet perl-uri perl-www perl-www-curl perl-www-mechanize perlbase-abbrev perlbase-anydbm-file perlbase-archive perlbase-assert perlbase-attribute \
perlbase-attributes perlbase-attrs perlbase-autoloader perlbase-autosplit perlbase-autouse perlbase-b perlbase-base perlbase-benchmark perlbase-bigfloat \
perlbase-bigint perlbase-bignum perlbase-bigrat perlbase-blib perlbase-bytes perlbase-cacheout perlbase-cgi perlbase-charnames perlbase-class \
perlbase-complete perlbase-compress perlbase-config perlbase-cpan perlbase-cpanplus perlbase-ctime perlbase-cwd perlbase-data perlbase-db \
perlbase-db-file perlbase-dbm-filter perlbase-devel perlbase-diagnostics perlbase-digest perlbase-dirhandle perlbase-dotsh perlbase-dumpvalue \
perlbase-dumpvar perlbase-dynaloader perlbase-encode perlbase-encoding perlbase-english perlbase-env perlbase-errno perlbase-essential perlbase-exceptions \
perlbase-extutils perlbase-fastcwd perlbase-fatal perlbase-fcntl perlbase-feature perlbase-fields perlbase-file perlbase-filecache perlbase-filehandle \
perlbase-filetest perlbase-filter perlbase-find perlbase-findbin perlbase-finddepth perlbase-flush perlbase-gdbm-file perlbase-getcwd perlbase-getopt \
perlbase-getoptpl perlbase-hash perlbase-hostname perlbase-i18n perlbase-if perlbase-importenv perlbase-integer perlbase-io perlbase-ipc perlbase-less \
perlbase-list perlbase-locale perlbase-log perlbase-look perlbase-math perlbase-memoize perlbase-mime perlbase-module perlbase-mro perlbase-net \
perlbase-next perlbase-o perlbase-object perlbase-opcode perlbase-open perlbase-ops perlbase-package perlbase-params perlbase-perl5db perlbase-perlio \
perlbase-pod perlbase-posix perlbase-pwd perlbase-re perlbase-safe perlbase-scalar perlbase-sdbm-file perlbase-search perlbase-selectsaver \
perlbase-selfloader perlbase-shell perlbase-shellwords perlbase-sigtrap perlbase-socket perlbase-sort perlbase-stat perlbase-storable perlbase-switch \
perlbase-symbol perlbase-sys perlbase-syslog perlbase-tainted perlbase-term perlbase-termcap perlbase-test perlbase-text perlbase-thread perlbase-threads \
perlbase-tie perlbase-time perlbase-unicode perlbase-unicore perlbase-user perlbase-xsloader

Das Webinterface "Luci" ist mitinstalliert worden und bietet komfortable Einstellmöglichkeiten für den Router allgemein. Nach einem

/etc/init.d/uhttpd enable
/etc/init.d/uhttpd start

ist es unter http://192.168.1.1/ bzw. der entsprechenden Router-IP erreichbar. Wichtig ist es ggf. den DHCP-Server zu deaktivieren. Die meisten Router können auch als WLAN-Clients konfiguriert werden, sie brauchen also nicht zwangsweise ein Netzwerkkabel. All dies geht über die Weboberfläche. Nun kann FHEM auf den Router/Stick kopiert werden. In diesem Beispiel benutzen wir das SVN-Repository

opkg install subversion-client make libelf
mkdir /usr/src
cd /usr/src
svn co https://svn.fhem.de/fhem/trunk/fhem
cd fhem
make install-pgm2

Die Bearbeitung der /etc/fhem.cfg ist nun so durchzuführen, wie bei jeder anderen FHEM-Installation auch.

CUL

Wenn ein CUL am Router verwendet werden soll, dann geht dies über den Umweg ser2net, da das CPAN Modul Device::Serial in OpenWRT nicht standardmäßig zur Verfügung steht.

opkg install ser2net
vi /etc/ser2net.conf

In der Datei kann alles gelöscht werden und dann genau diese Zeile eingefügt werden:

27073:raw:300:/dev/ttyACM0:115200 NONE 1STOPBIT 7DATABITS

In der fhem.cfg ist die Definition des CUL-Sticks dann folgendermaßen:

define MyCUL CUL 127.0.0.1:27073 3333

Wenn man CUL doch per Device::Serial ansprechen oder andere FHEM Module verwenden will, die auf Device::Serial angewiesen sind, kann man das entsprechende OpenWRT Paket auch selber erstellen. Hinweise dazu gibt es hier.

Nun muss nur noch der Autostart von ser2net und fhem eingebaut werden und die integrierte, stromsparende FHEM-Kiste ist fertig.

vi /etc/init.d/ser2net

mit folgendem Inhalt

#!/bin/sh /etc/rc.common
# Ser2Net Init Script
START=10
STOP=15
start() {
    ser2net
}
stop(){
    killall ser2net
}

Danach Ser2Net aktivieren und starten:

chmod +x /etc/init.d/ser2net
/etc/init.d/ser2net enable
/etc/init.d/ser2net start

FHEM beim Systemstart

Nun noch die Konfiguration für fhem selbst

#!/bin/sh /etc/rc.common
# FHEM Init Script
START=11
STOP=15
start() {
    /usr/bin/fhem.pl /etc/fhem.cfg
}
stop(){
    echo &quot;shutdown&quot; | nc localhost 7072
}

Und auch hier aktivieren:

chmod +x /etc/init.d/fhem
/etc/init.d/fhem enable
/etc/init.d/fhem start

Logfiles nicht auf USB-Stick

Da das ständige Schreiben 1. langsam und 2. den meisten USB-Sticks nicht gut tut, sollten die Logfiles ins RAM geschrieben werden, also ein Pfad unterhalb von /tmp. Der Speicher ist allerdings begrenzt. Je nach persönlichen Anforderungen muss dann regelmäßig das Log aus dem Speicher gelöscht oder archiviert werden. Z.b. wöchentlich auf den USB Stick oder auf Netzlaufwerke etc. Dies ist mit dem FileLog von alleine möglich (siehe [1]).


Alternative Installation aus den Kompilierten Quellen bei einem Speicher größer 6MB

Zunächst wird OpenWRT auf den Router installiert. Auf die Installation des WEB-Interfaces „luci“ kann verzichtet werden.

Netzwerk einrichten

Der erste Login erfolgt mit telnet (nicht SSH) auf die IP 192.168.1.1 ohne Passwort. Als erstes sollte mit dem Befehl passwd ein Passwort eingestellt werden. Sobald das geschehen ist, wird der Telnet-Dienst abgestellt. Ab jetzt sollte über den SSH-Dienst mit dem eben eingestellten Passwort gearbeitet werden. Mittels vi kann die LAN-IP-Adresse in der Datei /etc/config/network angepasst werden.

config interface 'lan'
...
      option ipaddr '192.168.178.4'
      option netmask '255.255.255.0'
      option gateway '192.168.178.1'
      option dns '192.168.178.1'
...

Die Konfiguration wird mit dem Aufruf von /etc/init.d/network restart übernommen.

Zeitzone in der Datei /etc/config/system einstellen:

config system
...
        option timezone 'CET-1CEST,M3.5.0,M10.5.0/3'
...

PERL installieren

Perl kann wie folgt eingerichtet werden. Je nach verwendetet FHEM-Module müssen weitere PERL-Pakete installiert werden. Für MAX_LAN, HM-CFG-LAN und ECMD reicht die folgende Auswahl:

opkg update
opkg install perl perl-html-parser perl-html-tagset perl-uri perl-www perlbase-autoloader perlbase-config \
perlbase-ctime perlbase-digest perlbase-dynaloader perlbase-errno perlbase-essential perlbase-fcntl \
perlbase-file perlbase-integer perlbase-io perlbase-math perlbase-mime perlbase-posix perlbase-selectsaver \
perlbase-socket perlbase-symbol perlbase-tie perlbase-time perlbase-timelocal perlbase-xsloader

Einbinden der Partitionen per UUID

Für die Verwendung eines USB-Sticks müssen weitere Pakete installiert werden:

opkg update
opkg install kmod-usb-storage block-mount kmod-fs-ext4

Der USB-Stick benötigt eine Datenpartition, optional kann eine zusätzliche SWAP-Partition eingerichtet werden. Hierfür kann der Abschnitt "Vorbereiten des USB-Sticks" aus dem vorherigen Kapitel verwendet werden.

Erstellen eines Verzeichnisses für den FHEM-Daten-Stick:

mkdir /mnt/opt

Mittels des Befehls block kann eine brauchbare fstab-Konfiguration erstellt werden. An dieser Stelle wird mit den eindeutigen UUIDs gearbeitet. So ist es beim Betrieb von mehreren Datenspeichern unerheblich, in welcher Reihenfolge diese eingebunden werden. Dies kann etwas Ärger ersparen.

block detect > /etc/config/fstab

Die Konfigurationsdatei /etc/config/fstab muss angepasst werden. Zunächst sind die Mount-Punkte nicht aktiviert und das Verzeichnis für die Datenpartition muss noch angepasst werden. Die Option uuid muss unverändert bleiben.

vi /etc/config/fstab

Darin

config 'global'
        ...
config 'mount'
        option  target  '/mnt/opt'
        option  uuid    '...'
        option  enabled '1'
config 'swap'
        option  uuid    '...'
        option  enabled '1'

Über einen Neustart oder /sbin/block mount werden die Partitionen eingebunden.

Installation von FHEM

Die Installation von FHEM ist an vielen Stellen sehr gut beschrieben. Hier nur die Quick&Dirty Variante. Die aktuellste, stabile Version herunter laden. Die Version X.Y in den folgenden Befehlen bitte entsprechend anpassen:

cd /mnt/opt/
wget http://fhem.de/fhem-X.Y.tar.gz
opkg update
opkg install tar
tar xfz fhem-X.Y.tar.gz
mv fhem-X.Y fhem

Startskript anlegen

touch /etc/init.d/fhem
chmod +x  /etc/init.d/fhem
vi /etc/init.d/fhem

Darin

#!/bin/sh /etc/rc.common
# FHEM Init Script

START=11
STOP=15

cd /mnt/opt/fhem/

start() {
  if [ -f /mnt/opt/fhem-X.Y/log ]; then
    mkdir -p /mnt/opt/fhem-X.Y/log
  fi
  /mnt/opt/fhem/fhem.pl /mnt/opt/fhem/fhem.cfg
}
stop(){
  echo "stopping fhem"
  /mnt/opt/fhem/fhem.pl 7072 "shutdown"
  #kill -TERM $(cat /var/run/fhem.pid)
}
restart(){
  echo "restarting"
  mnt/opt/fhem/fhem.pl 7072 "shutdown"
  #kill -TERM $(cat /var/run/fhem.pid)
  /mnt/opt/fhem/fhem.pl /mnt/opt/fhem/fhem.cfg
}

Init.d-Script aktivieren:

/etc/init.d/fhem start
/etc/init.d/fhem enable

Ab jetzt sollte FHEM bei jedem Bootvorgang automatisch gestartet werden.

Anmerkungen

  • Es sollte sichergestellt werden, dass keine Dateien außerhalb von /mnt/opt/ geschrieben werden.
  • Die PERL-Version ist leider etwas älter (Version 5.10) an einigen Stellen muss der FHEM-Code angepasst werden. Besonders wenn mit dem „~~“ Operator gearbeitet wurde.