投稿日

Raspberry Piでキオスク端末:ブラウザ全画面自動起動の手順(Labwc 編)

ソラコムのテクノロジー・エバンジェリスト 松下(ニックネーム: Max)です。

小型コンピューター「Raspberry Pi(以下、ラズパイ)」はセンサーをつけることができ、通信機能もワンセットになっていることから、IoT の技術検証や皆さんにお見せするデモの時に良く利用しています。

今回はラズパイを展示会などのデモで使える常設型の専用端末「キオスク端末」としてセットアップする方法をご紹介します。

  • 電源 ON と共に GUI が起動、指定 URL を開いた Web ブラウザ(Chromium)を全画面表示
  • メンテナンスはネットワーク経由の SSH・VNC による GUI 操作
  • CLI による OS の操作と表示中の Web ブラウザの操作(表示ページ変更とリロード)
  • 電源 OFF は電源ケーブルを抜くことで行えて、データの破損もしない
  • Wayland + Labwc の環境での動作と、Raspberry Pi OS 自体の自由度は最大限確保する
本記事の対象者

本記事の対象者は、ラズパイや Linux を扱った事がある方向けとなっています。
また、Labwc にしている背景は、無操作期間(アイドリング)検出をする swayidle コマンドのためです。Wayfire ではブラウザを KIOSK モードで立ち上げると、同コマンドでのアイドリング検出ができませんでした。

準備するもの

  • Raspberry Pi 本体 × 1
  • Raspberry Pi 用電源(AC アダプター) × 1
  • microSD × 1
  • モニター × 1 (必要に応じて設置用のケース等)

Raspberry Pi 本体のモデルは GUI と Web ブラウザ利用の観点から 3 以降(3 Model B+ 等)をお勧めします。ここでは 4 Model B(メモリー 2GB) を使っています。

ACアダプターは電流・電圧に気をつけましょう。電力不足が起こると「Low voltage warning」という表示が画面に出ます。必要な電力は各モデルの仕様で確認してください。

microSD は容量 32GB以上、速度 U1 以上をお勧めします。ここでは 32GB/U3 を使っています。

Raspberry Pi 向けの microSD の選び方は?

Raspberry Pi 向けの microSD の選び方は別のブログで解説しています。併せてご覧ください。

モニターは HDMI 接続のモバイルモニターや、MIPI DSI 接続のタッチ対応パネルモニターがあります。表示だけであれば HDMI 接続のモニターでも十分ですが、ここではタッチ対応パネルモニターを使っています。

Raspberry Pi OS のインストールと初期設定

Raspberry Pi Imager をダウンロードして起動します。対象の Raspberry Pi デバイス、OS、書き込み先の microSD ストレージを選択して次へ進みます。OS は Raspberry Pi OS (64-bit) を選びます。これが GUI 入りです。Raspberry Pi Imagerの使い方 も併せてご覧ください。

こちらのガイドでは32bit版が推奨されていますが、私が確認した限り、64bit版で問題は見当たりませんでした。

設定は以下を行っておきましょう。

  • 一般:ホスト名(ここでは rpi4 としました)
  • 一般:ユーザー名とパスワード(ここではユーザー名を piuser としました)
  • 一般:Wi-Fi の設定
  • 一般:ロケール設定(ここではタイムゾーンを Asia/Tokyo 、キーボードレイアウトを jp としました)
  • サービス:SSH を有効化する
SSH の認証

SSH の認証は「公開鍵認証のみを許可する」を強くお勧めします。パスワード認証は公開鍵認証の準備が整っていない時の例外として使います。

書き込みが完了したら、microSD を Raspberry Pi に取り付けて電源 ON しましょう。

自動ログインとブラウザの自動起動の設定

OS 起動後、SSH でログインしたら(もしくは GUI から直接操作も可)、GUI の立ち上げと一般ユーザーでのログイン状態にする設定をします。追加で日本語ロケール設定も行っています。

sudo apt update && sudo apt upgrade -y
sudo raspi-config nonint do_change_locale ja_JP.UTF-8
sudo raspi-config nonint do_boot_behaviour B4
sudo raspi-config nonint do_wayland W3
sudo systemctl reboot

再起動後にまず行うのは Labwc の自動起動のエントリーポイントとなるシェルスクリプト $HOME/.config/labwc/autostart の作成です。例は以下の通りです。

$HOME/.config/labwc/autostart

sleep 5 # waiting for bootup display
/bin/bash $HOME/kiosk/run_kiosk.sh

sleep は GUI が起動しきるまでのウェイトで、任意に設定してください。ちなみに autostart ファイルの実行属性は不要です。

autostart から呼び出す $HOME/kiosk/run_kiosk.sh を作成します。例は以下の通りです(kiosk/ ディレクトリは別途作成してください)。

$HOME/kiosk/run_kiosk.sh

#!/bin/bash

## Invoked from ~/.config/labwc/autostart
chromium-browser "https://example.com" --noerrdialogs --disable-infobars --no-first-run --enable-features=OverlayScrollbar --start-maximized --ozone-platform=wayland --disable-features=Translate --incognito --remote-debugging-port=9222 --kiosk &

autostart から /bin/bash ... として呼び出しているので、このファイルも実行属性は不要です。

注意点は chromium-browser の実行は & 付きのバックグラウンド指定することです。フォアグラウンド実行だと後続処理が動きません。

ここまで行えば、電源 ON と共に GUI が起動し、指定 URL(ここでは https://example.jp) を開いた状態の Web ブラウザが全画面で表示されます。

sudo systemctl reboot と再起動をして、Web ブラウザが自動起動するところまで確認してみてください。

自動起動の停止

$HOME/.config/labwc/autostartrun_kiosk.sh の行を削除もしくはコメントアウトします。

run_kiosk.sh の開発・デバッグ

run_kiosk.sh を SSH セッションから実行するには環境変数 WAYLAND_DISPLAY を指定します。

WAYLAND_DISPLAY=wayland-0 /bin/bash $HOME/kiosk/run_kiosk.sh

これで GUI 画面側に Chromium が表示されます。

より安定した稼働に向けた設定

ここまでで目的は概ね達成しています。ここからは、より安定した稼働に向けた設定を紹介します。必要なところを実施してください。

【オススメ】microSD を読み取り専用モードにする

microSDの書き込み中に電源が落ちるとシステムが壊れるリスクがあります。読み取り専用モードにすることで、こうした破損を防ぐことができ、電源を直接抜いて停止させる運用ができるようになります。

読み取り専用モードにする

sudo raspi-config nonint enable_overlayfs
sudo systemctl reboot

これで次回は読み取り専用モードで起動します。実行時にパッケージインストールが発生することもありますが初回のみです。このモードで作成したファイル等は、再起動時にすべて無くなりますのでご注意を。

読み取り専用モードを解除する

sudo raspi-config nonint disable_overlayfs
sudo systemctl reboot

これで次回は通常の読み書き可能な状態で起動します。

現状は以下のコマンドで確認できます。0 が読み取り専用モード、1 が通常モードです。

sudo raspi-config nonint get_overlay_now
すべてのリスクを回避できるわけではありません

交換準備等、バックアッププランは必ず準備しておきましょう。

またメモリーから一部を動作用に割り当てることになるため、ワーキングメモリーが減少し、動作に支障が出る可能性があります。

【オススメ】VNC による GUI 操作(WayVNC)

ウィンドウマネージャーに Wayland を使っている場合は、 WayVNC を立ち上げることで VNC 接続できます。以下で WayVNC を有効化でき、以降は常に WayVNC が起動します。

sudo raspi-config nonint do_vnc 0

クライアントは TigerVNC 等が良いでしょう(vncviewer64-1.15.0.exe での接続確認をしました)。

インターネット越しの SSH/VNC を安全に行う「SORACOM Napter」 #PR

本デバイスを展示会場などの遠隔地に置いた場合、インターネット越しのアクセスが必要となる場合があります。しかしグローバルの固定 IP アドレスを用意したり、セキュリティへの配慮など手間がかかります。

Raspberry Pi からは Raspberry Pi Connect というリモートデスクトップ/リモートシェルサービスが提供されていますが、使い慣れたターミナルやツールから SSH をしたい場合は別の手段を検討することになります。その時にご利用いただけるのが「SORACOM Napter(ナプター)」です。

SORACOM Napter とは

SORACOM Napter は、SORACOM のポート転送サービスです。

  1. Raspberry Pi からは LTE/5G 通信、もしくは VPN で SORACOM につなげます
  2. SORACOM の ユーザーコンソール(Web 管理画面)上でポート転送の設定します
  3. すると、時限式で有効なグローバル IP アドレスとポートの組み合わせが払い出されます
  4. 上記アドレスにターミナルやツールで接続すると、転送されて Raspberry Pi にアクセスできます

以下がポート転送の設定画面です。

不要なポートを無効化する

例えば USB ポートはキーボードの接続でブラウザを終了させたりと、想定外の事を起こすことができます。不要なポートは無効化しておくと良いでしょう。

Bluetooth を無効化する

/boot/firmware/config.txt[all] セクションに dtoverlay=disable-bt を追記します。

/boot/firmware/config.txt

...
[all]
dtoverlay=disable-bt

その後、 hciuart を無効化した後、再起動します。

sudo systemctl disable hciuart.service
sudo systemctl reboot

以降は Bluetooth は無効として運用できます。

Bluetooth を有効化する場合

dtoverlay=disable-bt の行を削除もしくはコメントアウトした上で sudo systemctl enable hciuart してから再起動します。

USB ポートを無効化する

USB ポートは sysfs を通じてコマンドラインから有効化・無効化ができます。以下は、USB のポート番号 1-1.1 を操作する例です。

## 無効化
sudo sh -c 'echo -n 1-1.1 > /sys/bus/usb/drivers/usb/unbind'
## 有効化
sudo sh -c 'echo -n 1-1.1 > /sys/bus/usb/drivers/usb/bind'

ポート番号は 1-1.1 から 1-1.4 まであります(Raspberry Pi 4 の場合)。ポートの確認は USB デバイスを挿してから dmesg もしくは lsusb で見るのが確実です。

また、OS 起動後は USB ポートは有効です。そこで OS 起動時に都度無効化する必要があります。/etc/rc.local に記載する、もしくは systemd のユニットファイルを作成・登録する方法があります。詳細は本ブログの「バックグラウンドプロセス管理を systemd で行う」や man systemd-rc-local-generator をご覧ください。

Ethernet ポートを無効化する

Ethernet ポートは ip コマンドでコマンドラインから有効化・無効化ができます。

# 無効化
sudo ip link set eth0 down
# 有効化
sudo ip link set eth0 up

USB ポートと同様に OS 起動後は Ethernet ポートは有効です。OS 起動時に都度無効化してください。

ifconfig でも down できますが、時代は ip コマンドのようですね。

全画面 Web ブラウザを CLI で操作する(CDT)

CLI で Web ブラウザを操作できると、ラズパイにキーボードをつなげ無くてもブラウジングができます。Chromium 系ブラウザは CDT(Chrome DevTools)Protocol で起動中の Web ブラウザを操作できます。

CDT Protocol は WebSocket です。その WebSocket の接続先アドレスは --remote-debugging-port で指定したポートから HTTP/JSON で得て、WebSocket でコマンドを指定する仕組みです(run_kiosk.sh--remote-debugging-port を指定済みです)。

準備

WebSocket の操作に websocat を、 WebSocket の接続先アドレスを得るために jq を入れています。

sudo apt install -y jq
curl -sL https://github.com/vi/websocat/releases/download/v1.14.0/websocat_max.aarch64-unknown-linux-musl -o /tmp/websocat 
sudo install -m 0755 /tmp/websocat /usr/local/bin/

操作:ページ変更

https://google.com を表示する

echo "{\"id\":$RANDOM,\"method\":\"Page.navigate\",\"params\":{\"url\":\"https://google.com\"}}" | websocat $(curl -s localhost:9222/json | jq -r .[0].webSocketDebuggerUrl)
id に指定する値

id はリクエストに対するレスポンス確認用で、整数であればなんでもかまいません。ここでは Bash の疑似乱数 $RANDOM を使用しました。詳細は Chrome DevTools Protocol – Introduction をご覧ください。

操作:リロード

現在表示しているページをリロードする

echo "{\"id\":$RANDOM,\"method\":\"Page.reload\"}" | websocat $(curl -s localhost:9222/json | jq -r .[0].webSocketDebuggerUrl)

無操作・操作再開の検出とコマンド実行

無操作(アイドリング)の検出に応じてコマンド実行ができます。例えばタッチパネルを使ったデモであれば、先のブラウザの CLI 操作と組み合わせて自動的にホームに戻すことができます。

以下は「無操作が10秒経過したら $HOME/kiosk/timeout.sh を実行」という例です。

swayidle -w timeout 10 "/bin/bash $HOME/kiosk/timeout.sh"

swayidle には他に、操作再開時のイベント resume もあります。詳しくは man swayidle をご覧ください。

自動起動は $HOME/.config/labwc/autostart へ書きます。その際は & をつけたバックグラウンド実行にすることを忘れないようにしてください。

swayidle の開発・デバッグ

swayidle は SSH のセッションからも実行でき、timeout や resume イベントはそこでも発生します。

バックグラウンドプロセス管理を systemd で行う

ここで紹介した chromium-browser や swayidle は、run_kiosk.sh 内で & を付けてバックグラウンドプロセスとして起動しています。不慮にプロセスが終了した場合の自動再起動は別の仕組みが必要です。

そこでプロセスの起動を systemd 経由にすると、自動再起動といったプロセス管理が容易になります。また /etc/rc.local も systemd で置き換えることができます(むしろ systemd が rc.local をレガシーサポートしています)。ファイル数が多くなりますが、堅牢なプロセス管理の視点から個人的にオススメです。

具体的な例は「非root (一般ユーザー)での systemd ユニットファイルの編集と登録、運用」をご覧ください。

まとめと応用案

Raspberry Pi で常設型の専用端末「キオスク端末」の作り方をご紹介しました。Web ブラウザの起動に絞って解説しましたが、ここからカスタマイズしていくことができると思います。

見栄えの良いデモはもちろん、操作と運用の両面から安心して使えるデモ環境を目指してください!

文中外での参考文献

― ソラコム松下 (Max)