Ubuntu 26.04 で Chromium Kiosk を30秒でセットアップする方法

このスクリプトは新規 Ubuntu 26.04 Server インストールを、選択した URL を指すフルスクリーンブラウザに直接ブートするロックダウンされた Chromium キオスクに変える。setup-kiosk.sh として保存し、root で一度実行すれば、マシンはキオスクモードで再起動する。

スクリプト

setup-kiosk.sh
#!/usr/bin/env bash
set -euo pipefail

# ターゲット URL(引数 $1 で指定されなければ ubuntu.com がデフォルト)
KIOSK_URL="${1:-https://ubuntu.com}"
KIOSK_USER="kiosk"

echo "========================================="
echo " Starting Ubuntu 26.04 Server Kiosk Setup"
echo " Target URL: ${KIOSK_URL}"
echo "========================================="

# 1. 前提条件チェック:root 権限
if [[ $EUID -ne 0 ]]; then
    echo "[!] Error: This script must be executed with root privileges." >&2
    echo "    Usage: sudo ./setup-kiosk.sh [OPTIONAL_URL]" >&2
    exit 1
fi

# 2. 前提条件チェック:ネットワーク接続
echo "[+] Checking network connectivity..."
if ! ping -c 1 -W 3 8.8.8.8 &>/dev/null; then
    echo "[!] Error: No active network connection detected." >&2
    echo "    Please verify IP configuration or cabling before proceeding." >&2
    exit 1
fi

# 3. 最小限のディスプレイ、デスクトップヘルパー、ブラウザ依存パッケージをインストール
echo "[+] Updating apt repositories and installing required dependencies..."
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y -qq \
    xserver-xorg \
    xserver-xorg-video-all \
    xinit \
    x11-xserver-utils \
    openbox \
    unclutter \
    chromium-browser \
    xdg-utils \
    dbus-x11 \
    desktop-file-utils

# 4. 専用の制限付きキオスクユーザーを作成
if ! id "$KIOSK_USER" &>/dev/null; then
    echo "[+] Creating non-root user '$KIOSK_USER'..."
    useradd -m -s /bin/bash "$KIOSK_USER"
fi

# ディスプレイ、レンダリング、入力、オーディオハードウェアへの直接アクセス許可を付与
usermod -aG video,audio,input,render "$KIOSK_USER"

# 5. 非 root サービス起動用に Xorg 実行権限を修正
echo "[+] Configuring X11 wrapper permissions..."
mkdir -p /etc/X11
cat <<'EOF' > /etc/X11/Xwrapper.config
allowed_users=anybody
needs_root_rights=yes
EOF

# 6. Openbox 環境と Chromium ランチャーを設定
echo "[+] Setting up autostart profile for '$KIOSK_USER'..."
KIOSK_HOME=$(getent passwd "$KIOSK_USER" | cut -d: -f6)
AUTOSTART_DIR="$KIOSK_HOME/.config/openbox"
mkdir -p "$AUTOSTART_DIR"

cat <<EOF > "$AUTOSTART_DIR/autostart"
#!/usr/bin/env bash

# DPMS とディスプレイ省電力/スリープを無効化
xset s off
xset s noblank
xset -dpms

# アイドル時にマウスカーソルを隠す
unclutter -idle 0.5 -root &

# Chromium snap 封じ込め用のアクティブな D-Bus セッションを確保
if [ -z "\${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
    eval \$(dbus-launch --sh-syntax --exit-with-session)
fi

# Chromium キオスクの回復性のための無限実行ループ
while true; do
  chromium \
    --kiosk \
    --noerrdialogs \
    --disable-infobars \
    --no-first-run \
    --disable-session-crashed-bubble \
    --disable-component-update \
    --check-for-update-interval=31536000 \
    "$KIOSK_URL"
  sleep 1
done
EOF

chmod +x "$AUTOSTART_DIR/autostart"
chown -R "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.config"

# 7. Snap cgroup 委譲付きの Systemd キオスクサービスを作成・有効化
echo "[+] Registering systemd kiosk service..."
cat <<EOF > /etc/systemd/system/kiosk.service
[Unit]
Description=Chromium Kiosk Service
After=network-online.target sound.target dbus.service
Wants=network-online.target dbus.service

[Service]
User=$KIOSK_USER
Group=$KIOSK_USER
Type=simple
Delegate=yes
PAMName=login
ExecStart=/usr/bin/startx /usr/bin/openbox-session -- :0 -nolisten tcp -nocursor
Restart=always
RestartSec=3
Environment=DISPLAY=:0

[Install]
WantedBy=graphical.target
EOF

# デフォルトターゲットを graphical に設定しキオスク自動起動を有効化
systemctl set-default graphical.target
systemctl daemon-reload
systemctl enable kiosk.service

echo "========================================="
echo " Kiosk setup complete!"
echo " The system will reboot into kiosk mode."
echo "========================================="
sleep 3
reboot

URL を変更する方法

キオスク URL はスクリプト上部の単一変数で制御される:

setup-kiosk.sh
KIOSK_URL="${1:-https://ubuntu.com}"

2つの選択肢:

  1. インストーラー実行時にコマンドラインで渡す — スクリプトを変更しないため推奨:

    example.sh
    sudo ./setup-kiosk.sh https://your-dashboard.example.com
  2. スクリプト内のデフォルトを編集 — 永続的なフォールバック URL が欲しい場合。https://ubuntu.com をターゲット URL に変更。この値は引数がない場合のみ使用。

URL はセットアップ時に autostart ファイルに焼き込まれる(~kiosk/.config/openbox/autostart)。キオスクがすでにインストール済みの後に URL を変更したい場合、そのファイル内の chromium ... "$KIOSK_URL" 行を編集してサービスを再起動:

example.sh
sudo systemctl restart kiosk.service

ステップごとの動作説明

1. root チェック

$EUID は実効ユーザー ID。パッケージインストール、システムユーザー作成、/etc/X11 への書き込み、systemd ユニット登録が必要なため、スクリプトは非 root での実行を拒否する。

2. ネットワークチェック

8.8.8.8 への3秒タイムアウトの単一 ICMP パケット。マシンにネットワークがなければ apt-get が途中で失敗しシステムを壊れた状態に残すため、明確なメッセージで早期に終了する。

3. パッケージインストール

DEBIAN_FRONTEND=noninteractive と -qq で apt を静粛にし、キーボード設定などのプロンプトを止める。インストールされるパッケージはディスプレイを駆動しブラウザを動かす最小限:

  • xserver-xorg, xserver-xorg-video-all, xinit — X サーバー本体
  • x11-xserver-utils — xset を提供、後でスクリーンブランキングを無効化するため使用
  • openbox — 小さくほぼ機能のないウィンドウマネージャ。ユーザーが操作するものが何もないのでキオスクに最適
  • unclutter — 動いていないときマウスカーソルを隠す
  • chromium-browser — 実際のキオスクアプリケーション
  • xdg-utils, desktop-file-utils, dbus-x11 — Chromium と snap ランタイムが間接的に必要とするヘルパー

4. 専用キオスクユーザー

Chromium は root では実行しない。スクリプトはパスワードなしでホームディレクトリ付きの kiosk ユーザーを作成し、video、audio、input、render グループに追加して、sudo なしで GPU、サウンドカード、入力デバイスと直接通信できるようにする。

5. Xwrapper 設定

デフォルトでは Xorg は非 root ユーザーによる起動を拒否する。allowed_users=anybody を持つ /etc/X11/Xwrapper.config はその制限を緩め、needs_root_rights=yes は X が直接ハードウェアアクセスに必要な権限を自身に与えることを許可。これが kiosk ユーザーが systemd サービス内から startx を実行できるようにするもの。

6. Openbox autostart

Openbox は起動時に ~/.config/openbox/autostart を実行。生成されるスクリプトは4つのことを行う:

  • xset s off / xset s noblank / xset -dpms — スクリーンセーバー、スクリーンブランキング、DPMS 電源管理を無効化し、ディスプレイがスリープしないようにする。
  • unclutter -idle 0.5 -root — 0.5秒の非活動後にカーソルを隠す。タッチ専用キオスクでは可視カーソルはあってはならない。
  • dbus-launch — snap 封じ込め下の Chromium はセッション D-Bus が必要。サービスが提供しなければここで起動。
  • while true; do chromium --kiosk ...; sleep 1; done — 回復性ループ。Chromium がクラッシュ、終了、または X サーバーが詰まっても、ループが1秒以内に再起動。フラグは初回実行やクラッシュ後に Chromium が表示する全ての対話ダイアログを無効化(--no-first-run、--disable-session-crashed-bubble、--disable-infobars、--noerrdialogs)、--check-for-update-interval=31536000 で実質1年間更新チェックを無効にし、ブラウザがホームに通信しないようにする。

7. systemd サービス

ユニットファイルは DISPLAY=:0 で kiosk ユーザーとして startx /usr/bin/openbox-session を実行。重要なディレクティブ:

  • After=network-online.target ... Wants=network-online.target — ネットワークが立ち上がるのを待ち、Chromium がオフラインエラーページでブートしないようにする。
  • Delegate=yes — サービスが自身の cgroup サブツリーを管理できるようにし、snap 版 Chromium のサンドボックス設定に必要。
  • PAMName=login — サービスを PAM ログインセッション経由で実行し、dbus-launch、logind、デバイスノードの ACL が実際のログインユーザーと同じように動作するようにする。
  • Restart=always / RestartSec=3 — X サーバーまたは openbox が死んだ場合、systemd が3秒後にキオスク全体を復帰させる。

systemctl set-default graphical.target はマシンをデフォルトでグラフィカルターゲットにブートさせ、systemctl enable kiosk.service は毎ブート時にキオスクを自動起動させる。

最終再起動

スクリプトは sleep 3; reboot で終わり、インストールが残した状態の上で X を起動しようとするのではなく、キオスクサービスが有効な新しいグラフィカルターゲットにクリーンブートする。

使い方

example.sh
chmod +x setup-kiosk.sh
sudo ./setup-kiosk.sh https://your-dashboard.example.com

再起動後、URL を指すフルスクリーンキオスクモードの Chromium が表示されるはず。シェルを復旧するには Ctrl+Alt+F3 で仮想コンソールに切り替え、通常ユーザーでログイン。

デュアルモニターキオスク設定については 1つの X サーバーで2つ目の画面に2つ目のプログラムを実行する方法、および 単一 GPU で2つの別々の X サーバーが動かない理由 も参照。


同じカテゴリの類似記事をチェック: Ubuntu Chromium