สวัสดีครับ

ระหว่างทำโปรเจ็กต์ที่รัน 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_shell 131 (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 รบกวนช่วยแสดงความคิดเห็นหรือให้ฟีดแบ็กได้เลยครับ

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น