blob: 7923a58c0f34b4604322c4b767f6850608a7c7c3 [file] [log] [blame] [view]
# Early VM
Early VMs are specialized virtual machines that can run even before the `/data`
partition is mounted, unlike regular VMs. `early_virtmgr` is a binary that
serves as the interface for early VMs, functioning similarly to `virtmgr`,
which provides the [`IVirtualizationService`](../android/virtualizationservice/aidl/android/system/virtualizationservice/IVirtualizationService.aidl)
aidl interface.
To run an early VM, clients must follow these steps.
1) Early VMs must be defined in XML files located at
`{partition}/etc/avf/early_vms*.xml`. Schema for these files is defined in
[`early_vms.xsd`](../android/virtmgr/early_vms.xsd).
```early_vms.xml
<early_vms>
<early_vm>
<name>vm_demo_native_early</name>
<cid>123</cid>
<path>/system/bin/vm_demo_native_early</path>
</early_vm>
</early_vms>
```
In this example, the binary `/system/bin/vm_demo_native_early` can establish a
connection with `early_virtmgr` and create a VM named `vm_demo_native_early`,
which will be assigned the static CID 123.
Multiple XML files matching the glob pattern
`{partition}/etc/avf/early_vms*.xml` can be used to define early VMs.
2) The client must have the following three or four capabilities.
* `IPC_LOCK`
* `NET_BIND_SERVICE`
* `SYS_NICE`
* `SYS_RESOURCES`
Typically, the client is defined as a service in an init script, where
capabilities can also be specified.
```vm_demo_native_early.rc
service vm_demo_native_early /system/bin/vm_demo_native_early
user system
group system virtualmachine
capabilities IPC_LOCK NET_BIND_SERVICE SYS_RESOURCE SYS_NICE
oneshot
stdio_to_kmsg
class early_hal
```
3) The client forks `early_virtmgr` instead of `virtmgr`.
The remaining steps are identical to those for regular VMs: connect to
`early_virtmgr`, obtain the `IVirtualizationService` interface, then create and
run the VM.