Hice un proroot sin `ptrace` para reducir el cuello de botella de proot en Android arm64
(github.com/coderredlab)Hola.
Mientras avanzaba en un proyecto para levantar y usar un espacio de usuario Ubuntu arm64 en Android, el mayor cuello de botella seguía siendo el overhead de ptrace en proot. En cargas de trabajo como Node.js o Chromium en particular, el costo de los context switch que ocurren en cada syscall se sentía bastante fuerte.
Por eso estoy desarrollando proroot, que va en una dirección similar a proot pero funciona sin ptrace. El objetivo es ofrecer traducción de rutas y aislamiento del entorno de ejecución sin requerir root, mientras se reduce el overhead procesando la interceptación de syscalls dentro del propio proceso.
Por ahora lo estoy implementando combinando LD_PRELOAD y parcheo de binarios, y en un entorno arm64 probé los siguientes elementos.
- Node.js 24 / npm
- Python 3.12
- Git 2.43
- curl, jq, OpenSSL
- Chromium
headless_shell131 (Playwright)
La implementación es, a grandes rasgos, así.
- Intercepción PLT de funciones de glibc (
openat,stat,execve,dlopen, etc.) - Después de escanear el ELF en el momento de carga, se parchean los puntos de syscall para llamar a un trampolín
- Ajustes al signal handler para quirks de seccomp en Android y compatibilidad con Chrome
La forma de uso se está manteniendo lo más parecida posible a proot, así que por ahora se pueden usar tal cual flags de CLI como -r, -w y --link2symlink.
Todavía es solo para arm64, y antes de publicar todo el código fuente necesito un poco más de pruebas y estabilización, así que por el momento lo estoy distribuyendo únicamente en forma de binario. Consideré que era mejor validar un poco más la compatibilidad y la estabilidad en cargas de trabajo reales antes de ordenar el código y publicarlo, en lugar de mostrar primero código todavía a medio organizar.
Si alguien ya pasó por preocupaciones parecidas por el rendimiento de proot en Android, agradecería mucho sus opiniones o feedback.
Aún no hay comentarios.