219 lines
7.3 KiB
Markdown
219 lines
7.3 KiB
Markdown
# Kiosk Chromium — Debian 13
|
||
|
||
Kiosk wyświetlający stronę `http://instrukcje.local` w Chromium na pełnym ekranie. Używa `sway` jako kompozytora Wayland oraz `swayidle` + `wlopm` do zarządzania energią monitora.
|
||
|
||
---
|
||
|
||
## Wymagania
|
||
|
||
- Debian 13 netinst — instalacja minimalna bez środowiska graficznego
|
||
|
||
---
|
||
|
||
## Instalacja krok po kroku
|
||
|
||
### 1. Utwórz użytkownika kiosk
|
||
|
||
```bash
|
||
useradd -m -r -s /usr/sbin/nologin kiosk
|
||
usermod -aG tty,input,video,dialout kiosk
|
||
```
|
||
|
||
### 2. Zainstaluj pakiety
|
||
|
||
```bash
|
||
apt update && apt install -y \
|
||
sway swayidle wlopm wlr-randr \
|
||
chromium
|
||
```
|
||
|
||
> `cage` **nie** obsługuje protokołu `wlr-output-power-management-v1`, przez co `wlopm` z nim nie działa — ekran można wygasić, ale nie można go wybudzić. Dlatego używamy `sway`.
|
||
|
||
### 3. Skopiuj pliki konfiguracyjne
|
||
|
||
```bash
|
||
# Skrypt zarządzający kioskiem
|
||
cp kiosk-manager.sh /home/kiosk/kiosk-manager.sh
|
||
chmod +x /home/kiosk/kiosk-manager.sh
|
||
|
||
# Strona oczekiwania na sieć
|
||
cp waiting.html /home/kiosk/waiting.html
|
||
chown kiosk:kiosk /home/kiosk/waiting.html
|
||
|
||
# Konfiguracja sway
|
||
mkdir -p /home/kiosk/.config/sway
|
||
cp sway-config /home/kiosk/.config/sway/config
|
||
chown -R kiosk:kiosk /home/kiosk/.config
|
||
|
||
# Jednostka systemd
|
||
cp kiosk.service /etc/systemd/system/kiosk.service
|
||
```
|
||
|
||
### 4. Rozwiązanie problemu z domenami .local
|
||
Musimy powiedzieć systemowi: "Najpierw sprawdź w DNS, a dopiero potem szukaj przez mDNS".
|
||
* Otwórz plik: `/etc/nsswitch.conf`
|
||
* Znajdź linię `hosts:`. Zapewne wygląda tak: `hosts: files mdns4_minimal [NOTFOUND=return] dns`
|
||
* Zmień ją na: `hosts: files dns mdns4_minimal [NOTFOUND=return]`
|
||
|
||
### 5. Włącz i uruchom serwis
|
||
|
||
```bash
|
||
systemctl daemon-reload
|
||
systemctl enable kiosk.service
|
||
systemctl start kiosk.service
|
||
```
|
||
|
||
---
|
||
|
||
### 6. Skonfiguruj GRUB'a aby uruchamiał system natychmiast
|
||
|
||
```bash
|
||
sudo nano /etc/default/grub
|
||
```
|
||
|
||
* Znajdź i zmień poniższe linie (lub dodaj je, jeśli ich nie ma):
|
||
|
||
`GRUB_DEFAULT=0` – wskazuje, że domyślnie ma być uruchamiana pierwsza pozycja na liście.
|
||
|
||
`GRUB_TIMEOUT=0` – ustawia czas oczekiwania na 0 sekund.
|
||
|
||
|
||
* Zastosuj zmiany
|
||
|
||
```bash
|
||
sudo /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
|
||
```
|
||
|
||
---
|
||
|
||
## Opis plików
|
||
|
||
### `kiosk.service`
|
||
|
||
Jednostka systemd uruchamiająca `sway` jako użytkownik `kiosk`. Ważne parametry:
|
||
|
||
| Opcja | Wartość | Opis |
|
||
|---|---|---|
|
||
| `PAMName=login` | `login` | Dostęp do urządzeń przez logind (GPU, input) |
|
||
| `RuntimeDirectory=kiosk` | `kiosk` | Automatycznie tworzy `/run/kiosk` z prawami 0700 |
|
||
| `XDG_RUNTIME_DIR` | `/run/kiosk` | Wymagane przez sway / Wayland |
|
||
| `WLR_LIBSEAT_BACKEND` | `logind` | Dostęp do GPU bez uprawnień roota |
|
||
| `IDLE_TIME` | `120` | Czas bezczynności (sekundy) przed wygaszeniem ekranu |
|
||
| `ExecStart` | `/usr/bin/sway` | Kompozytor Wayland |
|
||
| `Restart=always` | — | Automatyczny restart po awarii / wyjściu Chromium |
|
||
|
||
**Zmiana czasu wygaszania:**
|
||
```bash
|
||
# Edytuj /etc/systemd/system/kiosk.service
|
||
Environment=IDLE_TIME=300 # 5 minut
|
||
|
||
systemctl daemon-reload
|
||
systemctl restart kiosk.service
|
||
```
|
||
|
||
---
|
||
|
||
### `sway-config` → `/home/kiosk/.config/sway/config`
|
||
|
||
Minimalna konfiguracja sway:
|
||
|
||
```
|
||
output * bg #000000 solid_color # czarne tło
|
||
output * transform 270 # obrót monitora o 270°
|
||
input * xkb_numlock enabled # NumLock zawsze włączony
|
||
exec swayidle before-sleep "wlopm --off '*'" # wygaszenie przy sleep
|
||
exec /home/kiosk/kiosk-manager.sh # start kiosku
|
||
```
|
||
|
||
---
|
||
|
||
### `kiosk-manager.sh` → `/home/kiosk/kiosk-manager.sh`
|
||
|
||
Uruchamiany przez sway przy starcie sesji. Kolejność działania:
|
||
|
||
1. Uruchamia `swayidle` **bez flagi `-w`** — ignoruje idle inhibitory (Chromium ustawia inhibitor Wayland; `swayidle -w` respektuje go i nigdy nie wygasiłby ekranu)
|
||
2. `wlopm --off '*'` po IDLE_TIME sekundach — wysyła DPMS standby przez protokół `wlr-output-power-management-v1`; link DP/HDMI pozostaje aktywny, więc wybudzenie jest niezawodne
|
||
3. Chromium startuje **natychmiast** z lokalnym plikiem `waiting.html` (ekran oczekiwania)
|
||
4. Ping-loop czeka, aż `KIOSK_HOST` (192.168.40.126) odpowie
|
||
5. Po uzyskaniu sieci: Chromium jest zamykany i restartowany z docelowym `http://instrukcje.local`
|
||
|
||
**Flagi Chromium (`CHROMIUM_OPTS`):**
|
||
|
||
| Flaga | Opis |
|
||
|---|---|
|
||
| `--ozone-platform=wayland` | Używa backendu Wayland zamiast X11 |
|
||
| `--no-first-run` | Pomija ekran powitalny przy pierwszym uruchomieniu |
|
||
| `--noerrdialogs` | Ukrywa okna dialogowe błędów Chromium |
|
||
| `--disable-infobars` | Ukrywa paski informacyjne (np. „Chromium jest zarządzany...") |
|
||
| `--disable-gpu-suspend` | Zapobiega zawieszaniu GPU podczas wygaszania ekranu |
|
||
| `--force-device-scale-factor=1` | Wymusza skalowanie 1:1 (bez DPI scaling) |
|
||
| `--user-data-dir` | Osobny katalog profilu — izoluje dane kiosku |
|
||
| `--disable-features=AutofillServerCommunication` | Wyłącza pobieranie podpowiedzi autouzupełniania z serwerów Google |
|
||
| `--disable-features=Translate` | Wyłącza pasek z propozycją tłumaczenia strony |
|
||
| `--disable-features=MediaRouter` | Wyłącza obsługę Chromecast / Cast |
|
||
| `--disable-save-password-bubble` | Ukrywa bańkę „Zapisz hasło" |
|
||
| `--disable-sync` | Wyłącza synchronizację z kontem Google |
|
||
| `--disable-extensions` | Wyłącza wszystkie rozszerzenia |
|
||
| `--disable-background-networking` | Blokuje ruch sieciowy w tle (aktualizacje, telemetria) |
|
||
| `--disable-notifications` | Wyłącza powiadomienia systemowe |
|
||
| `--disable-component-update` | Wyłącza automatyczne aktualizacje komponentów Chromium |
|
||
| `--password-store=basic` | Nie używa systemowego portfela haseł (gnome-keyring, kwallet) |
|
||
| `--disable-pinch` | Wyłącza gesty pinch-to-zoom (ekran dotykowy) |
|
||
|
||
**Zmiana adresu IP serwera:**
|
||
```bash
|
||
# W kiosk-manager.sh zmień zmienną:
|
||
KIOSK_HOST="192.168.40.126"
|
||
```
|
||
|
||
### `waiting.html` → `/home/kiosk/waiting.html`
|
||
|
||
Lokalna strona HTML wyświetlana przez Chromium w trakcie oczekiwania na sieć. Ciemne tło, animowany spinner i pulsujący napis „Oczekiwanie na sieć...".
|
||
|
||
---
|
||
|
||
## Zarządzanie i diagnostyka
|
||
|
||
### Logi
|
||
|
||
```bash
|
||
# Ostatnie 100 linii logów serwisu
|
||
journalctl -u kiosk.service -b --no-pager -n 100 -o cat
|
||
|
||
# Śledzenie na żywo
|
||
journalctl -u kiosk.service -f
|
||
```
|
||
|
||
### Restart / zatrzymanie
|
||
|
||
```bash
|
||
systemctl restart kiosk.service
|
||
systemctl stop kiosk.service
|
||
```
|
||
|
||
### Sprawdzenie wyjść wideo
|
||
|
||
```bash
|
||
WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlr-randr
|
||
```
|
||
|
||
### Ręczne wygaszenie / wybudzenie
|
||
|
||
```bash
|
||
WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlopm --off '*'
|
||
WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlopm --on '*'
|
||
```
|
||
|
||
---
|
||
|
||
## Rozwiązywanie problemów
|
||
|
||
| Objaw | Przyczyna | Rozwiązanie |
|
||
|---|---|---|
|
||
| Serwis natychmiast się kończy | Brak `/run/kiosk` | Sprawdź `RuntimeDirectory=kiosk` w pliku unit |
|
||
| `XDG_RUNTIME_DIR is not set` | Brak zmiennej środowiskowej | Upewnij się że `Environment=XDG_RUNTIME_DIR=/run/kiosk` jest w unit |
|
||
| Ekran się nie wygasza | Chromium blokuje idle | `swayidle` musi być uruchomiony **bez** flagi `-w` |
|
||
| Ekran gaśnie ale nie wraca | `wlr-randr --off` rozłącza link DRM | Używaj `wlopm` z `sway` (nie `wlr-randr --off`) |
|
||
| `wlopm: Wayland server does not support...` | Kompozytor bez protokołu power-management | Zamień `cage` na `sway` |
|
||
| Czarny ekran po restarcie | Chromium trzyma zablokowany profil | `rm -rf /home/kiosk/.cache/chromium && systemctl restart kiosk.service` |
|