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",