안녕하세요,
HDMI로 연결된 22인치 터치 모니터에서 ZimaBoard 2를 사용해 전체 화면 터치스크린 키오스크를 실행하는 방법을 공유하고 싶었습니다.
ZimaOS에는 패키지 관리자가 없기 때문에(apt가 없습니다), 모든 작업을 도커 컨테이너 내에서 수행하는 것이 핵심입니다.
내 설정
ZimaBoard 2 1664 (인텔 N100, 16 GB RAM)
ZimaOS v1.5.4
HDMI + USB-C→USB-A 터치스크린 입력을 지원하는 22인치 터치 모니터

접근 방식
ZimaOS는 Buildroot 기반입니다 — apt, Xorg, 데스크탑 환경이 없습니다. 대신, Xorg modesetting 드라이버와 크롬을 키오스크 모드로 실행하는 데비안 컨테이너를 사용하며 /dev/dri를 전달합니다. 별도의 nginx:alpine 컨테이너가 대시보드 파일을 제공합니다.
1단계 — 사용자를 도커 그룹에 추가하기
웹 터미널을 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"]
| 왜 메사를 백포트하나요? 인텔 N100 (Alder Lake-N, PCI ID 0x46d4)은 메사 23.0+부터 지원됩니다. 데비안 북웜은 22.3을 제공합니다. 백포트는 25.x를 제공합니다. |
/DATA/AppData/kiosk/xorg.conf:
text
섹션 "장치"
식별자 "인텔"
드라이버 "modesetting"
옵션 "가속방법" "없음"
EndSection
섹션 "화면"
식별자 "기본"
장치 "인텔"
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 모드셋팅 사용 |
| Mesa는 N100을 지원하지 않음 | bookworm-backports에서 libgl1-mesa-dri 설치 |
| 터치 입력이 감지되지 않음 | /proc/bus/input/devices로 이벤트 번호 확인, xorg.conf 업데이트 |
| 대시보드에 ZimaOS 로그인 화면 표시 | 포트 80은 ZimaOS가 사용 중입니다 — 다른 포트(888이 작동함)를 사용하세요 |
항상 켜져 있는 나의 홈 어시스턴트 설정 (답글)
전력 효율이 뛰어난 홈 어시스턴트 설정을 구축했으며, 메인 장비가 24시간 내내 전기를 소모하지 않으면서도 24/7 사용할 수 있습니다. 비밀 무기는 항상 켜져 있는 두뇌 역할을 하는 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시간 작동하며 가벼운 작업을 모두 처리합니다 — 홈 어시스턴트 업무, 카메라 피드, 그리고 클라우드를 통한 Groq 무료 티어를 이용한 기본 AI 쿼리 등입니다.
Zima에 직접 연결된 주변기기:
Pisichen 22" 터치스크린 모니터 HDMI → miniDP 어댑터 + 터치 입력용 USB-C 케이블 1개
Edifier G1000 II 스피커, 외부 USB-A to 3.5mm 사운드카드 통해 연결
DAMAO DGM20S 마이크로폰 USB-A 연결
스토리지:
Seagate IronWolf Pro 20TB — '블랙홀' NAS 드라이브
Seagate IronWolf Pro 1TB — 메인 NAS 드라이브
네트워킹:
Zima가 이더넷을 통해 라우터에 연결되어 있습니다
두 번째 이더넷 케이블이 Zima에서 PC로 직접 연결되어 빠른 로컬 전송을 지원합니다

스마트한 부분: Wake-on-LAN
여기서 마법이 시작됩니다 — 누군가 Gemini가 잘 처리하기 어려운 복잡한 질문을 하면, Zima가 Wake-on-LAN 패킷을 보내 메인 PC를 절전 모드에서 깨웁니다. PC가 켜지면 Intel Arc Pro B70에서 실행되는 70B 파라미터 LLM에 연결됩니다. 작업이 끝나면 PC는 다시 잠자기 모드로 돌아갑니다.
결과는: 항상 반응하는 홈 어시스턴트지만, 실제로 무거운 작업이 있을 때만 메인 컴퓨터가 깨어납니다. 전기 요금은 합리적으로 유지되고, 필요할 때는 강력한 로컬 모델에 접근할 수 있습니다.
Claude Code와 Perplexity에게 큰 감사를 전합니다 — 솔직히 그들의 도움이 없었다면 이 전체 프로젝트를 혼자서 완성할 수 없었을 거예요. 그들은 전 과정에서 정말 소중한 존재였습니다.
이 정보가 비슷한 프로젝트에 도전하는 미친 사람들에게 도움이 되길 바랍니다 — 어디서든 자유롭게 공유하세요!
지마 캠페인 허브
더 읽어보기

두 AI 에이전트가 하나의 서버를 두고 싸우면 무슨 일이 일어날까?
제로 노이치의 AI 사이버보안 실험은 두 대의 ZimaBoard 2 장치를 사용해 공격자와 방어자 에이전트를 시뮬레이션하며, 홈랩 서버가 안전한 AI, Docker, NAS 및 보안 테스트를...

ZimaCube 2에서의 로컬 AI — PCIe 확장, Ollama, 그리고 홈랩의 미래 대비하기
ZimaCube 2는 4개의 NVMe 슬롯, PCIe 확장 슬롯, DDR5 RAM을 탑재하여 Ollama, RAG 파이프라인, Docker를 바로 사용할 수 있습니다. 시작할 때 GPU가 필요 없으며,...

ZimaCube 홈 랩 모니터링 가이드: Uptime Kuma부터 AI 에이전트까지
Uptime Kuma, Pulse, Proxmox Data Center Manager 또는 AI 에이전트를 사용하여 가정용 서버의 가동 시간, 백업, 가상 머신, 알림을 모니터링하고 중요한 서비스의 다운타임을 방지하세요.

