Raspberry Pi - Magic Mirror auf Basis von Arch Linux - Teil 2

10. März 2017 · Anwendungen · andreas · Kein Kommentar

Nachdem in Teil 1 die Grundinstallation des Betriebssystems durchgeführt wurde, folgt nun die Installation der GUI sowie der Magic Mirror-Software.

Grafische Benutzeroberfläche

Während bei Windows die GUI direkt von Microsoft mitgeliefert wird, ist die Auswahl unter Linux recht unübersichtlich. Da die Hardware des Raspberry Pi zum einen recht schwach ist, zum anderen die grafische Benutzeroberfläche lediglich zur Darstellung des Magic Mirror-Browserfensters benötigt wird, fällt die Wahl auf LXDE, eine Oberfläche, die auf Effizienz optimiert wurde und die nur wenige Basiskomponenten für die Grundfunktionalität benötigt.

Die Installation ist schnell erledigt und nach Aktivieren des zugehörigen Dienstes steht nach dem nächsten Neustart eine grafische Anmeldung zur Verfügung.

[root@mirror-pi ~]# pacman -S xorg-server xorg-xinit xorg-server-utils mesa xf86-video-fbdev xf86-video-vesa openbox lxde
[root@mirrow-pi ~]# systemctl enable lxdm.service

Benutzer einrichten

Aus Sicherheitsgründen sollte eine Anwendung wie der Magic Mirror nicht als Systemadministrator, sondern unter einem eigenen Benutzeraccount ausgeführt werden. Wird die Anwendung kompromittiert, so ist zunächst lediglich alles, was im Zugriff des zugehörigen Benutzerkontos steht kompromittiert, nicht aber das komplette System.

[root@mirrow-pi ~]# useradd -m -g users -s /bin/bash mirroruser
[root@mirrow-pi ~]# passwd mirroruser
Geben Sie ein neues Passwort ein:
Geben Sie das neue Passwort erneut ein:
passwd: Passwort erfolgreich geändert

Um das sichere Arbeiten zu erleichtern, sollte das soeben angelegte Benuzerkonto noch der Datei “/etc/sudoers” hinzugefügt werden:

[root@mirror-pi ~]# pacman -S sudo
[root@mirror-pi ~]# vi /etc/sudoers
##
## User privilege specification
##
root ALL=(ALL) ALL
mirroruser ALL=(ALL) ALL

Das ursprünglich vorhandene Benutzerkonto kann - sofern es nicht zur Ausführung des Magic Mirror verwendet wurde - gelöscht werden:

[root@mirrow-pi ~]# userdel -r alarm
userdel: alarm Mail-Warteschlange (/var/spool/mail/alarm) nicht gefunden

Installation Magic Mirror

Da es sich bei Magic Mirror um eine node.js-Anwendung handelt, müssen zur Ausführung sowohl die “nodejs”-Umgebung, der “npm”-Paketmanager sowie einige ebenfalls benötigte Bibliotheken und Programme installiert werden.

[root@mirror-pi ~]# pacman -S nodejs unzip git npm libxtst libxss gconf nss wget unclutter

Anschließend erfolgt die Installation der MagicMirror-Anwendung über das Clonen des zugehörigen GIT-Repositories:

[mirroruser@mirror-pi ~]$ git clone https://github.com/MichMich/MagicMirror.git
Klone nach 'MagicMirror' ...
remote: Counting objects: 6387, done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 6387 (delta 8), reused 0 (delta 0), pack-reused 6361
Empfange Objekte: 100% (6387/6387), 10.81 MiB | 263.00 KiB/s, Fertig.
Löse Unterschiede auf: 100% (3468/3468), Fertig.

Die Anwendung wird in das Unterverzeichnis “MagicMirror” des aktuellen Verzeichnisses geklont und von dort aus installiert:

[mirroruser@mirror-pi ~]$ cd MagicMirror/

[mirroruser@mirror-pi MagicMirror]$ npm install
npm WARN prefer global coffee-script@1.10.0 should be installed with -g
npm WARN prefer global jsonlint@1.6.2 should be installed with -g
npm WARN prefer global colorguard@1.2.0 should be installed with -g

> electron@1.6.1 postinstall /home/mirroruser/MagicMirror/node_modules/electron
> node install.js

magicmirror@2.1.0 /home/mirroruser/MagicMirror
...

Als letzter Schritt vor einem Testlauf muss noch die Konfigurationsdatei kopiert werden, die dann später an die eigenen Bedürfnisse angepasst werden kann:

[mirroruser@mirror-pi MagicMirror]$ cp config/config.js.sample config/config.js

Dann kann der erste Testlauf erfolgen:

[mirroruser@mirror-pi MagicMirror]$ DISPLAY=:0 npm start

Benutzeranmeldung

Damit der Magic Mirror beim Systemstart automatisch mitgestartet wird, sind ein paar weitere Schritte notwendig. Zuerst erfolgt eine automatische Anmeldung des Benutzers am System:

[root@mirror-pi ~]# vi /etc/lxdm/lxdm.conf

Der Kommentar vor der Zeile “autologin” muss entfernt und der Benutzer hier eingetragen werden:

[base]
## uncomment and set autologin username to enable autologin
autologin=mirroruser

Dann folgen noch ein paar Konfigurationseinstellungen des Benutzers, damit Bildschirmschoner, Bildschirmabschaltung sowie Mauszeiger deaktiviert werden:

[mirroruser@mirror-pi ~]$ vi .config/lxsession/LXDE/autostart
@lxpanel --profile LXDE
@pcmanfm --desktop --profile LXDE
@xscreensaver -no-splash
@xset s noblank
@xset s off
@xset -dpms
@unclutter

Automatischer Start des Magic Mirrors

Um den node.js-Anwendung zu starten gibt es mehrere Möglichkeiten, die eleganteste ist wohl im Magic Mirror-Wiki beschrieben und verwendet den Prozess Manager pm2

[root@mirror-pi ~]# npm install -g pm2

Nach der Installation muss der Autostart für den jeweiligen Benutzer konfiguriert werden. Hierbei wird nach einem Aufruf des “startup”-Skripts eine Befehlszeile ausgegeben, welche dann von Hand gestartet werden muss:

[mirroruser@mirror-pi ~]$ pm2 startup
[PM2] Init System found: systemd
[PM2] You have to run this command as root. Execute the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd - u mirroruser --hp /home/mirroruser
[mirroruser@mirror-pi ~]$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2
...

Am Ende des Einrichtungsvorgangs erfolgt der wichtige Hinweis, wie man den aktuellen Zustand so sichern kann, daß er nach einem Neustart wiederhergestellt wird sowie der Hinweis, wie man den Autostart bei Bedarf auch wieder abschalten kann:

[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

Das eigentliche Benutzer-Startskript ist schnell geschrieben und besteht aus lediglich zwei Zeilen:

[mirroruser@mirror-pi ~]$ vi mm.sh
cd ~/MagicMirror
DISPLAY=:0 npm start

Bevor das Skript dann getestet werden kann, muss die soeben erzeugte Datei noch mit dem “Ausführbar”-Attribut versehen werden:

[mirroruser@mirror-pi ~]$ chmod +x mm.sh

Dann kann der Start erfolgen:

[mirroruser@mirror-pi ~]$ pm2 start mm.sh

Zum speichern des aktuellen Zustands reicht nun ein

[mirroruser@mirror-pi ~]$ pm2 save

und der Magic Mirror sollte nach dem nächsten Systemstart automatisch gestartet werden.

Anpassung pm2-Timeout

Wie oben bereits erwähnt, ist ein Raspberry Pi kein Hochleistungsrechner, weshalb das Wiederherstellen des pm2-Status zumindest auf einem Raspberry Pi 2 in der Regel fehlschlägt.

Die Ursache hierfür liefert die Ausgabe von “journalctl”, welche auf einen Timeout hinweist:

[root@mirror-pi ~] journalctl | grep pm2
Mär 08 19:04:47 mirror-pi pm2[395]: [PM2] Spawning PM2 daemon with pm2_home=/home/mirroruser/.pm2
Mär 08 19:04:49 mirror-pi systemd[1]: pm2-mirroruser.service: Start operation timed out. Terminating.
Mär 08 19:04:49 mirror-pi systemd[1]: pm2-mirroruser.service: Unit entered failed state.
Mär 08 19:04:49 mirror-pi systemd[1]: pm2-mirroruser.service: Failed with result 'timeout'.

Die Behebung ist recht einfach: in der Service-Datei des Benutzers muss lediglich der Wert von TimeoutStartSec von den ursprünglichen 8 Sekunden auf einen höheren Wert, z.B. 60 Sekunden geändert werden:

[root@mirror-pi ~]# vi /etc/systemd/system/pm2-mirroruser.service
...
TimeoutStartSec=60
...