Show GN: Android arm64에서 proot 병목을 줄이기 위해 ptrace 없는 proroot를 만들어봤습니다
(github.com/coderredlab)안녕하세요.
Android에서 Ubuntu arm64 사용자 공간을 올려 사용하는 프로젝트를 진행하면서, 가장 큰 병목은 역시 proot의 ptrace 오버헤드였습니다. 특히 Node.js나 Chromium 같은 워크로드에서는 syscall마다 발생하는 context switch 비용이 꽤 크게 느껴졌습니다.
그래서 proot와 비슷한 방향성을 가지되 ptrace 없이 동작하는 proroot를 만들어보고 있습니다. 목표는 root 없이 경로 변환과 실행 환경 격리를 제공하면서도, syscall interception을 프로세스 내부에서 처리해 오버헤드를 줄이는 것입니다.
현재는 LD_PRELOAD와 바이너리 패칭을 조합하는 방식으로 구현하고 있고, arm64 환경에서 아래 항목들을 테스트했습니다.
- Node.js 24 / npm
- Python 3.12
- Git 2.43
- curl, jq, OpenSSL
- Chromium headless_shell 131 (Playwright)
구현은 대략 아래 방식입니다.
- glibc 함수(openat, stat, execve, dlopen 등)에 대한 PLT interception
- 로드 시점 ELF 스캔 후 syscall 지점을 trampoline 호출로 패칭
- Android seccomp quirks 및 Chrome 호환성을 위한 signal handler 보완
사용 방식은 proot와 최대한 비슷하게 맞추고 있어서, 현재는 -r, -w, --link2symlink 같은 CLI 플래그를 그대로 사용할 수 있습니다.
아직은 arm64 전용이고, 전체 소스 공개 전에는 조금 더 테스트와 안정화가 필요해 당분간은 바이너리 형태로만 배포하고 있습니다. 반쯤 정리되지 않은 코드를 먼저 공개하기보다, 실제 워크로드에서 호환성과 안정성을 조금 더 검증한 뒤 정리해서 공개하는 쪽이 낫다고 판단했습니다.
Android에서 proot 성능 때문에 비슷한 고민을 해보신 분들이 있다면 의견이나 피드백 부탁드립니다.