Jetson 양산 OS 개발기 ④ · 바이코드(ByCode)
현장에 나간 Edge 장비 곁에는 대개 사람이 없다. 그런 장비에 소프트웨어를 업데이트한다고 하자. 새 버전이 잘 뜨면 다행이지만, 안 뜨면 어떻게 되나? 이번 편은 무인 장비에 컨테이너를 업데이트하는 개발자를 위한 기록이다. 우리는 일부러 실패를 집어넣어, 사람 개입 없이 이전 버전으로 되돌아오는지 확인했다.
먼저 범위를 분명히 한다. 우리가 만든 것은 Docker와 systemd 위에 얹은 경량 업데이트 스크립트다. OS 전체를 A/B로 바꾸는 방식이나 자체 배포 서버는 이번 범위가 아니다. 그것은 다음 단계의 몫이다. 이번 v0의 목표는 컨테이너 단위 업데이트와 자동 롤백이 무인으로 도는지 증명하는 것이다.
교체가 아니라 롤백이 핵심이다
새 이미지를 받아서 갈아끼우는 일은 어렵지 않다. 어려운 것은 그다음이다. 새 버전이 안 뜨거나 이상하게 뜨면, 현장에 사람이 없는 장비는 그대로 멈춘다. 그래서 업데이트의 진짜 요건은 성공이 아니라, 실패해도 안전하게 되돌아오는 것이다. 롤백이 없는 교체 스크립트를 우리는 OTA라고 부르지 않는다.
핵심 장치는 rollback-point다. 새 이미지로 전환하기 전에, 지금 잘 돌고 있는 이미지를 먼저 기록해 둔다. 새 버전이 검사를 통과하지 못하면 그 지점으로 되돌린다.
무엇을 성공으로 볼 것인가 — running과 health
컨테이너가 떴다는 것과 실제로 건강하다는 것은 다르다. 뜨자마자 죽는 컨테이너도, 떠 있지만 응답하지 못하는 컨테이너도 모두 실패다. 그래서 우리는 두 개의 게이트를 뒀다.
첫째는 running이다. 컨테이너가 실행 상태로 유지되는가. 둘째는 health다. 앱이 자신의 /health 응답으로 정상임을 알리는가. 이 신호는 Docker의 HEALTHCHECK로 확인한다. 두 게이트를 모두 통과해야 업데이트를 확정하고, 하나라도 어긋나면 롤백한다.
실패를 일부러 주입했다 — 네 개의 시나리오
성공 경로만 보는 검증은 반쪽이다. 그래서 실패를 만들어 넣었다. 작은 HTTP 서버 컨테이너를 네 가지로 준비했다. 정상, 정상(다음 버전), 헬스 실패(/health가 500을 반환), 기동 실패(뜨자마자 종료)다.
결과는 네 경우 모두 설계대로였다.
- 정상 업데이트: 두 게이트 통과 → 새 버전으로 확정.
- 헬스 실패: unhealthy를 약 23초 만에 감지 → 이전 버전으로 자동 롤백.
- 기동 실패: “running 아님”을 약 3초 만에 감지 → 자동 롤백.
롤백은 약 7초 만에 끝났고, 버전 번호는 이전 값 그대로 유지됐다. 사람의 손은 필요하지 않았다.
타이밍에도 뜻이 있다. 기동 실패는 헬스 응답을 기다릴 필요 없이 “떠 있지 않다”는 사실만으로 3초 만에 잡힌다. 실패를 빨리 아는 것도 복구의 일부다.
“실패”처럼 보이는 정상 신호
무인 시스템에서는 신호를 정확히 읽는 일이 중요하다. 롤백이 일어나면 systemd는 이 업데이트 작업을 “failed”로 보고한다. 얼핏 오류처럼 보이지만, 이는 “새 버전을 거부하고 이전 상태로 되돌렸다”는 정상 신호다. 그래서 성공 여부는 종료 코드가 아니라, 로그의 롤백 성공 기록과 유지된 버전으로 판정한다.
또 하나. 처음에는 x86 서버에서 구운 이미지를 arm64 보드에 올렸다가 컨테이너가 즉시 종료됐다. 아키텍처가 맞지 않았기 때문이다. arm64용으로 다시 빌드하자 해결됐다. 무인 배포에서 이런 어긋남은 조용한 실패로 나타난다. 게이트가 필요한 이유가 여기에 있다.
정리
컨테이너를 무인으로 업데이트하고, 실패하면 사람 없이 이전 상태로 되돌리는 OTA v0를 실제 Jetson 보드에서 검증했다. running과 health 두 게이트, 그리고 미리 기록한 rollback-point가 그 안전장치다.
이 v0가 다루는 범위는 컨테이너 층까지다. OS 전체를 A/B로 바꾸는 무중단 업데이트와, 서명·인증을 갖춘 배포는 다음 단계로 남겼다. 다음 편에서는 이 OS 위에서 실제로 도는 AI 워크로드, 회의록을 받아쓰는 음성인식을 얹는다.
참고 자료
- Docker, Dockerfile HEALTHCHECK 레퍼런스
- systemd, systemd.service 매뉴얼
- Docker, Registry(
registry:2) 이미지 - 자체 실측(2026년 7월):
edge-ota-updatejournald 로그 · 4개 시나리오 결과 매트릭스
이 글은 바이코드가 Jetson 기반 양산용 Edge OS를 만드는 과정을 공개하는 개발기 시리즈의 네 번째 편입니다.