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の性能のために同じような悩みを持ったことがある方がいれば、ご意見やフィードバックをお願いします。
まだコメントはありません。