2026-05-28 12:17:41 +02:00
2026-05-27 22:00:48 +02:00
2026-05-28 12:17:41 +02:00
2026-05-28 12:17:41 +02:00
2026-05-27 22:00:48 +02:00
2026-05-27 22:00:48 +02:00
2026-05-27 22:00:48 +02:00
2026-05-28 09:43:17 +02:00
2026-05-28 09:43:17 +02:00
2026-05-27 22:00:48 +02:00
2026-05-28 12:17:41 +02:00
2026-05-27 22:00:48 +02:00
2026-05-27 22:00:48 +02:00

Kiosk Dwuekranowy — Chromium + Prezentacja PowerPoint — Debian 13

Kiosk na dwa monitory. Lewy ekran wyświetla http://diluals31/terminal/ift/5/DE/index w Chromium; prawy ekran wyświetla w pętli prezentację PowerPoint z zamontowanego udziału SMB. Używa X11 (xinit + openbox) i LibreOffice Impress w trybie pokazu (--show) — bez konwersji, z zachowanymi animacjami i przejściami.


Architektura

┌──────────────────────────────────────────────────────────────────┐
│                          kiosk.service                           │
│                    (xinit + openbox — tty7)                      │
│                                                                  │
│  Wirtualny desktop 3840×1080 (xrandr --right-of)                 │
│  ┌──────────────────────────┐   ┌──────────────────────────────┐ │
│  │  Chromium (fullscreen)   │   │  LibreOffice Impress --show  │ │
│  │  DP-1  (0,01920×1080)   │   │  HDMI-1  (1920,03840×1080)  │ │
│  │  http://diluals31/...    │   │  terminal_live.pptx          │ │
│  └──────────────────────────┘   └──────────────────────────────┘ │
│           ▲  above (wmctrl)               ▲                      │
│   kiosk-manager.sh             presentation-manager.sh           │
└──────────────────────────────────────────────────────────────────┘
                                              ▲
                              /mnt/presentation (CIFS/SMB)
                              montowany przez skrypt (fstab user)
                                              ▲
                              //192.168.40.201/DatyFirmowe/ALS

Przepływ — lewy ekran (kiosk-manager.sh):

  1. Konfiguruje X11: xrandr dual-screen, wyłącza DPMS, uruchamia openbox
  2. Zapisuje registrymodifications.xcu — wyłącza presenter console LO
  3. Uruchamia watchdog sesji (co 0.4 s chowa okna LO z lewego ekranu)
  4. Uruchamia presentation-manager.sh w tle
  5. Otwiera waiting.html fullscreen + always-on-top
  6. Czeka na: sieć (ping diluals31) oraz sygnał od presentation-manager.sh (plik /tmp/kiosk-smb-ready)
  7. Po otrzymaniu obu sygnałów: sleep 10 — daje LO czas na otwarcie i pozycjonowanie okna na prawym ekranie
  8. Przełącza Chromium na docelowy URL

sleep 10 jest kluczowe: zapewnia, że LibreOffice zdąży otworzyć i ustawić okno pokazu zanim Chromium wejdzie w tryb fullscreen+above na lewym ekranie. Bez tego opóźnienia konsola prezentacji była widoczna po reboot.

Przepływ — prawy ekran (presentation-manager.sh):

  1. Montuje udział SMB (mount /mnt/presentation) z retry co 5 s
  2. Synchronizuje czcionki z $SMB_MOUNT/fonts/ do ~/.local/share/fonts/smb/
  3. Tworzy plik /tmp/kiosk-smb-ready — sygnał dla kiosk-manager.sh
  4. Czeka na plik terminal_live.pptx
  5. Uruchamia persistentny watchdog konsoli (co 0.3 s)
  6. Uruchamia soffice --show terminal_live.pptx
  7. Przesuwa okno pokazu na prawy ekran i stosuje fullscreen
  8. Co 5 s: sprawdza mtime pliku i restartuje po zmianie

Wymagania

  • Debian 13 netinst — instalacja minimalna bez środowiska graficznego
  • Dwa monitory: DP-1 (lewy, primary) i HDMI-1 (prawy)
  • Dostęp do udziału SMB/CIFS z plikiem prezentacji

Instalacja krok po kroku

1. Utwórz użytkownika kiosk

useradd -m -s /usr/sbin/nologin kiosk
usermod -aG tty,input,video,render,dialout kiosk

2. Zainstaluj pakiety

apt update && apt install -y \
    xorg xinit openbox \
    chromium \
    libreoffice-impress \
    cifs-utils \
    xdotool wmctrl \
    x11-xserver-utils \
    iputils-ping \
    ethtool \
    wakeonlan

Nie są już potrzebne:

2a. Zainstaluj czcionki

LibreOffice podstawia czcionkę zastępczą gdy oryginalna nie jest zainstalowana w systemie — może to zmienić układ tekstu na slajdach.

Automatyczna instalacja przez udział SMB (zalecane)

presentation-manager.sh automatycznie synchronizuje czcionki z folderu fonts/ na udziale SMB do /home/kiosk/.local/share/fonts/smb/. Wystarczy wrzucić pliki .ttf/.otf na udział — zostaną zainstalowane przy najbliższym restarcie kiosku.

Na maszynie Windows — skopiuj pliki czcionek do \\192.168.40.201\DatyFirmowe\ALS\fonts\:

# Calibri (C:\Windows\Fonts\ lub %LOCALAPPDATA%\Microsoft\Windows\Fonts\)
Copy-Item C:\Windows\Fonts\calibri*.ttf \\192.168.40.201\DatyFirmowe\ALS\fonts\

# Aptos — zazwyczaj w cache czcionek chmurowych Microsoft 365:
$src = "$env:LOCALAPPDATA\Microsoft\FontCache\4\CloudFonts\Aptos"
Copy-Item "$src\*" \\192.168.40.201\DatyFirmowe\ALS\fonts\

Nazwy plików Aptos w cache mogą być numeryczne — to normalne, fontconfig czyta metadane wewnętrzne, nie nazwę pliku.

Restart kiosku — czcionki zostaną zainstalowane automatycznie:

systemctl restart kiosk.service
# Sprawdź w logach:
journalctl -u kiosk.service -b | grep "czcionka\|Cache czcionek"

Carlito — open-source'owy zamiennik Calibri (opcjonalnie)

Jeśli nie masz dostępu do oryginalnych plików Calibri, Carlito ma identyczne metryki (ten sam układ tekstu i łamania linii):

apt install fonts-crosextra-carlito fonts-crosextra-caladea

fonts-crosextra-caladea to odpowiednik Cambrii. Nie wymaga wrzucania plików na SMB — instalowany systemowo.

Inne czcionki Microsoft (Arial, Times New Roman, Verdana)

apt install ttf-mscorefonts-installer

Nie są już potrzebne: sway, swayidle, wlopm, wlr-randr, seatd, mpv, poppler-utils.

3. Skonfiguruj montowanie udziału SMB

3a. Utwórz plik poświadczeń

mkdir -p /etc/samba
cat > /etc/samba/kiosk-credentials << 'EOF'
username=NAZWA_UZYTKOWNIKA
password=HASLO
domain=WORKGROUP
EOF
chmod 600 /etc/samba/kiosk-credentials
chown root:root /etc/samba/kiosk-credentials

3b. Utwórz punkt montowania

mkdir -p /mnt/presentation

3c. Dodaj wpis w /etc/fstab (montowanie przez użytkownika kiosk)

echo '//192.168.40.201/DatyFirmowe/ALS /mnt/presentation cifs credentials=/etc/samba/kiosk-credentials,uid=kiosk,gid=kiosk,vers=3.0,user,noauto,_netdev 0 0' >> /etc/fstab

Opcja user pozwala użytkownikowi kiosk wykonać mount /mnt/presentation bez uprawnień roota. Opcja noauto wyłącza automatyczne montowanie przy starcie — skrypt sam zarządza montem z retry.

Uwaga: Systemd unit mnt-presentation.mount jest wyłączony — skrypt presentation-manager.sh przejął odpowiedzialność za montowanie.

systemctl disable mnt-presentation.mount
systemctl stop mnt-presentation.mount

4. Wykryj nazwy wyjść wideo

for p in /sys/class/drm/card*-*; do
    echo "$(basename $p | sed 's/card[0-9]*-//'): $(cat $p/status)"
done

Przykładowe wyjście:

DP-1: connected
HDMI-1: connected

Ustaw właściwe nazwy w kiosk-manager.sh:

OUTPUT_LEFT="DP-1"    # lewy ekran — primary
OUTPUT_RIGHT="HDMI-1" # prawy ekran

5. Skopiuj pliki konfiguracyjne

cp kiosk-manager.sh /home/kiosk/kiosk-manager.sh
cp presentation-manager.sh /home/kiosk/presentation-manager.sh
cp waiting.html /home/kiosk/waiting.html
chmod +x /home/kiosk/kiosk-manager.sh /home/kiosk/presentation-manager.sh
chown -R kiosk:kiosk /home/kiosk/

cp kiosk.service /etc/systemd/system/kiosk.service

6. Rozwiązanie problemu z domenami .local

Jeśli diluals31 jest rozwiązywany przez DNS firmowy (nie mDNS):

  • Otwórz /etc/nsswitch.conf
  • Zmień linię hosts: na: hosts: files dns mdns4_minimal [NOTFOUND=return]

7. Włącz i uruchom serwis

systemctl daemon-reload
systemctl enable kiosk.service
systemctl start kiosk.service

8. Skonfiguruj GRUB — natychmiastowy start

# /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=0
/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg

Harmonogram — Automatyczne wyłączanie i Wake on LAN

Kiosk wyłącza się automatycznie w sobotę o 7:00 i jest budzony przez Magic Packet (Wake on LAN) co 5 minut przez całe okno aktywności (niedziela 21:00 sobota 7:00). Pakiet WoL jest ignorowany gdy kiosk jest już włączony — cykliczne wysyłanie nie powoduje restartów.

Utrata prądu: WoL nie zadziała gdy karta sieciowa nie ma zasilania. Aby kiosk sam wstał po powrocie prądu, wejdź w ustawienia BIOS/UEFI i ustaw opcję Restore on AC Power Loss (lub After Power Failure) na Power On. W połączeniu z cyklicznym WoL zapewnia to pełne pokrycie: brak prądu → BIOS bootuje automatycznie; awaria software → WoL obudzi po max. 5 min.

Jeśli prąd wróci w oknie wyłączenia (sobota 7:00 niedziela 20:59), kiosk uruchomi się przez BIOS, ale kiosk-schedule wyłączy go ponownie w ciągu max. 5 minut.

Na kiosku

9a. Cron — automatyczne wyłączanie

cp kiosk-schedule /etc/cron.d/kiosk-schedule
chmod 644 /etc/cron.d/kiosk-schedule

9b. Wake on LAN — włączanie i utrwalanie

cp wol-enable.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now wol-enable.service

Sprawdź, czy WoL jest aktywne:

ip link show | grep -A1 "state UP" | grep ether  # MAC adres kiosku
ethtool enp2s0 | grep -i wake                    # zamień enp2s0 na właściwy interfejs

Wymagane ręcznie: BIOS kiosku — wejdź w ustawienia firmware i włącz opcję Wake on LAN lub Power on by PCI-E/PCI. Bez tego ustawienia Magic Packet jest ignorowany przez sprzęt.

9c. Pobierz MAC adres kiosku

ip link show | grep -A1 "state UP" | grep ether | awk '{print $2}'

Zanotuj ten adres — potrzebny do konfiguracji serwera (krok poniżej).

Na serwerze (192.168.40.126)

Zainstaluj narzędzie do wysyłania Magic Packet:

apt install wakeonlan

Utwórz plik crona wysyłającego WoL co 5 minut przez całe okno aktywności kiosku (wstaw MAC kiosku):

cat > /etc/cron.d/kiosk-wol << 'EOF'
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Budź kiosk WS-VK016 co 5 min w oknie aktywności: nd 21:00  sb 7:00
# Jeśli kiosk jest już włączony, pakiet WoL jest ignorowany (bezpieczne).
*/5 21-23 * * 0 root wakeonlan XX:XX:XX:XX:XX:XX
*/5 *    * * 1-5 root wakeonlan XX:XX:XX:XX:XX:XX
*/5 0-6  * * 6   root wakeonlan XX:XX:XX:XX:XX:XX
EOF
chmod 644 /etc/cron.d/kiosk-wol

Zastąp XX:XX:XX:XX:XX:XX adresem MAC pobranym w kroku 9c.

WoL działa w obrębie jednej podsieci (broadcast). Kiosk i serwer są w sieci 192.168.40.x — brak potrzeby konfiguracji routera.


kiosk.service/etc/systemd/system/kiosk.service

Jednostka systemd uruchamiająca sesję X11 jako użytkownik kiosk.

Opcja Wartość Opis
ExecStart xinit kiosk-manager.sh -- :0 vt7 Uruchamia X11 na tty7
ExecStartPre chvt 7 Przełącza konsolę na tty7
PAMName login Wymagane do bezrootowego X11 (xinit jako user)
TTYPath /dev/tty7 Przypisuje serwis do tty7
SLIDE_DURATION 10 Czas slajdu (s) — aktualnie nieużywany, LO używa timingów z PPTX
Restart=always Automatyczny restart po awarii

Serwis startuje bez network-online.target — celowo, aby waiting.html było widoczne od razu po uruchomieniu systemu. Montowanie SMB obsługuje skrypt z retry.


kiosk-manager.sh/home/kiosk/kiosk-manager.sh

Uruchamiany przez xinit. Konfiguruje X11 i obsługuje lewy ekran.

Co robi:

  1. xrandr — tryb rozszerzony: DP-1 primary (0,0), HDMI-1 po prawej (1920,0)
  2. xsetroot + xset — czarne tło, wyłączony wygaszacz i DPMS
  3. openbox --sm-disable — lekki WM wymagany przez wmctrl fullscreen
  4. Zapisuje registrymodifications.xcu — wyłącza presenter console LO (StartWithPresenterScreen=false)
  5. Uruchamia watchdog sesji w tle — co 0.4 s chowa okna soffice z lewego ekranu (x < 1920)
  6. Uruchamia presentation-manager.sh w tle
  7. Chromium otwiera waiting.html z fullscreen + above
  8. Czeka na sieć (ping diluals31) i na plik /tmp/kiosk-smb-ready
  9. sleep 10 — LO ma czas na pełny start i pozycjonowanie okna przed Chromium
  10. Kill waiting Chromium → exec Chromium z docelowym URL

Flagi Chromium (CHROMIUM_OPTS):

Flaga Opis
--app=URL Tryb aplikacji — brak paska adresu, brak kart
--window-position=0,0 --window-size=1920,1080 Pozycja na lewym ekranie (X11: bez --kiosk, który rozciąga na cały wirtualny desktop)
--no-first-run Pomija ekran powitalny
--noerrdialogs Ukrywa okna dialogowe błędów
--disable-gpu-suspend Zapobiega zawieszaniu GPU przy wygaszaniu
--force-device-scale-factor=1 Skalowanie 1:1
--disable-features=Translate,MediaRouter Wyłącza tłumaczenie i Chromecast
--disable-sync Wyłącza synchronizację Google
--disable-extensions Wyłącza rozszerzenia
--password-store=basic Nie używa systemowego portfela haseł
--disable-pinch Wyłącza pinch-to-zoom

Uwaga: --kiosk na X11 rozciąga okno na cały wirtualny desktop 3840×1080 (oba ekrany). Używamy --app + --window-position/size + wmctrl fullscreen.

Zmiana hosta / URL kiosku:

# kiosk-manager.sh
KIOSK_HOST="diluals31"
KIOSK_URL="http://diluals31/terminal/ift/5/DE/index"

presentation-manager.sh/home/kiosk/presentation-manager.sh

Obsługuje prawy ekran — montowanie SMB i wyświetlanie prezentacji.

Montowanie SMB:

until mountpoint -q "$SMB_MOUNT"; do
    mount "$SMB_MOUNT"   # korzysta z wpisu fstab z opcją 'user'
    sleep 5              # retry co 5 s
done

Przy zakończeniu skryptu (trap EXIT/INT/TERM): umount /mnt/presentation.

Ustawianie okien LibreOffice (start_lo):

Iteruje wszystkie widoczne okna soffice wg pozycji X:

  • x ≥ 1920 → okno pokazu slajdów → wmctrl fullscreen
  • x < 1920 → konsola prezentacji → przesunięcie na x=3840 (poza desktop) + wmctrl below
  • Fallback po 5 s: jeśli nadal brak okna na prawym ekranie → przeniesienie pierwszego znalezionego

Po ustawieniu LO: Chromium podniesiony jako above (always-on-top na lewym ekranie).

Watchdog (co 5 s w głównej pętli):

  • Sprawdza wszystkie widoczne okna soffice — jeśli któreś wróciło na x < 1920, wysyła je z powrotem na x=3840
  • Sprawdza mtime pliku PPTX — po zmianie restartuje pokaz
  • Sprawdza czy soffice żyje — jeśli zakończył (koniec pokazu), restartuje

Konfiguracja:

SMB_MOUNT="/mnt/presentation"
SMB_SOURCE="//192.168.40.201/DatyFirmowe/ALS"
PRESENTATION_FILE="$SMB_MOUNT/terminal_live.pptx"

kiosk.service (wyłączone) mnt-presentation.mount

Systemd unit do montowania SMB jest wyłączony. Skrypt presentation-manager.sh przejął montowanie przez mount /mnt/presentation (wpis fstab z opcją user,noauto).


sway-config

Nieużywany — zachowany jako archiwum poprzedniej architektury (Wayland/sway).


kiosk-schedule/etc/cron.d/kiosk-schedule

Plik crona systemu wyłączający kiosk w sobotę o 7:00 (shutdown -h now jako root).


wol-enable.service/etc/systemd/system/wol-enable.service

Jednostka systemd uruchamiana przy każdym starcie systemu. Wywołuje ethtool -s IFACE wol g na wszystkich interfejsach sieciowych — utrzymuje Wake on LAN włączone po rebootach (niektóre sterowniki resetują ustawienie WoL przy wyłączaniu).


waiting.html/home/kiosk/waiting.html

Lokalna strona HTML wyświetlana przez Chromium podczas oczekiwania na sieć. Ciemne tło, animowany spinner. Widoczna od startu systemu do momentu, gdy diluals31 odpowie na ping.


Zarządzanie i diagnostyka

Logi

# Logi kiosku na żywo
journalctl -u kiosk.service -f

# Ostatnie 100 linii
journalctl -u kiosk.service -b -n 100

# Tylko logi prezentacji
journalctl -u kiosk.service -b | grep presentation-manager

# Logi montowania SMB
journalctl -u kiosk.service -b | grep "mount:"

Restart / zatrzymanie

systemctl restart kiosk.service
systemctl stop kiosk.service

Ręczne montowanie / odmontowanie SMB (jako root)

mount /mnt/presentation
umount /mnt/presentation
mountpoint /mnt/presentation && echo "zamontowany"

Wykrycie nazw wyjść wideo (bez uruchomionego kiosku)

for p in /sys/class/drm/card*-*; do
    echo "$(basename $p | sed 's/card[0-9]*-//'): $(cat $p/status)"
done

Wymuszenie restartu pokazu (zmiana pliku)

touch /mnt/presentation/terminal_live.pptx
# skrypt wykryje zmianę mtime w ciągu 5 s i zrestartuje LO

Czyszczenie cache Chromium

systemctl stop kiosk.service
rm -rf /home/kiosk/.cache/chromium
systemctl start kiosk.service

Rozwiązywanie problemów

Objaw Przyczyna Rozwiązanie
waiting.html nie pojawia się Sieć dostępna natychmiast, ping loop kończy się w <2 s Normalne zachowanie — sleep 2 zapewnia min. 2 s widoczności
Prezentacja się nie wyświetla SMB nie zamontowany journalctl -u kiosk.service -b | grep mount — sprawdź błędy
mount: Permission denied Opcja user brak w fstab lub kiosk nie jest właścicielem Sprawdź wpis fstab: grep presentation /etc/fstab
mount: not found in /etc/fstab Brak wpisu fstab Dodaj wpis zgodnie z sekcją 3c
Konsola LibreOffice widoczna na lewym ekranie po reboot LibreOffice startuje przed Chromium (kiosk URL) i konsola zdąży się pokazać Zwiększ sleep 10 w kiosk-manager.sh (linia po pętli kiosk-smb-ready)
Chromium rozciągnięty na oba ekrany Użyto --kiosk zamiast --app Sprawdź kiosk-manager.sh — nie używamy --kiosk
Lewy ekran czarny, tylko prawy działa Chromium nie znalazł okna w 30 s journalctl | grep "kiosk-manager" — sprawdź błędy Chromium
openbox: command not found Brak pakietu apt install openbox
wmctrl: command not found Brak pakietu apt install wmctrl
xdotool: command not found Brak pakietu apt install xdotool
Animacje nie działają LO konwertuje do PNG/PDF (stare podejście) Aktualna wersja używa soffice --show bezpośrednio — animacje powinny działać
Tekst źle wyświetlany (zła czcionka, zły układ) Brak czcionki Skopiuj pliki .ttf/.otf do \\serwer\DatyFirmowe\ALS\fonts\ i zrestartuj kiosk — skrypt zainstaluje je automatycznie
Udział SMB z protokołem SMB 1.0 vers=3.0 nieobsługiwany Zmień na vers=2.1 lub vers=1.0 w /etc/fstab
Czarny ekran po restarcie Chromium trzyma zablokowany profil rm -rf /home/kiosk/.cache/chromium
X11 nie startuje (cannot open display) Brak pakietu xorg apt install xorg
S
Description
Kiosk wyświetlający URL ALS w Chromium oraz prezentację PowerPoint na dwóch ekranach.
Readme 108 KiB
Languages
Shell 88.3%
HTML 11.7%