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

Keine Kommentare:

Kommentar veröffentlichen