Kiosk mode w Raspberry Pi


W tym poradniku pokażę jak w łatwy sposób włączyć tryb kiosku na Raspberry Pi. Użyjemy do tego stockowego Raspbiana w wersji 32-bitowej, implementacji kompozytora Wayland oraz przeglądarki chromium z poziomu wiersza poleceń.

Czym jest tryb kiosku? Przykłady

Tryb kiosku to funkcja w systemach wbudowanych, która przekształca urządzenie w samoobsługowy punkt obsługi (kiosk) lub wyświetlacz. Główną cechą kiosku jest ograniczenie dostępu użytkownika tylko do określonych aplikacji i funkcji. Jest to szczególnie przydatne w środowiskach, w których interakcja użytkownika z systemem jest z góry określona “na sztywno”, np. w handlu detalicznym lub w systemach informacyjnych.

Kiosku mode blokuje urządzenie w celu uruchomienia jednej lub kilku aplikacji, jednocześnie uniemożliwiając użytkownikom dostęp do podstawowego systemu operacyjnego lub innych nieautoryzowanych funkcji.

Podsumowując, kluczowe cechy trybu kiosku to:

  • Ograniczony dostęp: Użytkownicy mogą wchodzić w interakcje tylko z przypisanymi aplikacjami.
  • Konfigurowalne doświadczenie: Administratorzy mogą dostosować interfejs użytkownika i funkcje do konkretnego scenariusza.
  • Zwiększone bezpieczeństwo: Dzięki ograniczeniu dostępu znacząco zmniejszamy możliwość skutecznego zaatakowania produktu.
  • Uproszczone interakcja: Interfejs jest usprawniony, aby zmniejszyć liczbę błędów użytkownika i nie rozpraszać jego uwagi.

Przykłady z życia to np. automaty do zakupu bitcoinów, bankomaty, menu w restauracjach itp.

Automat do zakupu bitcoinów

Jednym z najciekawszych kiosków, z jakimi ostatnio miałem do czynienia to automat do samodzielnego wywoływania zdjęć. Jest to szczególnie interesujący przypadek, ponieważ taki automat musi obsługiwać możliwość podłączenia prywatnego klucza USB (np. pendriva) i następnie wybranie z niego zdjęć do druku. A jak dobrze wiemy, fizyczny dostęp do urządzenia może skutkować często bardzo nieprzyjemnymi konsekwencjami, np. gdy ktoś użyje UBS killera.

Kiosk w Raspberry Pi

W tym poradniku pokażę Ci, jak można łatwo uruchomić tryb kiosku na stockowym Raspbianie. W kolejnym materiale zaprezentuję jak można to zrobić za pomocą Buildroota w dedykowanym systemie.

Na domyślnym OS dla Raspberry Pi tryb kiosku można skonfigurować na kilka sposobów. Najprostszym jest skorzystanie z już obecnej funkcjonalności autostart w Waylandzie (managerze okienek na Raspbianie) oraz używając przeglądarki chromium.

Ogólnie konfiguracja będzie polegała zdefiniowaniu polecenia, które będzie wykonywane każdorazowo przy starcie podsystemu graficznego (czyli “okienek”). To polecenie będzie włączało w konsoli przeglądarkę chromium w trybie kiosku razem z kilkoma innymi przydatnymi argumentami.

Wymagania

Do zrealizowania kroków w tym poradniku będziemy potrzebować:

  • Raspberry Pi 4 lub 5 (najlepiej 4 GB RAM lub więcej)
  • Zasilacz
  • Karta SD z wgranym systemem Raspbian 32 bit w wersji Bookworm
  • Kabel Ethernet RJ45
  • Kabel mini HDMI – HDMI (do podłączenia monitora)
  • Monitor (żeby wyświetlić okno przeglądarki)
  • Połączenie z internetem

Polecenia na Raspberry najwygodniej wykonywać przez połączenie SSH. Ten interfejs można skonfigurować przy pierwszym wgraniu obrazu na Raspbiana lub podczas pierwszego uruchomienia Raspberry za pomocą polecenia raspi-config.

Jeśli chodzi o połączenie z internetem, można użyć WiFi lub udostępnić połączenie przewodowe z komputera. Jest to wygodne rozwiązanie jeśli z jakiegokolwiek powodu nie chcemy konfigurować WiFi. Wystarczy podpiąć kabel RJ45 do Raspberry i komputera a następnie udostępnić sieć. W ubuntu można to zrobić w menu Settings→Network→Interface i w podmenu IPv4 ustawić “Shared to other computers”

Prosty przykład

Zanim przejdziemy do definicji autostartu, musimy włączyć automatyczny login przez raspi-config:

sudo raspi-config
Select System Options > Boot / Auto Login > Desktop Autologin: Desktop GUI, automatically logged in as 'pi' user.

reboot

Następnie modyfikujemy plik wayfire.ini. To plik konfiguracyjny dla Wayfire, czyli implementacji kompozytora okien bazujący na Waylandzie.

sudo nano .config/wayfire.ini

Wpisujemy na koniec pliku poniższy fragment kodu:

[autostart]
panel = wfrespawn wf-panel-pi
background = wfrespawn pcmanfm --desktop --profile LXDE-pi
xdg-autostart = lxsession-xdg-autostart
chromium = chromium-browser https://onet.pl --kiosk --noerrdialogs --disable-infobars --no-first-run --ozone-platform=wayland --enable-features=OverlayScrollbar --start-maximized
screensaver = false
dpms = false

I resetujemy płytkę.

Po reboocie zobaczymy, że Raspberry od razu otwiera okno przeglądarki w trybie pełnoekranowym i wyświetla zdefiniowaną przez nas stronę, w tym wypadku onet.pl

Obsługa kilku stron

Pierwszy przykład statycznie wyświetla skonfigurowaną stronę. Możemy wyświetlać dwie różne strony na przemian co jakiś czas (np. co 20 sekund). Żeby to zrobić, musimy zainstalować program umożliwiający symulację klawiatury:

sudo apt install wtype

Tworzymy skrypt przełączający strony:

#!/bin/bash

function get_chromium_pid {
    pgrep chromium | head -1
}

while true; do
    chromium_pid=$(get_chromium_pid)
    if [ -n "$chromium_pid" ]; then
        echo "Chromium browser process ID: $chromium_pid"
        break
    else
        echo "Chromium browser is not running yet."
        sleep 5
    fi
done

export XDG_RUNTIME_DIR=/run/user/1000

# Główna pętla, wysyłanie polecen przez klawiature
while true; do
    # Wysyłamy Ctrl+ Tab
    wtype -M ctrl -P Tab
    wtype -m ctrl -p Tab

    sleep 15
done

Musimy teraz dodać ten skrypt do sekcji autostart w wayfire. Skrypt zostanie automatycznie odpalony po starcie chromium.

Nowa zawartość sekcji autostart:

[autostart]
panel = wfrespawn wf-panel-pi
background = wfrespawn pcmanfm --desktop --profile LXDE-pi
xdg-autostart = lxsession-xdg-autostart
chromium = chromium-browser https://stellarium-web.org/ https://www.windy.com/51.098/17.022?radarPlus%2C51.114%2C17.096%2C10=  --kiosk --noerrdialogs --disable-infobars --no-first-run --ozone-platform=wayland --enable-features=OverlayScrollbar --start-maximized
switchtab = bash ~/switch.sh
screensaver = false
dpms = false

Zdefiniowałem dwie nowe strony dla kiosku. Jedna z nich to radar pogodowy a druga to feed informacyjny.

Teraz zostaje reboot Raspberry i obserwacja efektów.

Ważne uwagi

Podczas testowania kiosku na Raspberry zauważyłem dwie ważne rzeczy:

Bardzo ważna jest ilość pamięci RAM jaką ma nasza płytka

Na mojej płytce ze skromnym 1 GB pamięci czasem tryb kiosku mocno się przycinał. Obecnie przeglądarki nie są zbyt mocno zoptymalizowane pod kątem zużycia zasobów sprzętowych, chromium jest bardzo głodne RAMu. Jeśli chcemy żeby kiosk działał długo i stabilnie, rekomenduję zakupienie płytki z większą ilością RAM

Raspbian 32 bit działa lepiej niż 64 bit – jest bardziej stabilny jeśli chodzi o wyświetlanie kiosku

Kolejne kroki

W tym momencie system jest całkowicie niezabezpieczony. Możemy poprawić bezpieczeństwo stosując następujące metody:

  • Logowanie po SSH tylko za pomocą klucza SSH
  • Wyłączenie nieużywanej komunikacji ze światem zewnętrznym:
    • WiFi
    • Bluetooth
    • GPIO
    • UART
  • Stosowanie połączenia z internetem przewodowego (a najlepiej w ogóle nie korzystać z internetu, ale czasem jest to niezbędne)
  • Przełączenie karty SD w tryb read-only

Jeśli jesteś ciekaw jak zaimplementować wszystkie te zabezpieczenia na Raspberry w Raspbianie i nie tylko, daj znać na karol@linuxdev.pl lub napisz komentarz.

Zawsze odpisuję.

Mam w planach osobny materiał na temat hardeningu Raspberry Pi 🙂

Źródła

https://www.scalzotto.nl/posts/raspberry-pi-kiosk

https://www.raspberrypi.com/tutorials/how-to-use-a-raspberry-pi-in-kiosk-mode

https://forums.raspberrypi.com/viewtopic.php?t=303905

https://forums.raspberrypi.com/viewtopic.php?t=359946


13 odpowiedzi na „Kiosk mode w Raspberry Pi”

  1. Awatar Mariusz
    Mariusz

    Ostatnio walczyłem z tym tematem na Raspberry Pi 3 (1GB RAM) i skończyło się na wdrożeniu https://github.com/guysoft/FullPageOS – polecam. 😉

    1. Awatar Karol

      Nie znałem tego projektu, wygląda ciekawie. Dzięki za linka

  2. Awatar Klewciax
    Klewciax

    Ja właśnie kończę swój kiosk i mam takie przemyślenia: 1GB wystarczy w zupełności gdy nie będziemy używać środowiska graficznego ani chromium, firefox mimo że biedniejszy w opcje dużo lepiej startuje, to samo z qutebrowser, Wayland bywa problematyczny na niektórych płytkach i systemach, najprostszym i najskuteczniejszym rozwiązaniem, które mi działa i na jednej stronie statycznej plus cały system pobiera 350MB RAMu to stary poczciwy X11 z prostym menedżerem okien odpalanym jako serwis na starcie systemu 😉

    1. Awatar Karol

      Dobre spostrzeżenia, taka konfiguracja będzie zdecydowanie lepsza dla systemu z małą ilością RAMu

  3. Awatar Adam
    Adam

    Dzień dobry, poszukując rozwiązania mojego problemu z Raspberry Pi 4, trafiłem na tę stronę, bardzo dobrym poradnikiem n/t kiosku. Chciałbym poprosić o pomoc (jeżeli to możliwe). Uruchomiłem na Raspberry Pi wyświetlanie strony (po uruchomieniu) w pełnym ekranie, ma to być projekt „bez obsługowy” czyli włączasz i działa. Wszystko działa prawidłowo po ustawieniu sekcji autostart w wayfire.ini. Ale jeżeli nastąpi awarii zasilania to po ponownym uruchomieniu i automatycznym otwarci przeglądarki Chromium pojawia się monit o tym, że „Chromium nie zamknął się poprawnie” Anuluj/Przywróć. Jak to wyłączyć, aby przeglądarka nie wyświetlała tego popu w takiej sytuacji i poprawnie otworzyła stronę? Wypróbowałem wiele porad znalezionych w internecie ale nie uzyskałem pozytywnego rezultatu.
    Raspberry Pi 4, Raspbian GNU/Linux 12 (bookwarm)

    Z góry dziękuję za pomoc
    Adam

    1. Awatar Karol

      Cześć, problem jest taki że chrome co kilka wersji zmienia przełączniki do odpalania aplikacji z linii komend i rozwiązania sprzed paru lat dzisiaj już nie działają. Spróbuj odpalać stronę przez –app=ADRES STRONY , otwarcie w trybie aplikacji powinno wyłączyć to powiadomienie.
      Możesz jeszcze spróbować zablokować chromium dostęp do nadpisywania preferencji:
      chmod 444 ~/.config/chromium/Default/Preferences

      Daj znać jeśli zadziała

      1. Awatar Adam
        Adam

        Cześć, dziękuję za odpowiedź, czy to co podałeś wpisujemy w wayfire w sekcji autostartu?

  4. Awatar Adam
    Adam

    Cześć dziękuję za pomoc, problem rozwiązałem dodając w sekcji autostartu komendę –hide-crash-restore-bubble. Pozdrawiam

    1. Awatar Karol

      Dzięki, super że się udało.

  5. Awatar Adam
    Adam

    Tutaj link: https://peter.sh/experiments/chromium-command-line-switches/ do listy poleceń chromium, może „komuś się przyda”.

  6. Awatar bear
    bear

    Mam podobny kiosk, ale chcę go przerobić na ręczne przełączanie kart. Będzie kilka przycisków podpiętych do gpio. Naciśnięcie pierwszego przełączy przeglądarkę na pierwszą kartę, naciśnięcie trzeciego przełączy przeglądarkę na trzecią kartę. Samo przełączanie jest proste. wtype zasymuluje naciśnięcie klawiszy ctrl + 1, albo ctrl + 3. Ale do tego muszę mieć pewność, że na pierwszej karcie jest ta strona, która musi być na pierwszej, a na trzeciej jest ta co ma być na trzeciej. Pytanie jest takie. Czy komenda
    chromium-browser strona1 strona2 strona3
    zawsze otworzy stronę1 na pierwszej karcie, stronę2 na drugiej karcie, stronę3 na trzeciej karcie? Z moich testów wynika, że tak się stanie. Ale w razie jakiegoś mocniejszego obciążenia maliny coś się nie pomiesza i strona1 wyląduje na trzeciej karcie. Czy jest jakiś przełącznik aby zmusić przeglądarkę o otwarcia strony na konkretnej karcie.?

    1. Awatar Karol

      Z tego co wiem, nie ma dedykowanego przełącznika w Chromium, który jednoznacznie „przypinałby” daną stronę do konkretnej karty. Przy większym obciążeniu systemu, choć może dojść do opóźnień w ładowaniu, kolejność otwierania kart nie powinna się mieszać – o ile uruchamiasz przeglądarkę jako nową sesję. Możesz napisać skrypt, który obciąży system i w tym czasie otwierać i zamykać chromium, wtedy będziesz miał największą pewność.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *