VirtualizationService

VirtualizationService จัดการ VM ของแขกรับเชิญหลายรายการ ไม่ว่าจะได้รับการปกป้องหรือไม่ก็ตาม ซึ่งทำงานบนระบบ Android โดยหลักๆ คือการจัดการอินสแตนซ์ของ crosvm VirtualizationService แสดง AIDL API ซึ่งบริการหรือแอปของระบบสามารถ ใช้เพื่อเริ่ม ตรวจสอบ และหยุด VM หากต้องการใช้ VirtualizationService ให้เรียกใช้ virtmgr โดยตรง หรือนำเข้า javalib หรือ rustlib ซึ่งจะเรียกใช้ virtmgr เป็น กระบวนการย่อย

วงจรการใช้งาน VM

ระบบจะติดตามการเข้าถึง VM โดยใช้ออบเจ็กต์ IVirtualMachine ตราบใดที่มีการอ้างอิงถึงIVirtualMachineออบเจ็กต์อย่างน้อย 1 รายการ VM จะทำงานต่อไป (เว้นแต่จะขัดข้องหรือปิดตัวลงเอง) หากมีการทิ้งการอ้างอิงทั้งหมดไปยังออบเจ็กต์ IVirtualMachineก่อนที่ VM จะปิดลง VirtualizationServiceจะปิด VM โดยอัตโนมัติ กระบวนการนี้หมายความว่า หากไคลเอ็นต์ที่เริ่ม VM ถูกปิดโดย Low Memory Killer VM ก็จะถูกปิดด้วย ซึ่งจะป้องกันไม่ให้เกิดการรั่วไหลของทรัพยากร

VM แต่ละรายการได้รับการจัดการโดยอินสแตนซ์ crosvm ของตัวเอง ซึ่งVirtualizationService จะจัดการในนามของไคลเอ็นต์ VirtualizationService ใน virtmgr จะเริ่มกระบวนการย่อย crosvm เหล่านี้ตามที่จำเป็นด้วยทรัพยากรส่วนกลางที่จัดสรร รวมถึง CID ที่ VirtualizationServiceInternal มอบให้ใน virtualizationservice และส่งตัวอธิบายไฟล์สำหรับอิมเมจที่ VM ต้องการ VirtualizationService จากนั้นจะตรวจสอบกระบวนการของบุตรหลานเมื่อกระบวนการสิ้นสุดลง เพื่อให้แจ้งเตือนไคลเอ็นต์ที่เหลือได้ตามนั้น

การแพ็กเกจ VM

crosvm รองรับการบูต VM 2 วิธีที่แตกต่างกัน ได้แก่ การระบุเคอร์เนลและ initrd หรือการระบุโปรแกรมโหลดบูต ไม่ว่าจะในกรณีใด คุณก็ระบุอิมเมจดิสก์จำนวนเท่าใดก็ได้ ซึ่งอาจเป็น อิมเมจดิสก์ดิบหรืออิมเมจดิสก์ที่ประกอบด้วยพาร์ติชันหลายรายการ รูปภาพต่างๆ ไคลเอ็นต์เป็นผู้ระบุเป็นตัวอธิบายไฟล์

VirtualizationService สร้างอิมเมจดิสก์แบบคอมโพสิตตามต้องการ กระบวนการนี้จำเป็นเนื่องจากไฟล์ดิสก์คอมโพสิตอ้างอิงภายในไปยังไฟล์อิมเมจพาร์ติชันต่างๆ ที่ประกอบดิสก์ ซึ่งไคลเอ็นต์ส่งผ่านและ crosvm อาจเข้าถึงโดยตรงไม่ได้ วิธีแก้ปัญหานี้คือ VirtualizationService ตรวจสอบว่าหมายเลขตัวบอกไฟล์ที่สืบทอดมาจาก crosvm เหมือนกับหมายเลขตัวบอกไฟล์ที่ VirtualizationService ใช้ในการสร้างรูปภาพคอมโพสิต อิมเมจดิสก์แบบคอมโพสิตใช้ชื่อไฟล์ ในรูปแบบ /proc/self/fd/N เพื่อแสดงไฟล์พาร์ติชันแต่ละไฟล์

สำหรับ pVM ของ Microdroid นั้น AVF จะมี Bootloader ซึ่งโหลดเคอร์เนลจากพาร์ติชันของอิมเมจดิสก์แบบคอมโพสิตตามขั้นตอนการเปิดเครื่องที่ได้รับการยืนยันของ Android มาตรฐาน

ซ็อกเก็ต VM (vsock)

อินเทอร์เฟซหลักสำหรับการสื่อสารระหว่าง pVM คือ vsock ซึ่งเป็นอินเทอร์เฟซซ็อกเก็ต virtio มาตรฐาน VM แต่ละรายการจะระบุด้วยตัวระบุบริบท (CID) ขนาด 32 บิต ซึ่งคล้ายกับที่อยู่ IP ซึ่ง VirtualizationServiceInternalกำหนดให้กับ VM เมื่อ VirtualizationService สร้าง VM และสามารถเปิดเผยบริการในหมายเลขพอร์ตใดก็ได้ที่ VM เลือก CID จะไม่ซ้ำกันขณะที่ VM ทำงาน แต่สามารถนำค่า CID กลับมาใช้ใหม่ได้ เมื่อ VM สิ้นสุดการทำงานและมีการทิ้งแฮนเดิล Binder ทั้งหมดของ IVirtualMachine ไปยัง VM

อินเทอร์เฟซการแก้ไขข้อบกพร่อง

คำสั่ง vm มีไว้เพื่อการแก้ไขข้อบกพร่อง คำสั่งนี้ช่วยให้นักพัฒนาแอป เริ่ม VM จากเชลล์ ดูบันทึก และสิ้นสุด VM ได้ เมื่อใช้คำสั่ง vm หรืออินเทอร์เฟซอื่นๆ ที่ AVF จัดเตรียมไว้ VM จะเริ่มทำงานในโหมดที่แก้ไขข้อบกพร่องได้ (FULL) หรือโหมดที่แก้ไขข้อบกพร่องไม่ได้ (NONE) VM ที่แก้ไขข้อบกพร่องได้ช่วยให้คุณ ดูบันทึกระดับระบบปฏิบัติการ เข้าถึงเชลล์ ADB และบันทึกการทิ้งข้อมูลเมื่อเกิดข้อขัดข้องหรือเพย์โหลดของแอปได้ ขอแนะนำให้ใช้ VM ที่ดีบักไม่ได้ในสภาพแวดล้อมการใช้งานจริง ดูข้อมูลเพิ่มเติมเกี่ยวกับ เครื่องมือบรรทัดคำสั่งและอินเทอร์เฟซการแก้ไขข้อบกพร่องอื่นๆ ที่ AVF มีให้ได้ที่ debug/README.md