VirtualizationService
quản lý nhiều máy ảo khách, được bảo vệ hoặc không, chạy trên hệ thống Android, chủ yếu bằng cách quản lý các thực thể của crosvm.
VirtualizationService
hiển thị một API AIDL mà các dịch vụ hoặc ứng dụng hệ thống có thể sử dụng để khởi động, giám sát và dừng máy ảo. Để sử dụng VirtualizationService
, hãy thực thi trực tiếp virtmgr
hoặc nhập javalib hoặc rustlib để thực thi virtmgr
dưới dạng một quy trình con.
Vòng đời của máy ảo
Đối tượng IVirtualMachine
theo dõi quyền truy cập vào máy ảo. Chỉ cần có ít nhất một tham chiếu đến đối tượng IVirtualMachine
, thì máy ảo sẽ tiếp tục chạy (trừ phi máy ảo đó gặp sự cố hoặc tắt theo cách riêng). Nếu tất cả các tệp tham chiếu đến đối tượng IVirtualMachine
bị xoá trước khi máy ảo tắt, thì VirtualizationService
sẽ tự động tắt máy ảo. Quy trình này ngụ ý rằng nếu máy khách đã khởi động máy ảo bị tắt bởi trình tắt bộ nhớ thấp, thì máy ảo cũng sẽ được tắt, do đó ngăn chặn việc rò rỉ tài nguyên.
Mỗi máy ảo được quản lý bởi một thực thể crosvm riêng, VirtualizationService
sẽ thay mặt ứng dụng quản lý các thực thể này. VirtualizationService
trong virtmgr
bắt đầu các quy trình con crosvm này theo yêu cầu với các tài nguyên chung được phân bổ, bao gồm cả mã khách hàng do VirtualizationServiceInternal
cấp trong virtualizationservice
, đồng thời chuyển các mã mô tả tệp cho hình ảnh mà máy ảo cần. Sau đó, VirtualizationService
theo dõi tiến trình con để biết thời điểm chúng chết để có thể thông báo cho mọi ứng dụng còn lại một cách phù hợp.
Đóng gói máy ảo
crosvm hỗ trợ hai cách khởi động máy ảo: cung cấp hạt nhân và initrd hoặc cung cấp trình tải khởi động. Trong cả hai trường hợp, bạn cũng có thể cung cấp số lượng hình ảnh ổ đĩa tuỳ ý. Hình ảnh này có thể là hình ảnh thô hoặc hình ảnh tổng hợp của một số phân vùng. Nhiều hình ảnh do ứng dụng cung cấp dưới dạng chỉ số mô tả tệp.
VirtualizationService
tạo hình ảnh đĩa tổng hợp theo yêu cầu. Quá trình này là cần thiết vì tệp ổ đĩa tổng hợp tham chiếu nội bộ đến nhiều tệp hình ảnh phân vùng tạo nên ổ đĩa, được ứng dụng truyền và crosvm có thể không truy cập trực tiếp được. Để giải quyết vấn đề này, VirtualizationService
đảm bảo rằng số chỉ số mô tả tệp mà crosvm kế thừa giống với số chỉ số mô tả tệp mà VirtualizationService
dùng để tạo hình ảnh tổng hợp. Hình ảnh đĩa tổng hợp sử dụng tên tệp ở dạng /proc/self/fd/N
để biểu thị từng tệp phân vùng.
Đối với các pVM Microdroid, AVF bao gồm một trình tải khởi động, trình này tải hạt nhân từ một phân vùng của hình ảnh đĩa tổng hợp, tuân theo quy trình Khởi động được xác minh của Android tiêu chuẩn.
Ổ cắm máy ảo (vsock)
Giao diện chính để giao tiếp giữa các pVM là vsock, một giao diện ổ cắm virtio tiêu chuẩn. Mỗi máy ảo được xác định bằng một giá trị nhận dạng ngữ cảnh 32 bit (CID), tương tự như địa chỉ IP mà VirtualizationServiceInternal
chỉ định cho máy ảo khi VirtualizationService
tạo máy ảo và có thể hiển thị các dịch vụ trên bất kỳ số cổng nào mà máy ảo chọn.
CID là duy nhất trong khi máy ảo đang chạy, nhưng giá trị CID có thể được tái chế khi máy ảo bị chấm dứt và tất cả các tay cầm liên kết IVirtualMachine
đến máy ảo đã bị loại bỏ.
Giao diện gỡ lỗi
Lệnh vm
được cung cấp cho mục đích gỡ lỗi. Lệnh này cho phép nhà phát triển khởi động máy ảo từ shell, xem nhật ký của máy ảo và chấm dứt máy ảo. Với lệnh vm
hoặc các giao diện khác do AVF cung cấp, máy ảo có thể khởi động ở chế độ có thể gỡ lỗi (FULL) hoặc không thể gỡ lỗi (NONE). Với máy ảo có thể gỡ lỗi, bạn có thể xem nhật ký ở cấp hệ điều hành, truy cập vào shell ADB và ghi lại tệp báo lỗi hoặc tải trọng ứng dụng.
Bạn nên sử dụng máy ảo không gỡ lỗi trong môi trường sản xuất. Để biết thêm về công cụ dòng lệnh và các giao diện gỡ lỗi khác mà AVF cung cấp, hãy xem debug/README.md.