บริการระบบเสมือนจริง

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