Mode kiosk sur une Raspberry Pi 1

Le système

Pour l’un de mes stages il y a quelques semaines, je devais réaliser un écran connecté afin de faire un show room pour une entreprise mais le matériel fournis étant une Raspberry Pi 1, je me suis tout de suite douté qu’il risquait d’avoir des problèmes de performances. De plus pour faire cet écran connecté, le chef de projet avait décidé de le faire en web, peut être qu’il aurait été préférable de le faire avec une autre techno, je ne sais pas car je n’ai pas étudié la question.

Mais des problèmes de performances, oh que oui j’en ai rencontrés !

Pour commencer, je ne connaissais pas les configurations déjà présentes sur la carte et dès que j’ai commencé à mettre en un peu de JS dans mon code pour la page web, le navigateur n’a pas arrété de crasher au démarrage de la rasp.

Bon, après le changement de la conf sur plusieurs navigateurs, de changement de gestionnaire de fenêtre j’ai ai eu marre et j’ai décidé de changer directement de distribution. Ah oui, car la rasp était de base sur une raspbian, alors j’ai installé un archlinux dessus et depuis elle va beaucoup mieux, par contre je ne vous cache pas que le JS est toujours lent mais fonctionnel.

EDIT: tinycorelinux aurait pus être une alternative aussi…

Pour l’installation d’Archlinux, pas besoin d’expliquer comment faire, la doc sur leur site est très bien mais je vous mets quand même un [lien](https://archlinuxarm.org/platforms/armv6/raspberry-pi/#installation) car je suis gentil. ;)

Warning

Avant d’aller plus loin, je vous conseille viviement de changer les mots de passe des comptes root et alarm !

Après l’installation, j’ai dû installer quelques paquets, que voici :

Pour la partie graphique :

  • xorg-server

  • xorg-xinit

  • matchbox-window-manager

  • xf86-video-fbdev

  • xorg-xset

  • fbset

  • xwit (aur)

Et pour la partie serveur web :

  • php

  • php-apache

  • php-mcrypt

  • apache

Démarrage auto

Bon avant d’automatiser le tout nous allons faire en sorte que notre interface graphique démarre sans encombre. Pour ça nous allons créer le fichier .xinitrc ou le modifier si celui-ci est déja présent, voila à quoi ressemble mon fichier de conf:

#!/bin/sh
while true; do
      # Disable DPMS / Screen blanking
      xset -dpms
      xset s off

      # Reset the framebuffer's colour-depth
      fbset -depth $( cat /sys/module/*fb*/parameters/fbdepth );

      # Hide the cursor (move it to the bottom-right, comment out if you want mouse interaction)
      xwit -root -warp $( cat /sys/module/*fb*/parameters/fbwidth ) $( cat /sys/module/*fb*/parameters/fbheight )

      # Démarre le gestionnaire de fenétre (suprimer "-use_cursor no" si vous vouler l'intégration de la souris)
      matchbox-window-manager -use_titlebar no -use_cursor no &
      midori -a http://127.0.0.1/Magpie-box -e Fullscreen
done;

Je précise que dans le cas actuel ma boucle permet de redémarer le navigateur en cas de crash de celui-ci au cas où… Et pour démarrer cette interface graphique un simple coup de startx et c’est plié.

Le navigateur

On va s’occuper de l’étape où j’ai passé la plus part de mon temps, la configuration du navigateur. Car après m’être littéralement battu avec eux j’ai enfin trouvé la solution ! Sur la Raspberry Pi 1 seulement midori et firefox pouvaient tourner mais le problème est le suivant :

  • Midori prend peu de ressources mais a quelques soucis avec le javascript;

  • Firefox gère très bien le javascript mais prend trop de ressources pour la rasp – je parle du cas où il y a des images plutôt lourdes à charger, ce qui était mon cas pour le projet malheureusement :/

Midori pose aussi problème lorsqu’on éteint et qu’on redémmare la rasp de manière brutale, physiquement, le navigateur tente de recharger l’onglet fermé mais n’y arrive pas et du coup il faut rafraichir la page à la main mais je n’ai pas trouvé le moyen de désactiver ce fichu plugin malheureusement.

Donc j’ai opté pour firefox, par contre le mode kiosk n’est possible qu’en installant un plugin et cela ce fait de manière graphique, je n’ai pas encore regardé pour le faire via le terminal. Il faut commencer par modifier la config en tapant dans la bar d’adresse about:config et approuver qu’on ne va pas tout casser. Après on change l’option de vérifiction de la signature du plugin de true à false : je ne comprends pas trop

xpinstall.signatures.required false

Et maintenant on installe le [plugin](https://github.com/NeodarZ/r-kiosk/blob/master/build/r_kiosk.xpi).

EDIT: luakit est une alternative à ne pas écarter mais [qutebrowser](https://qutebrowser.org) semble être une meilleur alternative… ;)

Configuration du serveur web

Une fois ceci configuré, il faut configurer le serveur web pour qu’il soit compatible avec php7, pour cela il faut éditer le fichier /etc/httpd/conf/httpd.conf et commenter la ligne suivante :

LoadModule mpm_event_module modules/mod_mpm_event.so

Afin de décommenter la ligne suivante :

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Ah et ne pas oublier de rajouter cette ligne à la fin :

Include conf/extra/php7_module.conf

Mise en place de la connection automatique

Maintenant que notre interface graphique démarre tranquillement, on va pouvoir automatiser le tout, pour cela on va commencer par faire en sorte que la connection soit automatique pour cela on crée le dossier suivant : /etc/systemd/system/getty@tty1.service.d/

Et enfin créer et modifier le fichier suivant : /etc/systemd/system/getty@tty1.service.d/override.conf :

[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin alarm --noclear %I 38400 linux

On peut remarquer que j’ai mis deux fois ExecStart=, ce n’est pas une erreur, c’est juste que ma rasp ne voulait pas booter automatiquement avec un seul alors qu’avec deux, c’était nickel… Aller savoir pourquoi ^^

Bon maintenant que notre session se lance il va faloir faire en sorte que notre belle interface graphique se lance toute seule comme une grande, alors pour ça il faut commencer par copier le fichier suivant : /etc/skel/.bash_profile et ajouter à la fin :

[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx

Et là on se dit, oui c’est fini ! Et bien non ! :p Ce serait trop facile. Pour faire simple, il faut juste autoriser n’importe quel utilisateur à lancer le serveur Xorg. Pour cela il vous faut créer et modifier le fichier /etc/X11/Xwrapper.config et ajouter cette ligne :

allowed_users=anybody

Et voila maintenant c’est bon, nous pouvons profiter de notre mode kiosk fraichement installé ! ;) Personnellement je ne vous cache pas que je me suis battu avec la conf de mon navigateur qui finalement démarre sans trop de difficulté…