Support composite images with QEMU.
QEMU equivalent to the crosvm support for this feature.
Bug: 133432409
Test: run_cvd -vm_manager=qemu_cli -composite_disk=composite.img
Change-Id: I19db315dbf46e18fd8c260d4108e5328b83292fe
diff --git a/host/commands/launch/flags.cc b/host/commands/launch/flags.cc
index a325d10..55afb49 100644
--- a/host/commands/launch/flags.cc
+++ b/host/commands/launch/flags.cc
@@ -335,7 +335,11 @@
if (use_ramdisk) {
FLAGS_dtb = vsoc::DefaultHostArtifactsPath("config/initrd-root.dtb");
} else {
- FLAGS_dtb = vsoc::DefaultHostArtifactsPath("config/system-root.dtb");
+ if (FLAGS_composite_disk.empty()) {
+ FLAGS_dtb = vsoc::DefaultHostArtifactsPath("config/system-root.dtb");
+ } else {
+ FLAGS_dtb = vsoc::DefaultHostArtifactsPath("config/composite-system-root.dtb");
+ }
}
}
diff --git a/host/libs/vm_manager/cf_qemu.sh b/host/libs/vm_manager/cf_qemu.sh
index f20d33d..3556303 100755
--- a/host/libs/vm_manager/cf_qemu.sh
+++ b/host/libs/vm_manager/cf_qemu.sh
@@ -100,34 +100,41 @@
-device "virtio-serial-pci,id=virtio-serial0"
)
-if [[ -n "${super_image_path}" ]]; then
+if [[ -n "${composite_disk_path}" ]]; then
args+=(
- -drive "file=${super_image_path:-${HOME}/obj/PACKAGING/super.img_intermediates/super.img},format=raw,if=none,id=drive-virtio-disk0,aio=threads"
- -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk0,id=virtio-disk0"
- )
-else
- args+=(
- -drive "file=${system_image_path:-${HOME}/system.img},format=raw,if=none,id=drive-virtio-disk0,aio=threads"
+ -drive "file=${composite_disk_path:-${HOME}/composite.img},format=raw,if=none,id=drive-virtio-disk0,aio=threads"
-device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1"
)
-fi
+else
+ if [[ -n "${super_image_path}" ]]; then
+ args+=(
+ -drive "file=${super_image_path:-${HOME}/obj/PACKAGING/super.img_intermediates/super.img},format=raw,if=none,id=drive-virtio-disk0,aio=threads"
+ -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk0,id=virtio-disk0"
+ )
+ else
+ args+=(
+ -drive "file=${system_image_path:-${HOME}/system.img},format=raw,if=none,id=drive-virtio-disk0,aio=threads"
+ -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1"
+ )
+ fi
-args+=(
- -drive "file=${data_image_path:-${HOME}/userdata.img},format=raw,if=none,id=drive-virtio-disk1,aio=threads"
- -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk1,id=virtio-disk1"
- -drive "file=${cache_image_path:-${HOME}/cache.img},format=raw,if=none,id=drive-virtio-disk2,aio=threads"
- -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk2,id=virtio-disk2"
- -drive "file=${metadata_image_path:-${HOME}/metadata.img},format=raw,if=none,id=drive-virtio-disk3,aio=threads"
- -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk3,id=virtio-disk3"
-)
-
-if [[ -z "${super_image_path}" ]]; then
args+=(
- -drive "file=${vendor_image_path:-${HOME}/vendor.img},format=raw,if=none,id=drive-virtio-disk4,aio=threads"
- -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk4,id=virtio-disk4"
- -drive "file=${product_image_path:-${HOME}/product.img},format=raw,if=none,id=drive-virtio-disk5,aio=threads"
- -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk5,id=virtio-disk5"
+ -drive "file=${data_image_path:-${HOME}/userdata.img},format=raw,if=none,id=drive-virtio-disk1,aio=threads"
+ -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk1,id=virtio-disk1"
+ -drive "file=${cache_image_path:-${HOME}/cache.img},format=raw,if=none,id=drive-virtio-disk2,aio=threads"
+ -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk2,id=virtio-disk2"
+ -drive "file=${metadata_image_path:-${HOME}/metadata.img},format=raw,if=none,id=drive-virtio-disk3,aio=threads"
+ -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk3,id=virtio-disk3"
)
+
+ if [[ -z "${super_image_path}" ]]; then
+ args+=(
+ -drive "file=${vendor_image_path:-${HOME}/vendor.img},format=raw,if=none,id=drive-virtio-disk4,aio=threads"
+ -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk4,id=virtio-disk4"
+ -drive "file=${product_image_path:-${HOME}/product.img},format=raw,if=none,id=drive-virtio-disk5,aio=threads"
+ -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk5,id=virtio-disk5"
+ )
+ fi
fi
args+=(
diff --git a/host/libs/vm_manager/qemu_manager.cpp b/host/libs/vm_manager/qemu_manager.cpp
index a9bb5cf..36deff1 100644
--- a/host/libs/vm_manager/qemu_manager.cpp
+++ b/host/libs/vm_manager/qemu_manager.cpp
@@ -37,6 +37,7 @@
#include "common/libs/utils/subprocess.h"
#include "common/libs/utils/users.h"
#include "host/libs/config/cuttlefish_config.h"
+#include "host/libs/vm_manager/disk_config.h"
namespace vm_manager {
@@ -82,6 +83,10 @@
: VmManager(config) {}
cvd::Command QemuManager::StartCommand(bool /*with_frontend*/){
+ if (should_create_composite_disk(*config_)) {
+ create_composite_disk(*config_);
+ }
+
// Set the config values in the environment
LogAndSetEnv("qemu_binary", config_->qemu_binary());
LogAndSetEnv("instance_name", config_->instance_name());
@@ -101,6 +106,7 @@
LogAndSetEnv("metadata_image_path", config_->metadata_image_path());
LogAndSetEnv("product_image_path", config_->product_image_path());
LogAndSetEnv("super_image_path", config_->super_image_path());
+ LogAndSetEnv("composite_disk_path", config_->composite_disk_path());
LogAndSetEnv("wifi_tap_name", config_->wifi_tap_name());
LogAndSetEnv("mobile_tap_name", config_->mobile_tap_name());
LogAndSetEnv("kernel_log_socket_name",