ผมลองสร้าง proroot แบบไม่ใช้ ptrace เพื่อลดคอขวดของ proot บน Android arm64
(github.com/coderredlab)สวัสดีครับ
ระหว่างทำโปรเจ็กต์ที่รัน user space ของ Ubuntu arm64 บน Android คอขวดที่ใหญ่ที่สุดก็ยังคงเป็น ptrace overhead ของ proot อยู่ดี โดยเฉพาะกับเวิร์กโหลดอย่าง Node.js หรือ Chromium ที่ต้นทุนของ context switch ซึ่งเกิดขึ้นทุกครั้งที่มี syscall นั้นรู้สึกได้ค่อนข้างชัด
ดังนั้นผมจึงกำลังลองสร้าง proroot ที่มีแนวทางคล้ายกับ proot แต่ทำงานโดยไม่ใช้ ptrace เป้าหมายคือให้สามารถทำ path translation และ environment isolation ได้โดยไม่ต้องใช้ root พร้อมทั้งลด overhead ด้วยการจัดการ syscall interception ภายในโปรเซสเอง
ตอนนี้กำลังพัฒนาด้วยวิธีที่ผสมระหว่าง LD_PRELOAD กับ binary patching และได้ทดสอบรายการด้านล่างบนสภาพแวดล้อม arm64 แล้ว
- Node.js 24 / npm
- Python 3.12
- Git 2.43
- curl, jq, OpenSSL
- Chromium
headless_shell131 (Playwright)
แนวทางการทำงานโดยคร่าว ๆ เป็นดังนี้
- PLT interception สำหรับฟังก์ชันของ glibc (
openat,stat,execve,dlopenฯลฯ) - สแกน ELF ตอนโหลด แล้วแพตช์จุด syscall ให้เรียกผ่าน trampoline
- ปรับปรุง signal handler เพื่อรองรับ Android seccomp quirks และความเข้ากันได้กับ Chrome
วิธีใช้งานถูกทำให้ใกล้เคียงกับ proot มากที่สุด ดังนั้นตอนนี้จึงยังใช้ CLI flags อย่าง -r, -w, --link2symlink ได้ตามเดิม
ตอนนี้ยังรองรับเฉพาะ arm64 และก่อนจะเปิดเผยซอร์สทั้งหมด ผมยังต้องการเวลาอีกหน่อยสำหรับการทดสอบและทำให้เสถียรมากขึ้น ช่วงนี้จึงยังแจกจ่ายในรูปแบบไบนารีเท่านั้น ผมคิดว่าการตรวจสอบความเข้ากันได้และความเสถียรกับเวิร์กโหลดจริงให้มากขึ้นก่อน แล้วค่อยจัดระเบียบโค้ดและเปิดเผยออกมาน่าจะดีกว่าการปล่อยโค้ดที่ยังจัดการไม่เสร็จดีออกไปก่อน
ถ้าใครเคยมีปัญหาคล้ายกันเรื่องประสิทธิภาพของ proot บน Android รบกวนช่วยแสดงความคิดเห็นหรือให้ฟีดแบ็กได้เลยครับ
ยังไม่มีความคิดเห็น