Allocate each VM an instance_id
Introduce a 64 bytes' long instance_id. When the VM is created, this is
requested from virtualization service, which randomly allocates it.
While it does that, it also logs the user & the package name.
The app persists this allocated instance_id in a file `instance_id` in
its directory for the vm instance (along with instance.img &
storage.img). When the VirtualMachine is run, this is an input into the
VM via DT.
This patch modifies Compos & vm binary to work with the instance_id.
flagging: instance_id allocation request is conditional to flag build
time flag llpvm_changes, no file `instance_id` is created if the flag is
off. `instanceId` is all 0s if the flag is off.
Bug: 291213394
Test: atest MicrodroidHostTest
Test: atest MicrodroidTests
Test: atest ComposHostTestCases
Test: Look for instance_id logged by VS
Change-Id: Ie8e25b9510e27362d4580c55c1bd557143ff7d0e
diff --git a/vm/src/run.rs b/vm/src/run.rs
index 5a4a459..57b7641 100644
--- a/vm/src/run.rs
+++ b/vm/src/run.rs
@@ -35,6 +35,7 @@
use std::fs;
use std::fs::File;
use std::io;
+use std::io::{Read, Write};
use std::os::unix::io::{AsRawFd, FromRawFd};
use std::path::{Path, PathBuf};
use vmclient::{ErrorCode, VmInstance};
@@ -84,6 +85,24 @@
)?;
}
+ let instance_id = if cfg!(llpvm_changes) {
+ let id_file = config.instance_id()?;
+ if id_file.exists() {
+ let mut id = [0u8; 64];
+ let mut instance_id_file = File::open(id_file)?;
+ instance_id_file.read_exact(&mut id)?;
+ id
+ } else {
+ let id = service.allocateInstanceId().context("Failed to allocate instance_id")?;
+ let mut instance_id_file = File::create(id_file)?;
+ instance_id_file.write_all(&id)?;
+ id
+ }
+ } else {
+ // if llpvm feature flag is disabled, instance_id is not used.
+ [0u8; 64]
+ };
+
let storage = if let Some(ref path) = config.microdroid.storage {
if !path.exists() {
command_create_partition(
@@ -153,6 +172,7 @@
idsig: idsig_fd.into(),
extraIdsigs: extra_idsig_fds,
instanceImage: open_parcel_file(&config.instance, true /* writable */)?.into(),
+ instanceId: instance_id,
encryptedStorageImage: storage,
payload,
debugLevel: config.debug.debug,
@@ -204,7 +224,7 @@
let instance_img = work_dir.join("instance.img");
println!("instance.img path: {}", instance_img.display());
- let app_config = RunAppConfig {
+ let mut app_config = RunAppConfig {
common: config.common,
debug: config.debug,
microdroid: config.microdroid,
@@ -214,6 +234,12 @@
payload_binary_name: Some("MicrodroidEmptyPayloadJniLib.so".to_owned()),
..Default::default()
};
+
+ if cfg!(llpvm_changes) {
+ app_config.set_instance_id(work_dir.join("instance_id"))?;
+ println!("instance_id file path: {}", app_config.instance_id()?.display());
+ }
+
command_run_app(app_config)
}