VirtualizationService
จัดการ VM ผู้ใช้หลายราย ไม่ว่าจะได้รับการปกป้องหรือไม่ก็ตาม ที่ทำงานในระบบ Android โดยจัดการอินสแตนซ์ของ crosvm เป็นส่วนใหญ่
VirtualizationService
แสดง AIDL API ซึ่งบริการหรือแอปของระบบสามารถใช้เพื่อเริ่ม ตรวจสอบ และหยุด VM หากต้องการใช้ VirtualizationService
ให้เรียกใช้ virtmgr
โดยตรงหรือนําเข้า javalib หรือ rustlib ซึ่งจะเรียกใช้ virtmgr
เป็นกระบวนการย่อย
วงจรของ VM
ระบบจะติดตามการเข้าถึง VM โดยออบเจ็กต์ IVirtualMachine
ตราบใดที่มีการอ้างอิงออบเจ็กต์ IVirtualMachine
อย่างน้อย 1 รายการ VM จะยังคงทำงานต่อไป (เว้นแต่จะขัดข้องหรือปิดเอง) หากระบบทิ้งการอ้างอิงถึงออบเจ็กต์ IVirtualMachine
ทั้งหมดก่อนที่ VM จะปิดลง VirtualizationService
จะปิด VM โดยอัตโนมัติ กระบวนการนี้หมายความว่าหากระบบปิดไคลเอ็นต์ที่เริ่มต้น VM ไว้ โปรแกรมก็จะปิด VM ด้วย เพื่อป้องกันการรั่วไหลของทรัพยากร
VM แต่ละรายการได้รับการจัดการโดยอินสแตนซ์ crosvm ของตนเอง ซึ่ง VirtualizationService
จะจัดการในนามของลูกค้า VirtualizationService
ใน virtmgr
จะเริ่มกระบวนการย่อย crosvm เหล่านี้ตามที่จำเป็นด้วยทรัพยากรส่วนกลางที่จัดสรรไว้ รวมถึง CID ที่ VirtualizationServiceInternal
ใน virtualizationservice
มอบให้ และส่งตัวบ่งชี้ไฟล์สำหรับอิมเมจที่ VM ต้องการ จากนั้น VirtualizationService
จะคอยตรวจสอบกระบวนการย่อยว่าตายเมื่อใด
เพื่อที่จะแจ้งให้ไคลเอ็นต์ที่เหลือทราบ
การจัดแพ็กเกจ VM
crosvm รองรับการบูต VM ได้ 2 วิธี ได้แก่ ระบุเคอร์เนลและ initrd หรือระบุบูตโหลดเดอร์ แต่ทั้ง 2 กรณี คุณจะระบุจำนวนอิมเมจดิสก์ที่กำหนดเองได้ ซึ่งอาจเป็นได้ทั้งอิมเมจดิบหรือการผสมระหว่างหลายพาร์ติชัน ไคลเอ็นต์ได้รูปภาพต่างๆ ไว้เป็นข้อบ่งชี้ไฟล์
VirtualizationService
สร้างอิมเมจดิสก์แบบคอมโพสิตตามคําขอ ขั้นตอนนี้จําเป็นเนื่องจากไฟล์ดิสก์คอมโพสิตจะอ้างอิงไฟล์ภาพพาร์ติชันต่างๆ ที่ประกอบกันเป็นดิสก์ ซึ่งไคลเอ็นต์ส่งผ่านและ crosvm อาจเข้าถึงโดยตรงไม่ได้ วิธีแก้ปัญหานี้คือการที่ VirtualizationService
ตรวจสอบว่าหมายเลขตัวระบุไฟล์ที่ crosvm รับช่วงมานั้นเหมือนกับหมายเลขตัวระบุไฟล์ที่ VirtualizationService
ใช้ในการสร้างรูปภาพคอมโพสิต อิมเมจดิสก์ผสมใช้ชื่อไฟล์ในแบบฟอร์มเป็น /proc/self/fd/N
เพื่อแสดงไฟล์พาร์ติชันแต่ละไฟล์
สำหรับ pVM ของ Microdroid นั้น AVF จะมี Bootloader ซึ่งจะโหลดเคอร์เนลจากพาร์ติชันของอิมเมจดิสก์คอมโพสิตตามขั้นตอนการบูตที่ผ่านการรับรองมาตรฐานของ Android
ซ็อกเก็ต VM (vsock)
อินเทอร์เฟซหลักสำหรับการสื่อสารระหว่าง pVM คือ vsock ซึ่งเป็นอินเทอร์เฟซซ็อกเก็ต virtio มาตรฐาน VM แต่ละรายการจะระบุด้วยตัวระบุบริบท 32 บิต (CID) ซึ่งคล้ายกับที่อยู่ IP ที่ VirtualizationServiceInternal
กำหนดให้กับ VM เมื่อ VirtualizationService
สร้าง VM และสามารถแสดงบริการในหมายเลขพอร์ตที่ VM เลือก
โดย CID จะเป็นค่าที่ไม่ซ้ำกันขณะที่ VM ทำงานอยู่ แต่ระบบจะนำค่า CID มาใช้ซ้ำได้เมื่อ VM สิ้นสุดการทำงานและมีการยกเลิกIVirtualMachine
แฮนเดิล Binder ทั้งหมดไปยัง VM
อินเทอร์เฟซการแก้ไขข้อบกพร่อง
คำสั่ง vm
มีไว้เพื่อแก้ไขข้อบกพร่อง คำสั่งนี้จะช่วยให้นักพัฒนาซอฟต์แวร์เริ่ม VM จาก Shell ดูบันทึก และสิ้นสุด VM ได้ เมื่อใช้vm
คำสั่งหรืออินเทอร์เฟซอื่นๆ ที่ AVF มีให้ VM จะเริ่มต้นในโหมดแก้ไขข้อบกพร่องได้ (FULL) หรือแก้ไขข้อบกพร่องไม่ได้ (NONE) เมื่อใช้ VM ที่แก้ไขข้อบกพร่องได้ คุณจะดูบันทึกระดับระบบปฏิบัติการ เข้าถึงเชลล์ ADB และบันทึก Crash Dump หรือเพย์โหลดของแอปได้
ขอแนะนําให้ใช้ VM ที่แก้ไขข้อบกพร่องไม่ได้ในเวอร์ชันที่ใช้งานจริง ดูข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือบรรทัดคำสั่งและอินเทอร์เฟซการแก้ไขข้อบกพร่องอื่นๆ ที่ AVF มีให้บริการได้ที่ debug/README.md