TL;DR

  • ARM64js는 Rust로 작성하고 WebAssembly로 컴파일한 ARMv8-A 에뮬레이터로, 브라우저에서 실제 Alpine Linux를 부팅함.
  • 웹페이지에서 리눅스 프로그램을 실행하려는 목표에 따라 커널과 바이너리를 포함한 Alpine 환경을 제공하며 apk로 소프트웨어를 설치하고 Docker도 실행 가능함.
  • 여러 웹 워커가 가상 머신(VM)의 램을 공유하며, 가상 CPU마다 워커를 하나씩 할당하는 다중 vCPU를 지원하지만 대체로 공유 메모리 성능 저하로 실행이 느려짐.
  • 패키지 다운로드용 CORS 프록시, WebSocket-to-TCP 프록시, 브라우저 로컬 저장소 기반 스냅샷 기능을 갖춤.
  • 스냅샷에서 셸까지 부팅하는 데 50Mbit/s 연결에서 2.5초, 다운로드가 없으면 1.3초가 걸리며, 셸 입력 지연은 8ms, vim 입력 지연은 37ms임.

ARM64js 소개

  • 웹페이지가 수십 개의 의존성을 불러와 슬라이드 쇼와 가격표를 보여주는 상황에서, 새 터미널 사용자 인터페이스(TUI)나 명령줄 인터페이스(CLI) 앱을 시험하려면 brew로 설치하거나 cargo를 사용한 뒤 마음에 들지 않아도 제거를 잊지 말아야 하는 점이 불편함.
  • 40MB짜리 랜딩 페이지를 실행할 수 있는 브라우저라면 4MB짜리 리눅스 프로그램도 실행할 수 있지 않을까 하는 궁금증과 시스템 프로그래밍에 대한 관심이 하드웨어 에뮬레이터 개발로 이어짐.
  • ARM64js는 Rust로 작성하고 WebAssembly로 컴파일한 ARMv8-A 에뮬레이터임.
  • 실제 커널과 바이너리를 포함하는 Alpine Linux를 웹페이지 안에서 부팅함. 일부 조정된 환경이지만 실제 Alpine Linux이며, 일반적인 Alpine처럼 apk 실행과 소프트웨어 설치가 가능하고 Docker도 실행 가능함. 다만 가상화가 겹치는 환경의 성능에는 큰 기대를 걸기 어려움.
  • ARM을 선택한 이유는 명령어 크기가 같고 동작이 더 예측 가능해 에뮬레이션과 파싱이 더 쉽기 때문임.
  • 게시 날짜는 2026년 9월 29일임.

작동 방식

  • 하나의 WebAssembly 모듈을 여러 웹 워커에 로드하며, 워커들은 하나의 메모리 블록을 공유함. 이 메모리가 가상 머신의 램 역할을 함.
  • 여러 vCPU를 지원하며 가상 CPU마다 워커 하나를 사용함. 다중 vCPU가 유용한 경우는 드물고, 공유 메모리의 속도가 느려져 전반적으로 실행이 더 느려지는 경우가 많음.
  • 브라우저 환경에 맞춰 세 가지 문제를 해결함.
  • 패키지 설치와 CORS: 브라우저 탭은 CORS 헤더를 보내지 않는 서버에서 데이터를 가져올 수 없음. Alpine의 apk 미러는 CORS 헤더를 제공하지 않으므로, 자체 저장소를 호스팅하지 않고 이 제한을 보완하는 작은 프록시를 마련함.
  • 인터넷 접속: WebAssembly는 TCP 연결을 열 수 없어 WebSocket과 TCP를 연결하는 프록시를 별도로 마련함.
  • 페이지 새로고침과 VM 상태: 페이지를 새로고침하면 VM 상태가 사라지므로, 현재 상태를 로컬에 저장하고 다음 방문이나 새로고침 뒤 복구하는 스냅샷 기능을 기본 제공함. 스냅샷은 브라우저 로컬 저장소에 저장됨.

성능

  • 에뮬레이션 수준을 고려하면 성능은 양호한 편임.
  • 스냅샷에서 셸까지 부팅하는 시간은 50Mbit/s 연결에서 2.5초, 다운로드가 없으면 1.3초임.
  • 셸에서의 입력 지연은 8ms, vim에서의 입력 지연은 37ms임.
  • 전반적인 체감 성능은 2000년대의 오래된 PC와 비슷함. Rust 앱을 컴파일하기에는 적합하지 않지만, 일부 TUI 앱과 Go 서버를 실행할 수 있으며 Python과 PHP도 무난하게 작동함.

활용 방법

  • ARM64JS SDK는 프런트엔드 앱에서 VM을 생성·설정하고 스냅샷으로 저장하는 프로그래밍 인터페이스임.
  • README에서 자세한 내용을 확인할 수 있으며, 몇 줄의 코드로 VM 실행이 가능함.
  • SDK가 어떤 WebAssembly 모듈을 어떻게 불러올지 처리하므로 시작 과정이 간편함.
  • 예시 코드는 Alpine VM을 부팅하고 uname -a 명령을 실행한 뒤 출력과 종료 코드를 가져오는 흐름임.
  • Demoshell은 ARM64js를 바탕으로 한 제품 시도임. 코드를 작성하지 않고 CLI 또는 TUI 앱의 VM이나 안내형 데모를 만들고 싶은 경우를 대상으로 함.
  • 무료 요금제가 있으며 오픈소스 소프트웨어(OSS) 프로젝트에는 무료로 제공됨.
  • 자세한 기술 정보와 사전 구성 VM 체험은 arm64js.com에서 확인할 수 있으며, 문의 이메일은 info[at]arm64js.com이고 Discord에서도 대화할 수 있음.