Non l'ho mai provato, ma dato che sembra che tu stia ancora cercando e non abbia ricevuto risposta da quasi un mese, ti dirò da dove comincerei.
Questo how-to è antico, ma il profilo generale sembra valido. Non devi fare tutto esattamente lo stesso. Si concentra sull'uso di un browser Web come elemento centrale, ma ciò è per lo più irrilevante qui (vale a dire, rilassati, non è un altro "web-kiosk").
Si riferisce a ciò /etc/inittab
che la maggior parte delle distribuzioni di Linux non usano più, ma succede così che debian wheezy (raspbian) lo fa. L'idea è che userete runlevel 4 come chiosco e renderlo predefinito. Puoi farlo o semplicemente usare qualunque sia l'impostazione predefinita (2 o 3, credo). La raspbian che ho in esecuzione in questo momento è stata modificata da me, quindi non sono sicuro di quali fossero le differenze originali tra le /etc/rc[N].d
directory, che corrispondono ai 7 runlevel. Si desidera utilizzare uno che non avvia il login grafico ( lightdm
) oppure rimuovere lightdm
da quel runlevel. Potresti anche fare questo tipo di cose nel modo giusto (vedi man update-rc.d
).
Quindi, seguendo questa parte del tutorial, vuoi creare il tuo script del servizio di avvio (aka. Init) per avviare X e la tua app senza un login. Non farlo in questo modo, tuttavia; devi conformarti a debian, quindi vedi /etc/init.d/README
. Inoltre, non è necessario utilizzare un gestore di finestre (anche se fvwm
è comunque ottimo, penso in particolare per questo tipo di cose, quindi tienilo a mente se lo fai), perché è .xinitrc
così:
#!/bin/sh
myApp
Eseguirà solo la tua app in X semplice, il che è molto semplice: nessun menu, nessuna barra del titolo, nessuna barra degli strumenti, ecc. O un modo per l'utente di avviare un'altra applicazione o ottenere una shell. Fornisce solo un cursore.
Un problema con questo è che se vai direttamente su un desktop dal boot, sarà un desktop superutente. In realtà, le istanze X hanno sempre un uid di 0, ma le applicazioni eseguite da xinitrc vengono eseguite come l'utente che ha avviato X - in questo caso X è stato avviato da init, quindi l'utente sarà root (anche se tecnicamente root non è connesso ). Quindi lo xinitrc sopra sarebbe meglio con:
su -c myApp pi
Che eseguirà invece la tua app come utente pi (che non è anche tecnicamente connesso).
Dal momento che tecnicamente nessuno ha effettuato l'accesso, anche se l'utente del chiosco uccide X (ad es. Via ctrl-alt-delete
), verrà lasciato al prompt di accesso. Il how-to va oltre quello in modo tale che lo script di init di servizio avvii X (vedi NOTA sotto) in primo piano in modo tale che quando esce, lo script di servizio continua e viene eseguito shutdown -r now
.
Ricorda che qualcuno che ha accesso fisico a una macchina (normale) può sempre aggirare qualunque sicurezza tu abbia implementato, quindi tutto ciò che stai davvero cercando di fare qui non è renderlo troppo facile e prevenire spiacevoli incidenti.
Ricorda inoltre che dal momento che il tuo servizio di avvio lo farà in primo piano, nessun altro servizio verrà eseguito dopo di esso , quindi assicurati che sia l'ultimo in assoluto. Molto importante! In effetti, potresti /etc/rc.local
invece usarlo , dato che normalmente è garantito che sia l'ultimo;) Ciò ti farà risparmiare un po 'di tempo.
NOTA: In realtà nel how-to è un altro script /root/kiosk
, da questa sezione . Si noti che è solo una riga che fa riferimento allo .xinitrc
script mostrato nella sezione precedente (3.4). Basta inserire una linea come quella direttamente nello script di avvio. Il tuo (preliminare) xinitrc, come già descritto, sarà molto più semplice.
Un'alternativa al rimanere in primo piano con init ...
Lo scopo di lasciare in primo piano l'invocazione X è solo quello di bloccare l'esecuzione dello script init fino a quando X non esce, in modo che la riga successiva nello script ( shutdown
) verrà eseguita:
startx
shutdown -r now
Qui ho usato al startx
posto della /usr/X11R6/bin/xinit /root/kiosk.xinitrc ....
linea di istruzioni. Questo userà $HOME/.xinitrc
, e $ HOME sarebbe /root
. Abbastanza sicuro startx è anche una chiamata bloccante, quindi fino a quando X esce, shutdown
non verrà eseguito. Se invece hai fatto questo:
startx &
shutdown -r now
X avrebbe funzionato, ma poi anche l'arresto avrebbe funzionato subito (ovviamente inutile).
Non devi usare questo trucco se non ti interessa che arrivi l'arresto - come detto, l'utente finirà con un prompt di accesso. Ma sembra un'idea utile, da allora puoi semplicemente disattivarlo ctrl-alt-backspace
. Un'altra idea, se la tua app è chiudibile, sarebbe quella di utilizzare startx &
lo script init, che lo mette in background e consente a init di continuare normalmente (va bene; X sarà ancora in esecuzione e avrà il controllo del display - "backgrounded" è un forse un termine confuso). Invece che nello script init, inserisci shutdown
invece xinitrc:
#!/bin/sh
#/root/.xinitrc
su -c myApp pi
shutdown -r now
Stesso trucco, posto diverso. Ora quando qualcuno chiude myApp
, si verificherà l'arresto (ma se uccidono X, non lo farà). Potresti anche farlo in entrambi i modi, ma in realtà mi piace di più perché significa che puoi uscire da X e ottenere un login, che a volte può essere utile, e puoi anche spegnere facilmente il sistema dalla GUI.
Non mettere in background ( &
) myApp in .xinitrc anche se dopo non c'è alcun arresto, perché quando Xxitritr viene terminato X esce;) L'ultima chiamata lì deve persistere in primo piano (normalmente, è un DE o una finestra manager).
Gli script Init e .xinitrc
sono concetti simili. Uno è gestito da init
, che è il processo 1 su Linux (è l'unico processo avviato dal kernel). L'altro è gestito dal server X. Nota che ci sono file .xinitrc e un comando xinitrc (sono correlati ma non uguali).
/etc/inittab
ma molti altri no, cosa usano invece?