OpenWRT

Aus FHEMWiki
Version vom 26. Juli 2017, 19:00 Uhr von Markusbloch (Diskussion | Beiträge) (Anpassung von <source>-Tags nach <syntaxhighlight>)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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.