Mittwoch, 25. November 2015

Alles automatisch

Ich bin absoluter Fan von automatischen, Script gesteuerten Installationen. Die Vorteile scheinen enorm. Vor allem:
  • Man dokumentiert mit den Scripts exakt den Installationsablauf.
  • In Zukunft läuft eine Neuinstallationen von ganz alleine.
Zumindest in der Theorie, in der Praxis bedeutet es vor allem viel Zeit bis so eine Installation läuft.
Ich hätte wahrscheinlich in der Zeit, die ich für meine "Forschung" vertan habe, gut und gerne 50 Raspberry Systeme per Hand installieren können. Egal, ich habe es gemacht und will gerne meine Ergebnisse und Erfahrung teilen.

Ursprünglich wollte ich nicht warten bis das offizielle Jessie Raspbian Image von raspberrypi.org verfügbar ist. Aber dann hat alles etwas länger gedauert. In den meisten Fällen wird das offizielle Image die bessere Wahl sein, um seinen Raspberry Pi aufzusetzen. Ich habe deshalb auch Wert darauf gelegt, dass meine Scripts weitestgehend unabhängig davon laufen ob man ein fertiges Image oder ein gerade "aktuell" heruntergeladenes mit raspbian-ua-netinst hat.
Bei mir dauert das gesamte Image mit den grundlegenden Paketen für mein FHEM System ca. 73 min für download und Setup auf der SD Card.
Selbst das Basisimage dauert zwischen 30 und 42 min. Also nicht gerade schnell und ich empfehle für denjenigen der mit den Installationsscripts experimentieren will, dieses Image abzuspeichern (analog zu meinem Beitrag) und es immer wieder als Ausgangspunkt zu verwenden. Das Image auf eine SD Card zurück schreiben dauert bei 12 MB/sec Schreibgeschwindigkeit nur ca. 4,5 min.
Wer mit raspbian-ua-netinst an sich spielen will: die absolute minimal Installation dauert bei mir ca. 28 min (DSL 2300, netinst Version 1.0.7).
Man braucht nur im Fehlerfall den lokalen Monitor und Tastatur. Nach erfolgreicher Installation greift man mit ssh (putty) auf den raspberrypi (Hostname) zu.

Basisimage

Wer das Original Image von raspberrypi.org verwenden will, kann es einfach herunterladen und mit einem Image Tool seiner Wahl (z.B. win32diskimager) auf die SD Card (=> 8 GB) schreiben.  Die SD Card muss hierfür nicht separat formatiert werden. Mit raspi-config sollte das System nach dem ersten Start konfiguriert werden.
Für die automatische Installation ist dann nur mein Script system-install.sh notwendig.

Für ein schmales "netinst" Image laden wir die aktuelle Zip Datei von hier.

  • Die SD Card (=> 4GB) wird mit SD-Formatter formatiert, falls die SD Card schon im Raspberry steckte: Resize Option verwenden!
  • Der Inhalt der ZIP Datei (ca. 17 MB groß) wird auf die SD Card kopiert, es ist kein Image Tool notwendig!
  • Soll die Installation komplett automatisch erfolgen, werden einfach alle notwendigen Script und Textdateien mit auf die SD Card kopiert.
  • Netzteil anschließen, warten - fertig.

Wichtig!:

Es ist wichtig, die SD Card mit dem Programm SD Formatter zu formatieren und nicht einfach mit Windows. Obwohl in beiden Fällen von der SD Card gestartet werden kann, funktioniert die Installation und Umpartitionierung der SD Card nur nach der Formatierung mit SD Formatter.

Die von mir bereitgestellten Dateien müssen/können angepasst werden. Dies macht man z.B. mit Notepad ++.
Ganz wichtig ist darauf zu achten, dass die Dateien im Unix Format (nur LF als Zeilenende) erzeugt werden um Fehler zu vermeiden. Notepad von Windows erzeugt Dateien im Windows Format (CR und LF als Zeilenende). Obwohl die Dateien im Windows/Dos Format ohne Fehlermeldung akzeptiert werden und durchaus auch funktionieren können, gibt es völlig unerwartete Reaktionen die ausschließlich auf das falsche Dateiformat zurückzuführen sind. Das hat mich einiges an Zeit gekostet weil ich mal schnell etwas per cut&paste aus Notepad kopiert habe und nicht auf das Dateiformat geachtet habe.

Die Datei "installer-config.txt"

Jede Zeile in der installer-config.txt hat einen default Wert. Dieser Wert ist offenbar Versionsabhängig und sollte im Zweifelsfall weggelassen werden. Also bitte nur Zeilen eintragen die vom default Wert abweichen.
Allerdings funktionierte eine Datei nur mit der Zeile "release=jessie) nicht, ich habe immer mindestens die ersten vier Zeilen angeben.
Die Datei darf keine zusätzlichen Leerzeichen enthalten, also packages=pkt1,pkt2 und nicht packages= pkt1,pkt2

packages=alsa-utils,apt-utils,build-essential,console-setup,fonts-freefont-ttf,git,keyboard-configuration,nano,rng-tools,strace,sudo,unzip,usbutils
release=jessie
hostname=RaspberryPi
bootsize=+128M
rootsize=+3200M

Die Installation mit dieser Datei (und ohne post-install.txt) dauert bei mir ca. 42 min. Es werden nur einige notwendige Packages installiert die im Original Raspbian Image auch enthalten sind.

Anmerkung

Aufgrund der verwendeten Paketquellen können nicht alle Pakete installiert werden. Je nach Lage der Pakete kann sich das jederzeit auch mal ändern. Ich habe mir so geholfen, dass ich bestimmte Pakete über die post-install.txt installiere. Das könnte man auch mit allen zusätzlichen Paketen machen und in der installer-config.txt nur release, hostname und Partitionsgrößen definieren.

Partitionsgröße

Die Angaben zur Partitionsgröße werden mit dezimalen Faktoren umgesetzt. Meine Angabe mit 128M erzeugt eine Partition die unter Windows mit 122 MByte (exakt MiB) angezeigt wird. Will man eine Partition mit binärem Teiler von 128 MiB erzeugen müsste man 134217728 (128*1024*1024) eintragen. Hier findet man etwas zu diesem Thema.
Im Installationsscript von netinst wird die Größe mit fdisk umgesetzt, man könnte also mit fdisk Parametern experimentieren: +123000000, +123000K, +123M

Account

Da ich hier keine Anpassung vorgenommen habe, wird der Standard Account root mit dem Passwort raspbian erzeugt.


Die Datei "post-install.txt"

Die Readme sagt dazu:
There is also another configuration file you can provide, post-install.txt, and you place that in the same directory as installer-config.txt. The post-install.txt is executed at the very end of the installation process and you can use it to tweak and finalize your automatic installation.
The configuration files are read in as shell scripts, so you can abuse that fact if you so want to.

Die Datei post-install.txt wird als Shell Script ausgeführt. Prinzipiell kann man darin also "alles" machen. Es gibt aber Einschränkungen:
Das Dateisystem unterscheidet sich vom fertig installierten raspbian:
  • Suchpfade sind nicht vorhanden
  • Es existiert keine "Root" man muss vor jede Pfadangabe /rootfs bzw /bootfs hängen.
  • Programme die davon ausgehen, dass eine Root existiert muss man mit "chroot /rootfs" aufrufen.
Das wird zum Einen leicht nervig, zum Anderen ist dann dieses Script nicht ohne weiteres an andere Stelle verwendbar. Deshalb habe ich mich dazu entschlossen aus der post-install.txt lediglich weiter Scripts aufzurufen. Da die Root Dateiumgebung an den Prozess vererbt wird, gilt diese dann für das gesamte Script. Damit wird der Syntax im Script wieder halbwegs normal und man kann das Script auch manuell im fertigen System aufrufen. Ich habe mich dazu entschlossen zwei Scripts zu machen. Diese kann man beliebig aufgliedern oder zusammenfassen. Um config Dateien zu schreiben und zu verändern habe ich bewusst unterschiedliche Techniken/Möglichkeiten eingebaut.

 chroot /rootfs /bin/bash /boot/system-config.sh  
 chroot /rootfs /bin/bash /boot/system-install.sh  

Das Script "system-config.sh"

In dem Script will ich Dinge einbauen, die man vielleicht typischerweise auch mit raspi-config oder anderen, interactiven Tools erledigt. Damit soll diese Script Einstellungen tun und Pakete installieren, die im offiziellen Raspbian Image vorhanden sind.
  • Zeitzone einstellen
  • Keyboard einstellen
  • System Sprache einstellen 
  • Benutzer pi anlegen
  • Firmware und dazu notwendige Software installieren
  • Wlan einrichten
  • Raspi Tools installieren
  • Startumgebung des pi anpassen
Mein aktuelles Script läuft ca. 10 min. Die Zeit hängt auch wesentlich davon ab, ob die apt-get Datenbasis aktuell ist oder durch das Script wesentlich aktualisiert wird. Das Script verwendet weitere Textdateien mit Konfigurationsinformationen. Diese müssen mit auf die SD Card kopiert werden: config.txt.org, wpaconfig.txt.

Das Script "system-install.sh"

In dem Script soll vor allem zusätzliche Software installiert werden und es soll auch auf einem offiziellen Raspbian Image ausgeführt werden können.
  • Software installieren
  • Samba konfigurieren
  • Scripts kopieren und Rechte setzen
  • Dienste konfigurieren
  • FHEM herunterladen und eventuell installieren
Mein aktuelles Script läuft ca. 20 min. Es benötigt keine weiteren Dateien.

Hier gibt es alle besprochenen Scripts zum download.
Ich übernehme keine Verantwortung für Funktion und eventuelle Schäden!
Alle Scripts sind als Beispiele zu verstehen! Insbesondere die Datei wpaconfig-Public.txt muss editiert werden und als wpaconfig.txt gespeichert werden.
Der Inhalt des Links kann sich jederzeit der aktuellen Situation anpassen.

Tipps

Wer den Benutzer Root deaktivieren will (wie im Original Image) kann dies tun:
 sudo passwd -l root  

Der Installationsprozess ist von der Download Geschwindigkeit und der Schreibgeschwindigkeit der SD Card abhängig. Schnelle SD Card und Raspberry Pi 2 verkürzen die Installationszeit.

Die Code Zeilen wurden mit Hilfe vom dieser Seite formatiert:
http://codeformatter.blogspot.de/2009/06/how-to-format-my-source-code-for.html

Samstag, 14. November 2015

FHEM und Jessie

Ich hatte ja mal aufgeschrieben wie man FHEM auf dem Raspberry Pi ziemlich geradlinig neu einrichtet. Nun gibt es seit kurzem ein offizielles Raspbian Image auf der Basis von Jessie, der neuen Debian Version. Die Welt hat sich insgesamt ein wenig weiter gedreht und es ergeben sich ein paar Änderungen.
Das aktuelle Raspbian Jessie Images (1,3 GB) gibt es wie immer auf der offiziellen Seite.  Die Zip Datei wird entpackt, sie ist wesentlich größer als noch mit Wheezy. Die Image Datei passt nicht mehr auf eine 4 GB SD Card ist auch für das FAT32 Dateisystem zu groß.
Jetzt startet man den Raspberry wie gewohnt und alles weitere funktioniert über Terminalzugang. Mit Raspi-config sollte mindesten die "Internationalisation Options" eingestellt werden. Vor allem Zeitzone und Zeit, damit man von Beginn an richtige Zeitstempel hat.
Das Jessie Image startet per default in die graphische Oberfläche, für einen FHEM Server wahrscheinlich sinnlos. Das kann man auch gleich mit raspi-config abschalten.
Überhaupt ist ziemlich viel in das Image gepackt, was die meisten auf einem Raspberry Pi nicht brauchen werden.

Als Erstes auf alle Fälle:
sudo apt-get update && sudo apt-get upgrade 

Dann die gesamte notwendige Software, das funkioniert wie bisher:
sudo apt-get install expect libdevice-serialport-perl libdigest-md5-file-perl libgd-graph-perl libimage-librsvg-perl libio-socket-ssl-perl libjson-perl liblwp-protocol-http-socketunix-perl liblwp-protocol-https-perl libnet-ssleay-perl libsoap-lite-perl libwww-perl libxml-simple-perl msttcorefonts perl python-dev python-rpi.gpio samba samba-common-bin sendemail telnet && sudo cpan install Digest::SHA1

Aufräumen:
sudo apt-get clean && sudo apt-get autoremove

Meine Konfiguration von damals mit FHEM auf der Fritzbox ist obsolete, aber die das Taster gesteuerte Shutdown und Neustart ist nach wie vor aktuell. Also das Script kopieren und anschließend Rechte setzen und Sonos Soundausgabe vorbereiten.
sudo chmod 777 /home/pi/shutdown.py && sudo mkdir /mnt/SonosSpeak && sudo chmod 777 /mnt/SonosSpeak/

Ab jetzt kommen ein paar Neuerungen ins Spiel. Für den Start des Scripts wird unter Systemd ein Dienst eingerichtet. Als erstes wird eine Datei angelegt, am Einfachsten gleich mit dem Editor:
sudo nano /etc/systemd/system/pishutdown.service

Inhalt:
[Service]
ExecStart=/usr/bin/python /home/pi/shutdown.py
WorkingDirectory=/home/pi
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=pishutdown
User=root
Group=root
[Install]
WantedBy=multi-user.target

sudo chmod 777 /etc/systemd/system/pishutdown.service

Der Dienst muss aktiviert und gestartet werden. Der Start hat bei mir erst nach dem nächsten reboot funktioniert.
sudo systemctl enable pishutdown.service
sudo systemctl start pishutdown.service

Das läuft bei mir wie bisher, es gibt aber auch hier andere Möglichkeiten und andere Scripts. Im ursprünglichen Post ist eine heftige Diskussion mit jede Menge Vorschlägen entstanden.

Email mit sendEmail verschicken hat sich in der Einrichtung auch vereinfacht. Im FHEM Wiki wurde mittlerweile eine wichtige Korrektur zu meinem ursprünglichen Artikel veröffentlicht. Stand heute ist das aber nicht mehr notwendig. Die dort beschrieben Änderung in der ehemaligen Zeile 1907 ist jetzt in Zeile 1933 schon wie im Wiki beschrieben enthalten. 
Damit funktioniert sendEmail auf Anhieb.

Der Samba Service muss noch konfiguriert werden, da ich Dateien für SonosSpeak bereitstellen will.
sudo mkdir /mnt/SonosSpeak
sudo chmod 777 /mnt/SonosSpeak/
sudo nano /etc/samba/smb.conf

Folgende Zeilen hinzufügen:
[SonosSpeak] comment = Audio-Files for SonosPlayer to Speak 
read only = false 
path = /mnt/SonosSpeak 
guest ok = yes

Normalerweise ist per default in der Global-Sektion kein Eintrag für den Parameter Security vorhanden und steht damit auf user. Hier muss normal nichts eingetragen werden!
[global]
security = user

Der Restart des Samba-Servers funktioniert nun so:
sudo systemctl restart smbd.service
Die Installation von FHEM mache ich nach wie vor über Paket Download und Paketverwaltung dpkg. Die Einrichtung über Aptitude wie hier beschrieben habe ich mal probiert. Ich konnte da keine Vorteile erkennen.
wget http://fhem.de/fhem-5.6.deb && sudo dpkg -i fhem-5.6.deb

Das so aktualisierte Image kann man natürlich wieder als eigenes Image ablegen.

Das Jessie Image ist 4224000000 Byte groß, das sind 4125 Sektoren a 1024 byte. Zum Kopieren starten wir wieder den Raspberry mit einem anderen System, das zu kopierende System muss "offline" sein. Die SD Card kommt in einen USB Reader und wir benötigten einen Stick mit einem Dateisystem für Dateien größer 4GB. 
Ich habe auf die "Schnelle" probiert, das Image auf der SD Card des laufenden Systems zu erzeugen, da diese genug freien Platz hatte (16 GB). Anschließend habe ich die Imagedatei mit Winscp übers Netzwerk kopiert, dass dauert allerdings ca. 35 Minuten bei 2 MBit/sec - die Netzwerkschnittstelle des Raspbberry ist eben nicht die Schnellste.
sudo dd bs=1M count=4125 if=/dev/sda of=/home/pi/raspbian.img

Dies dauert mit 7,6 MB/s knapp 10 min. 

Will man kleinere Images und benötigt nicht ein komplettes Raspbian, kann man mit dem netinst Image ein minimales aktuelles System erstellen. Dazu wird es einen extra Beitrag geben.