Comment configurer le mode «kiosque» dans Raspbian?

10

Je veux configurer mon Raspberry Pi dans une sorte de mode "kiosque" où il démarre dans une seule application plein écran. Je connais bien la ligne de commande, mais je suis novice en ce qui concerne la personnalisation du comportement de démarrage Linux. Je construis l'application et je prévois d'ajouter la possibilité d'arrêter le Raspberry Pi en toute sécurité. Que dois-je faire pour configurer mon Raspberry Pi pour exécuter uniquement cette application?

Mise à jour: pour être clair, je ne veux pas ouvrir une page Web . Je ne veux pas non plus changer de système d'exploitation. Je veux apprendre à configurer mon système d'exploitation (Raspbian) pour lancer ma propre application au lieu de X (bien que mon application puisse dépendre du rendu X en arrière-plan).

Andrew
la source

Réponses:

7

Je n'ai jamais essayé cela, mais comme il semble que vous cherchiez toujours et n'avez pas obtenu de réponse depuis près d'un mois, je vais vous dire par où commencer.

Ce mode d'emploi est ancien, mais le schéma général semble solide. Vous n'avez pas à tout faire exactement de la même façon. Il se concentre sur l'utilisation d'un navigateur Web comme pièce maîtresse, mais cela n'est généralement pas pertinent ici (c.-à-d., Détendez-vous, ce n'est pas un autre "kiosque Web").

Il fait référence à /etc/inittabce que la plupart des distributions Linux n'utilisent plus, mais il se trouve que Debian Wheezy (raspbian) le fait. L'idée est que vous allez utiliser le niveau d'exécution 4 comme kiosque et en faire la valeur par défaut. Vous pouvez le faire ou simplement utiliser ce qui est actuellement la valeur par défaut (2 ou 3, je pense). Le raspbian que j'utilise actuellement a été modifié par moi, donc je ne sais pas quelles étaient les différences d'origine entre les /etc/rc[N].drépertoires - qui correspondent aux 7 niveaux d'exécution. Vous voulez soit en utiliser un qui ne démarre pas la connexion graphique ( lightdm), soit le supprimer lightdmde ce niveau d'exécution. Vous pourriez aussi bien faire ce genre de chose dans le bon sens (voir man update-rc.d).

Ensuite, en suivant cette partie de la procédure, vous souhaitez créer votre propre script de service de démarrage (aka. Init) pour démarrer X et votre application sans connexion. Cependant, ne le faites pas de cette façon; vous devez vous conformer à debian, alors voyez /etc/init.d/README. De plus, vous n'avez pas du tout besoin d'utiliser un gestionnaire de fenêtres (bien que ce fvwmsoit toujours bien, je pense surtout à ce genre de chose, alors gardez-le à l'esprit si vous le faites), car un .xinitrccomme ceci:

#!/bin/sh

myApp

Exécute uniquement votre application en clair X - ce qui est très simple: pas de menus, pas de barres de titre, pas de barres d'outils, etc., ou un moyen pour l'utilisateur de démarrer une autre application ou d'obtenir un shell. Il fournit juste un curseur.

Un problème avec cela est que si vous allez directement sur un bureau à partir du démarrage, ce sera un bureau superutilisateur. En fait, les instances X ont toujours un UID de 0, mais les applications exécutées à partir de xinitrc s'exécutent en tant qu'utilisateur qui a démarré X - dans ce cas, X a été démarré par init, donc l'utilisateur sera root (bien que techniquement root ne soit pas connecté) ). Par conséquent, le xinitrc ci-dessus serait meilleur avec:

su -c myApp pi

Qui exécutera votre application en tant qu'utilisateur pi à la place (qui n'est également techniquement pas connecté).

Étant donné que techniquement, personne n'est connecté, même si l'utilisateur du kiosque tue X (par exemple via ctrl-alt-delete), il sera simplement laissé à une invite de connexion. La procédure va au-delà de telle sorte que le script d'initialisation du service démarre X (voir la remarque ci-dessous) au premier plan afin qu'à sa sortie, le script de service continue et s'exécute shutdown -r now.

N'oubliez pas que quelqu'un qui a un accès physique à une machine (normale) peut toujours contourner la sécurité que vous implémentez, donc tout ce que vous essayez vraiment de faire ici n'est pas de le rendre trop facile et de prévenir les accidents désagréables.

Souvenez-vous également que, puisque votre service de démarrage le fera au premier plan, aucun autre service ne s'exécutera après , alors assurez-vous qu'il s'agit du dernier absolu. Très important! Vous pouvez, en fait, utiliser à la /etc/rc.localplace, car cela est normalement garanti pour durer;) Cela vous fera gagner du temps.

REMARQUE: En fait, dans le guide, c'est un autre script /root/kiosk, de cette section . Notez que ce n'est qu'une ligne qui fait référence au .xinitrcscript montré dans la section ci-dessus (3.4). Mettez simplement une ligne comme ça dans votre script de démarrage directement. Votre xinitrc (préliminaire), comme déjà décrit, sera beaucoup plus simple.


Une alternative à rester au premier plan avec init ...

Le but de laisser l'invocation X au premier plan est simplement de bloquer l'exécution du script init jusqu'à ce que X se termine, afin que la ligne suivante du script ( shutdown) s'exécute:

startx
shutdown -r now

Ici, j'ai utilisé à la startxplace de la /usr/X11R6/bin/xinit /root/kiosk.xinitrc ....ligne de conseils. Cela utilisera $HOME/.xinitrc, et $ HOME le serait /root. Je suis sûr que startx est également un appel bloquant, donc jusqu'à ce que X se termine, shutdownne fonctionnera pas. Si au lieu de cela vous avez fait ceci:

startx &
shutdown -r now

X fonctionnerait, mais l'arrêt s'arrêterait aussi tout de suite (évidemment inutile).

Vous n'avez pas à utiliser cette astuce si vous ne vous souciez pas de la fermeture - comme mentionné, l'utilisateur se retrouvera simplement avec une invite de connexion. Mais cela semble être une idée utile, car alors vous pouvez simplement le désactiver avec ctrl-alt-backspace. Une autre idée, si votre application peut être fermée, serait d'utiliser startx &dans le script init, qui la met en arrière-plan et permet à init de continuer normalement (c'est très bien; X sera toujours en cours d'exécution et aura le contrôle de l'affichage - "backgrounded" est un peut-être un terme déroutant). Au lieu de dans le script init, shutdownplacez plutôt le xinitrc:

#!/bin/sh
#/root/.xinitrc

su -c myApp pi
shutdown -r now

Même astuce, endroit différent. Maintenant, quand quelqu'un ferme myApp, l'arrêt se produira (mais s'il tue X, ce ne sera pas le cas). Vous pouvez également le faire dans les deux sens, mais j'aime mieux celui-ci car cela signifie que vous pouvez quitter X et obtenir une connexion, ce qui peut être utile parfois, et vous pouvez également désactiver facilement le système à partir de l'interface graphique.

Ne pas background ( &) myApp dans le .xinitrc même s'il n'y a pas d'arrêt après, car lorsque le .xinitrc est terminé, X se ferme;) Le dernier appel doit persister au premier plan (normalement, c'est un DE ou une fenêtre directeur).

Init scripts et .xinitrcsont des concepts similaires. L'un est exécuté par init, qui est le processus 1 sur linux (c'est le seul processus démarré par le noyau). L'autre est géré par le serveur X. Notez qu'il existe des fichiers .xinitrc et une commande xinitrc (ils sont liés mais pas identiques).

Boucles d'or
la source
Si Raspbian utilise /etc/inittabmais la plupart des autres ne le font plus, que font-ils à la place?
Andrew
Donc, si je veux autoriser l'accès ssh pendant que mon application s'exécute au premier plan, je dois m'assurer que mon .xinitrcscript s'exécute après cela, n'est- ce pas?
Andrew
Debian utilise un système d'initialisation "sysV" et inittabfait partie de tout cela. Les démons init les plus courants sont maintenant systemdet upstart.
goldilocks
WRT votre application s'exécutant au premier plan, c'est simplement parce que (sysV) initattend que ces scipts reviennent avant de démarrer la suivante. Donc normalement dans un script d'initialisation, si vous démarrez un service persistant, vous le fondez (aka. Fork) via &. Ensuite, le script lui-même se termine, mais le processus "en arrière-plan" continue. "Backgrounding" se réfère simplement à une chaîne d'exécution, pas quelque chose à propos de ce qui apparaît à l'écran - vous pouvez mettre en arrière-plan votre invocation X ( lightdmdoit être en arrière-plan) ... Je vais modifier quelque chose à ce sujet.
goldilocks
WRT ssh, le sshservice (lié /etc/rc[N].d) doit démarrer avant le vôtre, de sorte qu'il sera exécuté ("en arrière-plan") pour répondre aux connexions. C'est toujours un système multitâche;)
goldilocks
2

Regardez ce projet «Digital Signage». Il démarre à l'interface graphique puis ouvre un navigateur propulsé HTML5. Je n'ai pas encore essayé mais je veux. Vous pouvez peut-être mettre votre application à la place du navigateur pour démarrer en plein écran.

http://www.binaryemotions.com/raspberry-digital-signage/

gurcanozturk
la source
Merci pour votre réponse, mais cela ressemble à un remplacement de Raspbian qui est configuré pour afficher un navigateur. Je voudrais apprendre les étapes pour configurer Raspbian comme je le souhaite.
Andrew
Il n'y a aucune mention de Raspbian dans votre question. Essaye ça. pikiosk.tumblr.com/post/38721623944/…
gurcanozturk
0

Mentionné Raspberry Digital Signage est un système d'exploitation qui affiche une vue plein écran restreinte à la page Web ou au diaporama / liste de lecture vidéo spécifiée sans aucun moyen de s'échapper mais de redémarrer la machine.

Il peut en effet afficher à la fois une vue Web (affichage des pages HTML / HTML5) et une vue multimédia (diaporama d'images et lecteur vidéo). La vue Web a trois sous-vues possibles: Firefox, Chromium et Midori (avec prise en charge de Gnash).

Les expériences Chrome et Midori sont disponibles dans la version 2.0.

Émotions binaires
la source