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.

Po reboocie powinien się pokazać następujący widok:

>>> WIDEO <<<

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


2 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

Dodaj komentarz

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