ソラコムのテクノロジー・エバンジェリスト 松下(ニックネーム: 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 の選び方は別のブログで解説しています。併せてご覧ください。
モニターは 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 の認証は「公開鍵認証のみを許可する」を強くお勧めします。パスワード認証は公開鍵認証の準備が整っていない時の例外として使います。
書き込みが完了したら、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/autostart
の run_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 のポート転送サービスです。
- Raspberry Pi からは LTE/5G 通信、もしくは VPN で SORACOM につなげます
- SORACOM の ユーザーコンソール(Web 管理画面)上でポート転送の設定します
- すると、時限式で有効なグローバル IP アドレスとポートの組み合わせが払い出されます
- 上記アドレスにターミナルやツールで接続すると、転送されて Raspberry Pi にアクセスできます
以下がポート転送の設定画面です。

- Raspberry Pi と SORACOM 間の通信は LTE™ USB ドングル を使うか、既存の Wi-Fi や有線 LAN に接続したうえで WireGuard を利用した VPN 接続サービス「SORACOM Arc」が使えます。
- Raspberry Pi への WireGuard クライアントのインストール方法は「Raspberry Pi を WireGuard のクライアントとして構成する」をご覧ください。
- VNC の利用は SSH との組み合わせです。詳細は「Raspberry Pi へ VNC でリモートアクセスする」をご覧ください。
不要なポートを無効化する
例えば 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 は無効として運用できます。
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
はリクエストに対するレスポンス確認用で、整数であればなんでもかまいません。ここでは 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
は SSH のセッションからも実行でき、timeout や resume イベントはそこでも発生します。
バックグラウンドプロセス管理を systemd で行う
ここで紹介した chromium-browser や swayidle は、run_kiosk.sh
内で &
を付けてバックグラウンドプロセスとして起動しています。不慮にプロセスが終了した場合の自動再起動は別の仕組みが必要です。
そこでプロセスの起動を systemd 経由にすると、自動再起動といったプロセス管理が容易になります。また /etc/rc.local
も systemd で置き換えることができます(むしろ systemd が rc.local をレガシーサポートしています)。ファイル数が多くなりますが、堅牢なプロセス管理の視点から個人的にオススメです。
具体的な例は「非root (一般ユーザー)での systemd ユニットファイルの編集と登録、運用」をご覧ください。
まとめと応用案
Raspberry Pi で常設型の専用端末「キオスク端末」の作り方をご紹介しました。Web ブラウザの起動に絞って解説しましたが、ここからカスタマイズしていくことができると思います。
見栄えの良いデモはもちろん、操作と運用の両面から安心して使えるデモ環境を目指してください!
文中外での参考文献
- How to use a Raspberry Pi in kiosk mode
- Connecting to WayVNC on a Raspberry Pi device running Wayland using RealVNC Viewer
― ソラコム松下 (Max)