みなさん、こんにちは、
HDMI接続の22インチタッチモニターに接続したZimaBoard 2でフルスクリーンタッチスクリーンキオスクを動かす方法を共有したいと思います。
ZimaOSにはパッケージマネージャー(apt)がないため、すべてをDockerコンテナ内で行うのがコツです。
私のセットアップ
ZimaBoard 2 1664(Intel N100、16 GB RAM)
ZimaOS v1.5.4
HDMI + USB-C→USB-Aタッチスクリーン入力対応22インチタッチモニター

アプローチ
ZimaOSはBuildrootベースです — aptなし、Xorgなし、デスクトップ環境なし。代わりに、XorgのmodesettingドライバーとChromiumのキオスクモードを備えたDebianコンテナを/dev/driを通して実行します。別のnginx:alpineコンテナがダッシュボードファイルを提供します。
ステップ1 — ユーザーをdockerグループに追加する
http://your-zima-ip:7681 のウェブターミナルを開き、以下を実行してください:
bash
sudo usermod -aG docker YOUR_USERNAME
変更を反映させるためにSSHを再接続してください。
ステップ2 — ファイルを作成する
bash
mkdir -p /DATA/AppData/kiosk/dashboard
/DATA/AppData/kiosk/Dockerfile:
text
FROM debian:bookworm-slim
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
RUN apt-get update && \
apt-get install -y \
xserver-xorg-core \
xserver-xorg-input-libinput \
openbox chromium \
x11-xserver-utils xinit \
fonts-noto-core && \
apt-get install -y -t bookworm-backports libgl1-mesa-dri && \
rm -rf /var/lib/apt/lists/*
COPY xorg.conf /etc/X11/xorg.conf
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
| なぜMesaのバックポート?Intel N100(Alder Lake-N、PCI ID 0x46d4)はMesa 23.0以降でのみサポートされています。Debian bookwormは22.3を搭載。バックポートは25.xを提供します。 |
/DATA/AppData/kiosk/xorg.conf:
text
セクション "デバイス"
識別子 "Intel"
ドライバー "modesetting"
オプション "加速方法" "なし"
EndSection
セクション "画面"
識別子 "デフォルト"
デバイス "Intel"
EndSection
セクション "入力デバイス"
識別子 "タッチスクリーン"
ドライバー "libinput"
オプション "デバイス" "/dev/input/event8"
EndSection
セクション "サーバーレイアウト"
識別子 "デフォルト"
画面 "デフォルト"
入力デバイス "タッチスクリーン" "コアポインター"
EndSection
|
次のコマンドでタッチデバイスのイベント番号を見つけてください: bash cat /proc/bus/input/devices | grep -A3 -i touch |
/DATA/AppData/kiosk/entrypoint.sh:
text
#!/bin/sh
Xorg :0 vt1 -s 0 -dpms -nolisten tcp &
sleep 4
export DISPLAY=:0
xset s off && xset -dpms && xset s noblank
openbox --sm-disable &
sleep 1
exec chromium \
--kiosk --no-sandbox --disable-gpu \
--disable-dev-shm-usage \
--touch-events=enabled \
--no-first-run --disable-infobars \
"${KIOSK_URL:-http://localhost:8888}"
/DATA/AppData/kiosk/nginx.conf:
text
server {
listen 8888;
root /usr/share/nginx/html;
index index.html;
}
ダッシュボードのHTML/CSS/JSファイルを/DATA/AppData/kiosk/dashboard/に置いてください。

ステップ3 — ビルドと実行
ビルド(注:ZimaOSではdocker buildに--config /tmpが必要です):
bash
docker --config /tmp build -t kiosk:latest /DATA/AppData/kiosk
ダッシュボードウェブサーバー:
bash
docker --config /tmp run -d \
--name dashboard-server \
--restart unless-stopped \
--network host \
-v /DATA/AppData/kiosk/dashboard:/usr/share/nginx/html:ro \
-v /DATA/AppData/kiosk/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
nginx:alpine
キオスク表示:
bash
docker --config /tmp run -d \
--name jarvis-kiosk \
--restart unless-stopped \
--privileged \
--network host \
-e KIOSK_URL=http://localhost:8888 \
-v /DATA/AppData/kiosk/xorg.conf:/etc/X11/xorg.conf:ro \
-v /DATA/AppData/kiosk/entrypoint.sh:/entrypoint.sh:ro \
-v /run/udev:/run/udev:ro \
kiosk:latest
両方のコンテナは--restart unless-stoppedが設定されているため、自動的に再起動後も継続します。
タッチスクリーンクリック修正(重要!)
Xorgのlibinputはタッチをポインター(マウス)イベントとしてマッピングします。Chromiumはクリックのためにわずかな移動閾値を適用します — たとえ1pxの指の移動でもクリックが発火しなくなります。ダッシュボードでonclickハンドラーを使っている場合は、このJSを追加してpointerupと20pxの閾値に置き換えてください:
js
(function touchFix() {
const downs = {};
document.addEventListener('pointerdown', e => {
downs[e.pointerId] = { x: e.clientX, y: e.clientY };
}, { passive: true });
function isTap(e) {
const d = downs[e.pointerId];
return !d || (Math.abs(e.clientX - d.x) < 20 && Math.abs(e.clientY - d.y) < 20);
}
function run(fn) { try { new Function(fn)(); } catch(ex) {} }
function patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
const oc = btn.getAttribute('onclick');
btn.removeAttribute('onclick');
btn.addEventListener('pointerup', e => { e.stopPropagation(); if (isTap(e)) run(oc); });
});
}
window.addEventListener('load', () => {
document.querySelectorAll('.widget[onclick]').forEach(el => {
const oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { if (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
new MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { if (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();
タッチスクリーンでマウスカーソルを非表示にするには、CSSに以下も追加してください:
css
{ cursor: none !important; touch-action: manipulation; }

トラブルシューティング
| 問題 | 修正 |
| docker buildが不明なフラグで失敗 | docker --config /tmp build … を使用 |
| 黒画面/基本出力テストに失敗 | Wayland/cageではなくXorgのmodesettingを使用 |
| MesaはN100をサポートしていません | bookworm-backportsからlibgl1-mesa-driをインストール |
| タッチ入力が検出されません | /proc/bus/input/devicesでイベント番号を確認し、xorg.confを更新 |
| ダッシュボードにZimaOSのログイン画面が表示されます | ポート80はZimaOSが使用中です — 別のポート(888が動作)を使ってください |
私の常時稼働ホームアシスタントセットアップ(返信)
電力効率の良いホームアシスタントセットアップを構築しました。メインPCを常に稼働させて電気を消費することなく、24時間稼働可能です。秘密兵器は、常時稼働する頭脳としてのZimaで、メインPCは実際に必要になるまで休止状態にあります。
メインPC
こちらがメインマシンの中身です:
CPU: AMD Ryzen 9 9950X3D
マザーボード: ASUS ROG Crosshair X870E Glacial
メモリ:Acer Predator Hermes RGB DDR5 96GB(2×48GB)6000MHz CL28
ストレージ:Crucial T710 4TB NVMe M.2 PCIe 5.0 Gen5
GPU(ゲーミング用):ASUS ROG Astral GeForce RTX 5080 16GB
GPU(AI用):Intel Arc Pro B70 32GB(リリース待ち)
電源ユニット:Corsair RM1200x
ケース:Thermaltake Tower 900
Zimaセットアップ(常時稼働ハブ)
Zimaは24時間365日稼働し、軽量な処理をすべて担当 — ホームアシスタントの役割、カメラ映像、およびクラウド経由のGroq無料プランを使った基本的なAIクエリを処理します。
Zimaに直接接続された周辺機器:
Pisichen 22インチタッチスクリーンモニター(HDMI → miniDPアダプター+タッチ入力用USB-Cケーブル1本)
Edifier G1000 IIスピーカー(外部USB-Aから3.5mmサウンドカード経由)
DAMAO DGM20Sマイクロフォン(USB-A接続)
ストレージ:
Seagate IronWolf Pro 20TB — 「ブラックホール」NASドライブ
Seagate IronWolf Pro 1TB — メインNASドライブ
ネットワーキング:
Zimaはイーサネット経由でルーターに接続
2本目のイーサネットケーブルがZimaからPCへ直接接続され、高速なローカル転送を実現

スマートな部分:Wake-on-LAN
ここが魔法の部分です — Geminiがうまく処理できない複雑な質問が来ると、ZimaがWake-on-LANパケットを送信してメインPCを休止状態から起こします。起動後は、Intel Arc Pro B70で動作するローカルの70BパラメータLLMに接続します。タスクが終わるとPCは再びスリープに戻ります。
結果はこうです:常に応答性の高いホームアシスタントがあり、大型マシンは本当に重い作業があるときだけ起動します。電気代は抑えられ、必要なときには高性能なローカルモデルにアクセスできます。
Claude CodeとPerplexityに大きな感謝を — 正直なところ、彼らの助けがなければこのプロジェクトを一人で完成させることはできませんでした。プロセス全体を通じて彼らはかけがえのない存在でした。
この情報が、同じようなプロジェクトに挑戦するクレイジーな人たちの役に立てば嬉しいです。ぜひ好きなところでシェアしてください!
Zimaキャンペーンハブ
もっと読む

なぜ私はラックサーバーをZimaCube 2に置き換えたのか — ホームラボ進化の物語
ZimaCube 2は、騒音の多いラックサーバーや制限のあるミニPCのセットアップに代わり、Docker、ZFSストレージ、NVMe、バックアップ、自宅ホスティング、24時間365日のインフラワークロードに対応した静かなオールインワンのホームラボを提供します。

ZimaCube 2でDocker、CI/CD、10以上のセルフホストサービスを運用する方法
このコミュニティスポットライトでは、ZimaCube 2 PioneerのMichael Luckenbillによる完全セルフホスト型インフラストラクチャのテストを紹介します。10以上のDockerコンテナ、ローカルGitHub Actions CI/CD、デュアルZFS HDD/NVMeストレージプール、デュアル2.5GbEネットワーキング、Cloudflareトンネルを搭載し、標準の8GB DDR5 RAMで動作。コンパクトで静かなシャーシは、冷却性能を保ちながら連続稼働をこなし、ストレージ、コンピュート、オートメーションを一つにまとめたオールインワンのパーソナルクラウドボックスを実現しています。

2つのAIエージェントが1台のサーバーを争うとどうなる?
Zero NoichiのAIサイバーセキュリティ実験では、2台のZimaBoard 2を使って攻撃者と防御者のエージェントをシミュレートし、ホームラボサーバーが安全なAI、Docker、NAS、セキュリティテストを支える方法を示しました。

