클로드 코드(Claude Code)를 사용해 PinePhone용 운영체제(OS)를 커널부터 직접 만들다
요약
작성자는 임베디드 장치인 PinePhone의 성능 개선을 위해 커널부터 직접 펌웨어를 구축했습니다. 이 과정에서 Buildroot와 메인라인 커널 위에서 작동하는 단일 LVGL 프로그램으로 앱들을 재작성하고, 총 81개의 패치를 적용하여 속도와 배터리 수명을 최적화했습니다. 특히 AI 에이전트의 도움을 받아 드라이버 코드 수정 및 깊은 문제 추적이 가능했음을 강조합니다.
핵심 포인트
- OS 성능 개선을 위해 커널 레벨에서 81개의 패치를 적용함.
- AI 에이전트를 활용하여 복잡한 드라이버 코드의 변경점을 찾아냄.
- 테스트 우선(test first) 원칙에 따라 1,892개 헤드리스 테스트를 수행함.
- A/B 업데이트 방식과 롤백 기능으로 시스템 안정성을 확보함.
몇 년 전에 PinePhone을 구매했는데, 모든 앱이 너무 느리게 로딩되어 서랍 속에 넣어두기만 했습니다. 저는 임베디드 분야에서 일하기 때문에 이를 작은 데스크톱보다는 임베디드 장치로 취급했고, Claude Code를 이용해 이 기기에 맞는 펌웨어(firmware)를 구축했습니다. 이 펌웨어는 통화, SMS, 연락처, 메모, 음악 및 카메라 기능을 포함하며, ePub 리더, 지도, Telegram 클라이언트, Doom 에뮬레이터, Genesis 에뮬레이터를 제공합니다. 모든 앱은 처음부터 직접 작성되었습니다. 이는 Buildroot와 메인라인 커널(mainline kernel) 위에서 작동하는 단일 LVGL 프로그램이며 화면에 바로 그려지며, 대부분의 화면이 디스플레이의 최대 66 FPS로 구동됩니다. 실제 PinePhone 없이 브라우저에서도 시도해 볼 수 있습니다: eliandoran.github.io/PinePhone/ (같은 UI를 WebAssembly로 컴파일한 버전입니다). 앱 계층 아래로 내려가 보겠습니다. 속도와 배터리 수명은 주로 그 밑에 깔린 부분을 패치함으로써 개선되었습니다. 총 81개의 패치가 있었고, 이 프로젝트만을 위해 작성된 것이 72개였습니다. Linux(46): USB 및 USB-C, 카메라, 충전, 디바이스 트리(device tree), 그리고 통화나 SMS로 인한 깊은 절전 모드(deep sleep) 해제 기능입니다. LVGL(23): 주로 Mali-400 GPU에서 OpenGL ES 렌더러를 빠르게 만드는 데 중점을 두었습니다. 나머지는 HTML 엔진과 빌드를 위한 것입니다. 일반적인 개발 루프는 다음과 같았습니다: 휴대폰에서 프로파일링을 수행하고, 가설을 세우고, 패치한 다음, 재빌드하여 플래싱하고, 다시 측정하는 과정이었습니다. 가장 어려웠던 부분은 C 코드를 작성하는 것이 아니었습니다. 드라이버 코드와 로그를 읽으며 변경해야 할 단 하나의 라인을 찾는 시간이 가장 힘들었고, 이때 지치지 않고 추적해 주는 에이전트가 큰 도움이 되었습니다. 저는 주로 Opus 5.5를 중간 정도의 노력으로 사용했고, 최근에는 VoLTE 디버깅과 같은 깊은 문제들을 해결하기 위해 Fable 5.2를 사용했습니다. 에이전트가 휴대폰에 플래싱하는 것을 안전하게 만드는 것이 중요합니다. 업데이트는 A/B 방식이라서 홈 화면에 도달하지 못하면 스스로 롤백됩니다. 이것이 제가 Claude에게 자체적으로 빌드하고 플래시하도록 맡긴 이유입니다. 하지만 어떤 것도 휴대폰에 도달하기 전에, 제 PC에서 테스트 스위트가 실행됩니다: 사용자가 하는 것처럼 전체 UI를 헤드리스(headless)로 구동하는 1,892개의 테스트가 진행됩니다. 모뎀, Wi-Fi, 블루투스, 사운드 및 카메라는 가짜 장치(fakes)로 대체됩니다. 테스트는 정제기(sanitizers) 하에서 실행되며, 메모리 누수(memory leak)가 발생하면 실패합니다.
원칙은 '테스트 우선(test first)'입니다. 버그가 수정되기 전에 실패하는 테스트 케이스를 거치게 되며, 이는 자신만만하지만 잘못된 수정까지 잡아냅니다. (외부 앱 코드는 99%의 라인 커버리지(line coverage)를 달성했습니다.) 문제가 발생했던 부분은 이렇습니다. 초기에 Claude는 메뉴를 무작위로 누르면서 제가 저장한 Genesis 데이터를 덮어썼습니다. 이제는 매번 터치 후에 스크린샷을 찍습니다. RAM 오버클럭킹(overclocking) 실험은 휴대폰이 멈추게 했습니다. 하지만 롤백(Rollback) 기능 덕분에 그 문제들이 완전히 고장 난 상태(brick)가 아니라 불편함 수준으로 줄었습니다. 핵심적인 측면은 제가 모든 변경 사항을 수동으로 검토하고 빠른 루프(rapid loop)를 통해 장치에서 테스트했다는 것입니다. 긴 CLAUDE.md 파일에는 각 세션이 학습한 내용이 담겨 있습니다. 즉, 패치가 존재하는 이유와 어떤 모뎀 특이점(modem quirk)이 무엇을 필요로 하는지 등입니다. 새로운 세션은 현재 상황이 왜 그런지 알고 시작합니다. GitHub: https://github.com/eliandoran/PinePhone, 제출자 /u/Elian_D [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/ClaudeAI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기