Laszlo Ersek
2022-Apr-19 15:24 UTC
[Libguestfs] [v2v PATCH 0/2] recognize SATA disks in VMX files
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1883802 Pino had added SATA disk parsing to libvirtd, for the sake of virt-v2v's VDDK and VCENTER connection URIs, in RHBZ#1883588. The second patch in this series seeks to parse SATA disks directly from VMX files ("-i vmx"), modeled after Pino's libvirtd patches, and Rich's recent NVMe disk parsing patch (see more precise references in the commit message). The first patch in the series fixes an unrelated bug in the "-i vmx" disk numbering. I discovered that bug because I didn't install a new guest with just SATA disk(s) on my ESXi server, but (out of lazyness) I added a new SATA disk to my existent Windows Server 2019 guest, which I had originally installed with a SCSI disk. Thanks, Laszlo Laszlo Ersek (2): "-i vmx -it ssh": fix non-unique "s_disk_id" input: -i vmx: Add support for SATA hard disks input/parse_domain_from_vmx.ml | 51 ++++++--- tests/test-v2v-i-vmx-7.expected | 23 ++++ tests/test-v2v-i-vmx-7.vmx | 110 ++++++++++++++++++++ tests/test-v2v-i-vmx.sh | 3 +- 4 files changed, 173 insertions(+), 14 deletions(-) create mode 100644 tests/test-v2v-i-vmx-7.expected create mode 100755 tests/test-v2v-i-vmx-7.vmx base-commit: 8643970f9791b1c90dfd6a2dd1abfc9afef1fb52 -- 2.19.1.3.g30247aa5d201
Laszlo Ersek
2022-Apr-19 15:24 UTC
[Libguestfs] [v2v PATCH 1/2] "-i vmx -it ssh": fix non-unique "s_disk_id"
The "s_disk_id" field is supposed to be unique across all fixed disks of the source domain. With "-i vmx -it ssh" however, we restart assigning "s_disk_id" from zero near the end of the "find_hdds" function. The problem is that "find_hdds" is separately called from "find_scsi_disks", "find_nvme_disks", and "find_ide_disks". Thus, if we have at least two hard disks in the source on different controller types, we'll output two disks with a zero-value "s_disk_id". "input/input_vmx.ml" starts up nbdkit with "in%d" socket names that are based on list position, not "s_disk_id", so the nbdkit invocations are correct. However, in "convert/convert.ml", the "server" argument for "g#add_drive_opts" is based on "s_disk_id"; therefore, one of the disks will be multiply referenced, and the others will be ignored. Assign "s_disk_id" in "find_disks" [input/parse_domain_from_vmx.ml] once all the disks have been found and concatenated into the common list. Note that the global sorting order remains well-defined. Both before and after this patch, the sorting occurs *within* "find_hdds", but that's OK: the concatenation order between the type-specific disk-lists is well-defined (albeit arbitrary) in "find_disks". Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1883802 Signed-off-by: Laszlo Ersek <lersek at redhat.com> --- input/parse_domain_from_vmx.ml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml index b812edeb81e2..5f5946f01a27 100644 --- a/input/parse_domain_from_vmx.ml +++ b/input/parse_domain_from_vmx.ml @@ -102,9 +102,12 @@ let remote_file_exists uri path Sys.command cmd = 0 let rec find_disks vmx vmx_source - find_scsi_disks vmx vmx_source - @ find_nvme_disks vmx vmx_source - @ find_ide_disks vmx vmx_source + (* Set the s_disk_id field to an incrementing number. *) + List.mapi + (fun i (source, filename) -> { source with s_disk_id = i }, filename) + (find_scsi_disks vmx vmx_source @ + find_nvme_disks vmx vmx_source @ + find_ide_disks vmx vmx_source) (* Find all SCSI hard disks. * @@ -209,12 +212,7 @@ and find_hdds vmx vmx_source * won't return them in any particular order. *) let hdds = List.sort compare hdds in - let hdds = List.map (fun (_, _, source, filename) -> source, filename) hdds in - - (* Set the s_disk_id field to an incrementing number. *) - let hdds = List.mapi (fun i (source, filename) -> - { source with s_disk_id = i }, filename) hdds in - hdds + List.map (fun (_, _, source, filename) -> source, filename) hdds (* Find all removable disks. * -- 2.19.1.3.g30247aa5d201
Laszlo Ersek
2022-Apr-19 15:24 UTC
[Libguestfs] [v2v PATCH 2/2] input: -i vmx: Add support for SATA hard disks
See also: - virt-v2v commit 75872bf282d7 ("input: -i vmx: Add support for NVMe devices", 2022-04-08), - libvirt commit 2214fe90442c ("vmx: start parsing SATA disks", 2020-10-14). Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1883802 Signed-off-by: Laszlo Ersek <lersek at redhat.com> --- input/parse_domain_from_vmx.ml | 35 ++++++- tests/test-v2v-i-vmx-7.expected | 23 ++++ tests/test-v2v-i-vmx-7.vmx | 110 ++++++++++++++++++++ tests/test-v2v-i-vmx.sh | 3 +- 4 files changed, 166 insertions(+), 5 deletions(-) diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml index 5f5946f01a27..947ca41485ce 100644 --- a/input/parse_domain_from_vmx.ml +++ b/input/parse_domain_from_vmx.ml @@ -107,6 +107,7 @@ let rec find_disks vmx vmx_source (fun i (source, filename) -> { source with s_disk_id = i }, filename) (find_scsi_disks vmx vmx_source @ find_nvme_disks vmx vmx_source @ + find_sata_disks vmx vmx_source @ find_ide_disks vmx vmx_source) (* Find all SCSI hard disks. @@ -154,6 +155,30 @@ and find_nvme_disks vmx vmx_source get_nvme_controller_target is_nvme_controller_target nvme_device_types nvme_controller +(* Find all SATA hard disks. + * + * In the VMX file: + * sata0.pciSlotNumber = "33" + * sata0:3.fileName = "win2019_1.vmdk" + * + * The "deviceType" field must be absent; that field is only used for various + * CD-ROM types. + *) +and find_sata_disks vmx vmx_source + let get_sata_controller_target ns + sscanf ns "sata%d:%d" (fun c t -> c, t) + in + let is_sata_controller_target ns + try ignore (get_sata_controller_target ns); true + with Scanf.Scan_failure _ | End_of_file | Failure _ -> false + in + let sata_device_types = [ None ] in + let sata_controller = Source_SATA in + + find_hdds vmx vmx_source + get_sata_controller_target is_sata_controller_target + sata_device_types sata_controller + (* Find all IDE hard disks. * * In the VMX file: @@ -178,12 +203,14 @@ and find_ide_disks vmx vmx_source and find_hdds vmx vmx_source get_controller_target is_controller_target device_types controller - (* Find namespaces matching '(ide|scsi|nvme)X:Y' with suitable deviceType. *) + (* Find namespaces matching '(ide|scsi|nvme|sata)X:Y' with suitable + * deviceType. + *) let hdds Parse_vmx.select_namespaces ( function | [ns] -> - (* Check the namespace is '(ide|scsi|nvme)X:Y' *) + (* Check the namespace is '(ide|scsi|nvme|sata)X:Y' *) if not (is_controller_target ns) then false else ( (* Check the deviceType is one we are looking for. *) @@ -220,8 +247,8 @@ and find_hdds vmx vmx_source * ide1:0.deviceType = "cdrom-image" * ide1:0.fileName = "boot.iso" * - * XXX This only supports IDE CD-ROMs, but we could support SCSI - * CD-ROMs and floppies in future. + * XXX This only supports IDE CD-ROMs, but we could support SCSI CD-ROMs, SATA + * CD-ROMs, and floppies in future. *) and find_removables vmx let get_ide_controller_target ns diff --git a/tests/test-v2v-i-vmx-7.expected b/tests/test-v2v-i-vmx-7.expected new file mode 100644 index 000000000000..dd50510e5630 --- /dev/null +++ b/tests/test-v2v-i-vmx-7.expected @@ -0,0 +1,23 @@ + +Source guest information (--print-source option): + + source name: win2019 +hypervisor type: vmware + VM genid: 2f0de9ad-5b7c-f4de-d53f-23b1115d28b9 + memory: 4294967296 (bytes) + nr vCPUs: 2 + CPU vendor: + CPU model: + CPU topology: + CPU features: + firmware: uefi + display: + sound: +disks: + 0 [scsi] + 1 [sata] +removable media: + +NICs: + Network "VM Network" mac: 00:0c:29:46:9b:0b [vmxnet3] + diff --git a/tests/test-v2v-i-vmx-7.vmx b/tests/test-v2v-i-vmx-7.vmx new file mode 100755 index 000000000000..c2577a529894 --- /dev/null +++ b/tests/test-v2v-i-vmx-7.vmx @@ -0,0 +1,110 @@ +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "17" +vmci0.present = "TRUE" +floppy0.present = "FALSE" +numvcpus = "2" +memSize = "4096" +bios.bootRetry.delay = "10" +firmware = "efi" +powerType.suspend = "soft" +tools.upgrade.policy = "manual" +sched.cpu.units = "mhz" +sched.cpu.affinity = "all" +vm.createDate = "1649413453022013" +scsi0.virtualDev = "lsisas1068" +scsi0.present = "TRUE" +sata0.present = "TRUE" +usb_xhci.present = "TRUE" +scsi0:0.deviceType = "scsi-hardDisk" +scsi0:0.fileName = "win2019.vmdk" +sched.scsi0:0.shares = "normal" +sched.scsi0:0.throughputCap = "off" +scsi0:0.present = "TRUE" +ethernet0.virtualDev = "vmxnet3" +ethernet0.networkName = "VM Network" +ethernet0.addressType = "generated" +ethernet0.wakeOnPcktRcv = "FALSE" +ethernet0.present = "TRUE" +sata0:0.deviceType = "cdrom-image" +sata0:0.fileName = "/vmfs/volumes/624d796f-52b87554-ccba-a4ae111c9b1b/iso/en-us_windows_server_2019_updated_aug_2021_x64_dvd_a6431a28.iso" +sata0:0.present = "TRUE" +displayName = "win2019" +guestOS = "windows2019srv-64" +uefi.secureBoot.enabled = "TRUE" +toolScripts.afterPowerOn = "TRUE" +toolScripts.afterResume = "TRUE" +toolScripts.beforeSuspend = "TRUE" +toolScripts.beforePowerOff = "TRUE" +tools.syncTime = "FALSE" +uuid.bios = "56 4d 6c 27 96 ea 12 07-6f 0b b1 1d 81 46 9b 0b" +uuid.location = "56 4d 6c 27 96 ea 12 07-6f 0b b1 1d 81 46 9b 0b" +vc.uuid = "52 bb 00 73 da d0 a0 c7-ad 14 03 81 13 03 ed fe" +sched.cpu.min = "0" +sched.cpu.shares = "normal" +sched.mem.min = "0" +sched.mem.minSize = "0" +sched.mem.shares = "normal" +ethernet0.generatedAddress = "00:0c:29:46:9b:0b" +vmci0.id = "-2126079221" +cleanShutdown = "TRUE" +sata0:0.startConnected = "TRUE" +extendedConfigFile = "win2019.vmxf" +ethernet0.uptCompatibility = "TRUE" +sata0:3.fileName = "win2019_1.vmdk" +sched.sata0:3.shares = "normal" +sched.sata0:3.throughputCap = "off" +sata0:3.present = "TRUE" +tools.guest.desktop.autolock = "FALSE" +nvram = "win2019.nvram" +pciBridge0.present = "TRUE" +svga.present = "TRUE" +pciBridge4.present = "TRUE" +pciBridge4.virtualDev = "pcieRootPort" +pciBridge4.functions = "8" +pciBridge5.present = "TRUE" +pciBridge5.virtualDev = "pcieRootPort" +pciBridge5.functions = "8" +pciBridge6.present = "TRUE" +pciBridge6.virtualDev = "pcieRootPort" +pciBridge6.functions = "8" +pciBridge7.present = "TRUE" +pciBridge7.virtualDev = "pcieRootPort" +pciBridge7.functions = "8" +hpet0.present = "TRUE" +RemoteDisplay.maxConnections = "-1" +sched.cpu.latencySensitivity = "normal" +svga.autodetect = "TRUE" +disk.EnableUUID = "TRUE" +numa.autosize.cookie = "20012" +numa.autosize.vcpu.maxPerVirtualNode = "2" +sched.swap.derivedName = "/vmfs/volumes/624d796f-52b87554-ccba-a4ae111c9b1b/win2019/win2019-645c6913.vswp" +vm.genidX = "-5104727847056752683" +pciBridge0.pciSlotNumber = "17" +pciBridge4.pciSlotNumber = "21" +pciBridge5.pciSlotNumber = "22" +pciBridge6.pciSlotNumber = "23" +pciBridge7.pciSlotNumber = "24" +scsi0.pciSlotNumber = "160" +ethernet0.pciSlotNumber = "192" +usb_xhci.pciSlotNumber = "224" +vmci0.pciSlotNumber = "32" +sata0.pciSlotNumber = "33" +scsi0.sasWWID = "50 05 05 67 96 ea 12 00" +vmotion.checkpointFBSize = "4194304" +vmotion.checkpointSVGAPrimarySize = "16777216" +vmotion.svga.mobMaxSize = "16777216" +vmotion.svga.graphicsMemoryKB = "16384" +ethernet0.generatedAddressOffset = "0" +monitor.phys_bits_used = "45" +softPowerOff = "TRUE" +toolsInstallManager.lastInstallError = "0" +toolsInstallManager.updateCounter = "3" +svga.guestBackedPrimaryAware = "TRUE" +tools.remindInstall = "FALSE" +vm.genid = "-802103094701856339" +usb_xhci:4.present = "TRUE" +usb_xhci:4.deviceType = "hid" +usb_xhci:4.port = "4" +usb_xhci:4.parent = "-1" +migrate.hostLog = "./win2019-645c6913.hlog" diff --git a/tests/test-v2v-i-vmx.sh b/tests/test-v2v-i-vmx.sh index d74ddfaaf8fb..eff27e3d8e9f 100755 --- a/tests/test-v2v-i-vmx.sh +++ b/tests/test-v2v-i-vmx.sh @@ -43,10 +43,11 @@ fns="BZ1308535_21disks.vmdk Fedora-20.vmdk RHEL-7.1-UEFI.vmdk Windows-7-x64.vmdk for fn in BZ1308535_21disks_{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}.vmdk; do fns="$fns $fn" done +fns="$fns win2019.vmdk win2019_1.vmdk" for fn in $fns; do qemu-img create -f vmdk $fn 512; done -for i in 1 2 3 4 5 6; do +for i in 1 2 3 4 5 6 7; do $VG virt-v2v --debug-gc \ -i vmx test-v2v-i-vmx-$i.vmx \ --print-source > test-v2v-i-vmx-$i.actual -- 2.19.1.3.g30247aa5d201