Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

VirtualizationService

VirtualizationService quản lý tất cả các máy ảo khách, được bảo vệ hoặc cách khác, chạy trên hệ thống Android, chủ yếu bằng cách quản lý các phiên bản của crosvm. VirtualizationService tiết lộ 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 các máy ảo.

API AIDL

VirtualizationService tiết lộ một API AIDL mà khách hàng có thể sử dụng để cung cấp hình ảnh và khởi động một máy ảo. Mô tả này có thể là một cấu hình VM thô với các bộ mô tả tệp cho bộ nạp khởi động hoặc hạt nhân và các ảnh đĩa khác nhau để đưa vào máy ảo hoặc cấu hình Microdroid trong đó máy khách chỉ cung cấp tải trọng và máy ảo được khởi động với cơ sở hạ tầng và hạt nhân Microdroid tiêu chuẩn . VirtualizationService sau đó trả về một đối tượng IVirtualMachine Binder đại diện cho VM. Máy khách đã khởi động VM có thể chọn chia sẻ đối tượng Binder với các quy trình khác, sử dụng các cơ chế Binder thông thường.

IVirtualMachine có các phương thức AIDL để lấy thông tin về máy ảo, chẳng hạn như CID, có thể được sử dụng để giao tiếp với nó qua vsock và cũng cho phép đăng ký gọi lại khi máy ảo dừng. Trong trường hợp máy ảo IVirtualMachine , đối tượng IVirtualMachine cũng có thể được sử dụng để thiết lập kết nối Binder với máy ảo.

Vòng đời máy ảo

Quyền truy cập vào một máy ảo được theo dõi bởi đối tượng IVirtualMachine . Miễn là có ít nhất một tham chiếu đến đối tượng IVirtualMachine thì máy ảo tiếp tục chạy (trừ khi nó bị treo hoặc tắt theo cách riêng của nó). Nếu tất cả các tham chiếu đến đối tượng IVirtualMachine bị loại bỏ trước khi máy ảo tắt, thì VirtualizationService sẽ tự động tắt máy ảo. Quá trình này ngụ ý rằng nếu máy khách đã khởi động máy ảo bị đóng bởi bộ tiêu diệt bộ nhớ thấp, thì máy ảo cũng bị tắt, do đó ngăn chặn rò rỉ tài nguyên.

Mỗi máy ảo được quản lý bởi phiên bản crosvm của riêng nó, VirtualizationService lần lượt quản lý thay mặt máy khách. VirtualizationService khởi động các quy trình con crosvm này theo yêu cầu và chuyển chúng các bộ mô tả tệp cho các hình ảnh mà máy ảo cần. VirtualizationService sau đó sẽ giám sát tiến trình con khi chúng chết, vì vậy nó có thể thông báo cho bất kỳ ứng dụng khách nào còn lại tương ứng.

Bao bì VM

crosvm hỗ trợ hai cách khởi động máy ảo khác nhau: cung cấp nhân và initrd hoặc cung cấp bộ nạp khởi động. Trong cả hai trường hợp, một số lượng ảnh đĩa tùy ý cũng có thể được cung cấp, có thể là ảnh thô hoặc tổng hợp của một số phân vùng. Các hình ảnh khác nhau được khách hàng cung cấp dưới dạng bộ mô tả tệp.

VirtualizationService xây dựng 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 các tệp hình ảnh phân vùng khác nhau tạo nên đĩa, được máy khách chuyển qua và có thể không truy cập trực tiếp được bằng crosvm. Để giải quyết vấn đề này, VirtualizationService đảm bảo rằng số bộ mô tả tệp được crosvm kế thừa giống với số bộ mô tả tệp mà VirtualizationService đã sử 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 để đại diện cho mỗi tệp phân vùng.

Đối với các pVM của Microdroid, AVF bao gồm một bộ nạp khởi động, bộ nạp này sẽ tải hạt nhân từ một phân vùng của ả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 VM (vsock)

Giao diện chính để giao tiếp giữa các pVM là vsock, một giao diện socket virtio tiêu chuẩn. Mỗi máy ảo được xác định bằng mã định danh ngữ cảnh (CID) 32-bit, tương tự như địa chỉ IP, VirtualizationService sẽ gán cho máy ảo khi máy ảo được tạ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 kết thúc và tất cả các xử lý của IVirtualMachine Binder đối với 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 một nhà phát triển khởi động một máy ảo từ trình bao, xem nhật ký của nó và kết thúc máy ảo. Lệnh vm cũng bao gồm một tùy chọn để liệt kê các máy ảo hiện đang chạy, bao gồm trạng thái của chúng và các quy trình liên quan. Tùy chọn này được triển khai như một phương thức bổ sung trên VirtualizationService AIDL API, để tránh lạm dụng, chỉ người dùng shell mới có thể được gọi.

AVF cũng bao gồm hỗ trợ chuyển tiếp kết nối adb qua vsock, để cung cấp quyền truy cập adb vào các máy ảo khách. Ví dụ: đối với một máy ảo Microdroid có CID 10 chạy adbd trên cổng 5555, nhà phát triển có thể lấy một trình bao trong máy ảo Microdroid từ máy trạm của họ bằng các lệnh sau:

    $ adb forward tcp:8000 vsock:10:5555
    $ adb connect localhost:8000
    $ adb -s localhost:8000 shell

Chuyển tiếp kết nối adb qua vsock chỉ khả dụng cho các máy ảo đang chạy ở chế độ gỡ lỗi.