Rebase to upstream 1.45.96.

resolves: rhbz#2011713
Add virtio-transitional for older guests when converting to q35
resolves: rhbz#1942325
This commit is contained in:
Richard W.M. Jones 2022-01-06 14:31:53 +00:00
parent 7ea0c8cf97
commit c553c74d10
25 changed files with 917 additions and 427 deletions

View File

@ -1,72 +0,0 @@
From 24fdb088b1856abec0974a428c424fe598597079 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 18 Dec 2021 12:01:19 +0000
Subject: [PATCH] input, output: Use Option.may for some Nbdkit calls
Option.may (Nbdkit.add_arg cmd "port") port;
is completely equivalent to:
(match port with
| Some s -> Nbdkit.add_arg cmd "port" s
| None -> ());
Updates: commit d50966c2a480bda033f6e63bb797f86c13d576bd
---
input/nbdkit_curl.ml | 4 +---
input/nbdkit_ssh.ml | 8 ++------
output/output_rhv_upload.ml | 4 +---
3 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/input/nbdkit_curl.ml b/input/nbdkit_curl.ml
index d6793b22..081c598e 100644
--- a/input/nbdkit_curl.ml
+++ b/input/nbdkit_curl.ml
@@ -57,9 +57,7 @@ let create_curl ?bandwidth ?cookie_script ?cookie_script_renew ?cor
(* https://bugzilla.redhat.com/show_bug.cgi?id=1146007#c10 *)
Nbdkit.add_arg cmd "timeout" "2000";
- (match cookie_script with
- | Some s -> Nbdkit.add_arg cmd "cookie-script" s
- | None -> ());
+ Option.may (Nbdkit.add_arg cmd "cookie-script") cookie_script;
(match cookie_script_renew with
| Some i -> Nbdkit.add_arg cmd "cookie-script-renew" (string_of_int i)
| None -> ());
diff --git a/input/nbdkit_ssh.ml b/input/nbdkit_ssh.ml
index ce972d7d..0a6d8425 100644
--- a/input/nbdkit_ssh.ml
+++ b/input/nbdkit_ssh.ml
@@ -61,12 +61,8 @@ let create_ssh ?bandwidth ?cor ~password ?port ~server ?user path =
let cmd = Nbdkit.create "ssh" in
Nbdkit.add_arg cmd "host" server;
Nbdkit.add_arg cmd "path" path;
- (match port with
- | Some s -> Nbdkit.add_arg cmd "port" s
- | None -> ());
- (match user with
- | Some s -> Nbdkit.add_arg cmd "user" s
- | None -> ());
+ Option.may (Nbdkit.add_arg cmd "port") port;
+ Option.may (Nbdkit.add_arg cmd "user") user;
(* Retry filter (if it exists) can be used to get around brief
* interruptions in service. It must be closest to the plugin.
diff --git a/output/output_rhv_upload.ml b/output/output_rhv_upload.ml
index 7cedfff9..91e7be45 100644
--- a/output/output_rhv_upload.ml
+++ b/output/output_rhv_upload.ml
@@ -345,9 +345,7 @@ e command line has to match the number of guest disk images (for this guest: %d)
(* Create the nbdkit instance. *)
Nbdkit.add_arg cmd "size" (Int64.to_string size);
Nbdkit.add_arg cmd "url" destination_url;
- (match rhv_cafile with
- | None -> ()
- | Some cafile -> Nbdkit.add_arg cmd "cafile" cafile);
+ Option.may (Nbdkit.add_arg cmd "cafile") rhv_cafile;
if not rhv_verifypeer then
Nbdkit.add_arg cmd "insecure" "true";
if is_ovirt_host then
--
2.19.1.3.g30247aa5d201

View File

@ -0,0 +1,44 @@
From dc69bb6033bd41b79e6203080059d4f3b0eb8027 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:02 +0100
Subject: [PATCH] lib/types: reformat "string_of_guestcaps"
The printf format string in "string_of_guestcaps" is hard to read, because
it is not indented properly wrt. the rest of the source code. Indent it
properly without changing its behavior.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-2-lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
lib/types.ml | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/lib/types.ml b/lib/types.ml
index 894391ba..dc3308dc 100644
--- a/lib/types.ml
+++ b/lib/types.ml
@@ -423,12 +423,13 @@ let string_of_machine = function
let string_of_guestcaps gcaps =
sprintf "\
-gcaps_block_bus = %s
-gcaps_net_bus = %s
-gcaps_machine = %s
-gcaps_arch = %s
-gcaps_acpi = %b
-" (string_of_block_type gcaps.gcaps_block_bus)
+ gcaps_block_bus = %s\n\
+ gcaps_net_bus = %s\n\
+ gcaps_machine = %s\n\
+ gcaps_arch = %s\n\
+ gcaps_acpi = %b\n\
+ "
+ (string_of_block_type gcaps.gcaps_block_bus)
(string_of_net_type gcaps.gcaps_net_bus)
(string_of_machine gcaps.gcaps_machine)
gcaps.gcaps_arch
--
2.31.1

View File

@ -1,26 +0,0 @@
From 702a511b7f3379102ec5d267a7a43bdd47f3e594 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 18 Dec 2021 13:22:48 +0000
Subject: [PATCH] input/nbdkit_curl.ml: Fix typo in commented code
Fixes: commit 255722cbf39afc0b012e2ac00d16fa6ba2f8c21f
---
input/nbdkit_curl.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/input/nbdkit_curl.ml b/input/nbdkit_curl.ml
index 081c598e..aacedb78 100644
--- a/input/nbdkit_curl.ml
+++ b/input/nbdkit_curl.ml
@@ -65,7 +65,7 @@ let create_curl ?bandwidth ?cookie_script ?cookie_script_renew ?cor
(* For lots of extra debugging, uncomment one or both lines. *)
(* Nbdkit.add_arg cmd "--debug" "curl.verbose=1"; *)
- (* Nbdkit.add_arg cnd "--debug" "curl.scripts=1"; *)
+ (* Nbdkit.add_arg cmd "--debug" "curl.scripts=1"; *)
(* Retry filter (if it exists) can be used to get around brief
* interruptions in service. It must be closest to the plugin.
--
2.19.1.3.g30247aa5d201

View File

@ -0,0 +1,55 @@
From 08786886302cceb7ee73cfa6c01325f690a3c094 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:03 +0100
Subject: [PATCH] lib/types: update "string_of_guestcaps"
The "string_of_guestcaps" function is out of date; the following commits
did not update it, when they introduced new fields to the "guestcaps"
record type:
- d295d6e510a4 ("v2v: Extend guestcaps to record drivers for virtio-rng,
balloon and pvpanic.", 2017-04-06)
- 05f780c16f01 ("v2v: support configuration of viosock driver",
2021-02-26)
Print those fields now.
Fixes: d295d6e510a4fb251d545c52c0a9d6dccabe6f78
Fixes: 05f780c16f0135c657615520c2245b42de1efc3e
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-3-lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
lib/types.ml | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/lib/types.ml b/lib/types.ml
index dc3308dc..52db1f9e 100644
--- a/lib/types.ml
+++ b/lib/types.ml
@@ -425,12 +425,20 @@ let string_of_guestcaps gcaps =
sprintf "\
gcaps_block_bus = %s\n\
gcaps_net_bus = %s\n\
+ gcaps_virtio_rng = %b\n\
+ gcaps_virtio_balloon = %b\n\
+ gcaps_isa_pvpanic = %b\n\
+ gcaps_virtio_socket = %b\n\
gcaps_machine = %s\n\
gcaps_arch = %s\n\
gcaps_acpi = %b\n\
"
(string_of_block_type gcaps.gcaps_block_bus)
(string_of_net_type gcaps.gcaps_net_bus)
+ gcaps.gcaps_virtio_rng
+ gcaps.gcaps_virtio_balloon
+ gcaps.gcaps_isa_pvpanic
+ gcaps.gcaps_virtio_socket
(string_of_machine gcaps.gcaps_machine)
gcaps.gcaps_arch
gcaps.gcaps_acpi
--
2.31.1

View File

@ -0,0 +1,95 @@
From 789017805ad0ddfacfb16d39313ef8b2f8f478ac Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:04 +0100
Subject: [PATCH] lib/types: introduce the "gcaps_virtio_1_0" guest capability
Add a new field to the "guestcaps" record to track whether the guest
supports the virtio devices that it does at the virtio-1.0 protocol level.
Virt-v2v's current assumption is that virtio-1.0 is supported by any
guest, namely for those virtio devices specifically that the guest
supports -- which in fact may be the empty set. Make this assumption
explicit by setting the new field to "true" in "convert/convert_linux.ml"
and "convert/convert_windows.ml".
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-4-lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
convert/convert_linux.ml | 1 +
convert/convert_windows.ml | 1 +
lib/types.ml | 3 +++
lib/types.mli | 4 ++++
4 files changed, 9 insertions(+)
diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index d49ecec0..3f1114ad 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -155,6 +155,7 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ =
gcaps_machine = machine;
gcaps_arch = Utils.kvm_arch inspect.i_arch;
gcaps_acpi = acpi;
+ gcaps_virtio_1_0 = true;
} in
guestcaps
diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
index 0ebffb15..30e494ea 100644
--- a/convert/convert_windows.ml
+++ b/convert/convert_windows.ml
@@ -259,6 +259,7 @@ let convert (g : G.guestfs) _ inspect _ static_ips =
gcaps_machine = machine;
gcaps_arch = Utils.kvm_arch inspect.i_arch;
gcaps_acpi = true;
+ gcaps_virtio_1_0 = true;
} in
guestcaps
diff --git a/lib/types.ml b/lib/types.ml
index 52db1f9e..50c41918 100644
--- a/lib/types.ml
+++ b/lib/types.ml
@@ -404,6 +404,7 @@ type guestcaps = {
gcaps_machine : guestcaps_machine;
gcaps_arch : string;
gcaps_acpi : bool;
+ gcaps_virtio_1_0 : bool;
}
and guestcaps_block_type = Virtio_blk | IDE
and guestcaps_net_type = Virtio_net | E1000 | RTL8139
@@ -432,6 +433,7 @@ let string_of_guestcaps gcaps =
gcaps_machine = %s\n\
gcaps_arch = %s\n\
gcaps_acpi = %b\n\
+ gcaps_virtio_1_0 = %b\n\
"
(string_of_block_type gcaps.gcaps_block_bus)
(string_of_net_type gcaps.gcaps_net_bus)
@@ -442,6 +444,7 @@ let string_of_guestcaps gcaps =
(string_of_machine gcaps.gcaps_machine)
gcaps.gcaps_arch
gcaps.gcaps_acpi
+ gcaps.gcaps_virtio_1_0
type target_buses = {
target_virtio_blk_bus : target_bus_slot array;
diff --git a/lib/types.mli b/lib/types.mli
index 02913c0c..0b9b6e25 100644
--- a/lib/types.mli
+++ b/lib/types.mli
@@ -270,6 +270,10 @@ type guestcaps = {
gcaps_machine : guestcaps_machine; (** Machine model. *)
gcaps_arch : string; (** Architecture that KVM must emulate. *)
gcaps_acpi : bool; (** True if guest supports acpi. *)
+
+ gcaps_virtio_1_0 : bool;
+ (** The guest supports the virtio devices that it does at the virtio-1.0
+ protocol level. *)
}
(** Guest capabilities after conversion. eg. Was virtio found or installed? *)
--
2.31.1

View File

@ -1,166 +0,0 @@
From 07b12fe99fb9cf0b75fe45d3eaa07b4bbc1bbe89 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Mon, 20 Dec 2021 14:56:40 +0100
Subject: [PATCH] output_rhv: restrict block status collection to the old RHV
output
Nir reports that, despite the comment we removed in commit a2a4f7a09996,
we generally cannot access the output NBD servers in the finalization
stage. In particular, in the "rhv_upload_finalize" function
[output/output_rhv_upload.ml], the output disks are disconnected before
"create_ovf" is called.
Consequently, the "get_disk_allocated" call in the "create_ovf" ->
"add_disks" -> "get_disk_allocated" chain fails.
Rich suggests that we explicitly restrict the "get_disk_allocated" call
with a new optional boolean parameter to the one output plugin that really
needs it, namely the old RHV one.
Accordingly, revert the VDSM test case to its state at (a2a4f7a09996^).
Cc: Nir Soffer <nsoffer@redhat.com>
Fixes: a2a4f7a09996a5e66d027d0d9692e083eb0a8128
Reported-by: Nir Soffer <nsoffer@redhat.com>
Suggested-by: Richard W.M. Jones <rjones@redhat.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2034240
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20211220135640.12436-1-lersek@redhat.com>
Tested-by: Nir Soffer <nsoffer@redhat.com>
[lersek@redhat.com: drop parens around condition in "if"; thanks: Rich]
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
---
lib/create_ovf.ml | 35 +++++++++++++---------
lib/create_ovf.mli | 3 +-
output/output_rhv.ml | 4 +--
tests/test-v2v-o-vdsm-options.ovf.expected | 4 +--
4 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/lib/create_ovf.ml b/lib/create_ovf.ml
index dbac3405..9d06bd23 100644
--- a/lib/create_ovf.ml
+++ b/lib/create_ovf.ml
@@ -531,7 +531,8 @@ let rec create_ovf source inspect
{ output_name; guestcaps; target_firmware; target_nics }
sizes
output_alloc output_format
- sd_uuid image_uuids vol_uuids dir vm_uuid ovf_flavour =
+ sd_uuid image_uuids vol_uuids ?(need_actual_sizes = false) dir
+ vm_uuid ovf_flavour =
assert (List.length sizes = List.length vol_uuids);
let memsize_mb = source.s_memory /^ 1024L /^ 1024L in
@@ -745,7 +746,7 @@ let rec create_ovf source inspect
(* Add disks to the OVF XML. *)
add_disks sizes guestcaps output_alloc output_format
- sd_uuid image_uuids vol_uuids dir ovf_flavour ovf;
+ sd_uuid image_uuids vol_uuids need_actual_sizes dir ovf_flavour ovf;
(* Old virt-v2v ignored removable media. XXX *)
@@ -791,7 +792,7 @@ and get_flavoured_section ovf ovirt_path rhv_path rhv_path_attr = function
(* This modifies the OVF DOM, adding a section for each disk. *)
and add_disks sizes guestcaps output_alloc output_format
- sd_uuid image_uuids vol_uuids dir ovf_flavour ovf =
+ sd_uuid image_uuids vol_uuids need_actual_sizes dir ovf_flavour ovf =
let references =
let nodes = path_to_nodes ovf ["ovf:Envelope"; "References"] in
match nodes with
@@ -839,7 +840,12 @@ and add_disks sizes guestcaps output_alloc output_format
b /^ 1073741824L
in
let size_gb = bytes_to_gb size in
- let actual_size = get_disk_allocated ~dir ~disknr:i in
+ let actual_size =
+ if need_actual_sizes then
+ get_disk_allocated ~dir ~disknr:i
+ else
+ None
+ in
let format_for_rhv =
match output_format with
@@ -891,16 +897,17 @@ and add_disks sizes guestcaps output_alloc output_format
"ovf:disk-type", "System"; (* RHBZ#744538 *)
"ovf:boot", if is_bootable_drive then "True" else "False";
] in
- (* Ovirt-engine considers the "ovf:actual_size" attribute mandatory. If
- * we don't know the actual size, we must create the attribute with
- * empty contents.
- *)
- List.push_back attrs
- ("ovf:actual_size",
- match actual_size with
- | None -> ""
- | Some actual_size -> Int64.to_string (bytes_to_gb actual_size)
- );
+ if need_actual_sizes then
+ (* Ovirt-engine considers the "ovf:actual_size" attribute mandatory.
+ * If we don't know the actual size, we must create the attribute
+ * with empty contents.
+ *)
+ List.push_back attrs
+ ("ovf:actual_size",
+ match actual_size with
+ | None -> ""
+ | Some actual_size -> Int64.to_string (bytes_to_gb actual_size)
+ );
e "Disk" !attrs [] in
append_child disk disk_section;
diff --git a/lib/create_ovf.mli b/lib/create_ovf.mli
index 0d1cc5a9..d6d4e62e 100644
--- a/lib/create_ovf.mli
+++ b/lib/create_ovf.mli
@@ -46,7 +46,8 @@ val ovf_flavour_to_string : ovf_flavour -> string
val create_ovf : Types.source -> Types.inspect ->
Types.target_meta -> int64 list ->
Types.output_allocation -> string -> string -> string list ->
- string list -> string -> string -> ovf_flavour -> DOM.doc
+ string list -> ?need_actual_sizes:bool -> string -> string ->
+ ovf_flavour -> DOM.doc
(** Create the OVF file.
Actually a {!DOM} document is created, not a file. It can be written
diff --git a/output/output_rhv.ml b/output/output_rhv.ml
index b902a7ee..6a67b7aa 100644
--- a/output/output_rhv.ml
+++ b/output/output_rhv.ml
@@ -183,8 +183,8 @@ and rhv_finalize dir source inspect target_meta
(* Create the metadata. *)
let ovf =
Create_ovf.create_ovf source inspect target_meta sizes
- output_alloc output_format esd_uuid image_uuids vol_uuids dir vm_uuid
- Create_ovf.RHVExportStorageDomain in
+ output_alloc output_format esd_uuid image_uuids vol_uuids
+ ~need_actual_sizes:true dir vm_uuid Create_ovf.RHVExportStorageDomain in
(* Write it to the metadata file. *)
let dir = esd_mp // esd_uuid // "master" // "vms" // vm_uuid in
diff --git a/tests/test-v2v-o-vdsm-options.ovf.expected b/tests/test-v2v-o-vdsm-options.ovf.expected
index bd5b5e7d..23ca180f 100644
--- a/tests/test-v2v-o-vdsm-options.ovf.expected
+++ b/tests/test-v2v-o-vdsm-options.ovf.expected
@@ -2,7 +2,7 @@
<ovf:Envelope xmlns:rasd='http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData' xmlns:vssd='http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ovf='http://schemas.dmtf.org/ovf/envelope/1/' xmlns:ovirt='http://www.ovirt.org/ovf' ovf:version='0.9'>
<!-- generated by virt-v2v -->
<References>
- <File ovf:href='VOL' ovf:id='VOL' ovf:description='generated by virt-v2v' ovf:size='#SIZE#'/>
+ <File ovf:href='VOL' ovf:id='VOL' ovf:description='generated by virt-v2v'/>
</References>
<NetworkSection>
<Info>List of networks</Info>
@@ -10,7 +10,7 @@
</NetworkSection>
<DiskSection>
<Info>List of Virtual Disks</Info>
- <Disk ovf:diskId='IMAGE' ovf:size='1' ovf:capacity='536870912' ovf:fileRef='VOL' ovf:parentRef='' ovf:vm_snapshot_id='#UUID#' ovf:volume-format='COW' ovf:volume-type='Sparse' ovf:format='http://en.wikipedia.org/wiki/Byte' ovf:disk-interface='VirtIO' ovf:disk-type='System' ovf:boot='True' ovf:actual_size='1'/>
+ <Disk ovf:diskId='IMAGE' ovf:size='1' ovf:capacity='536870912' ovf:fileRef='VOL' ovf:parentRef='' ovf:vm_snapshot_id='#UUID#' ovf:volume-format='COW' ovf:volume-type='Sparse' ovf:format='http://en.wikipedia.org/wiki/Byte' ovf:disk-interface='VirtIO' ovf:disk-type='System' ovf:boot='True'/>
</DiskSection>
<VirtualSystem ovf:id='VM'>
<Name>windows</Name>
--
2.19.1.3.g30247aa5d201

View File

@ -0,0 +1,118 @@
From e4cf85bd3ad44aed28cf3e8d3bfd67fec38ebdab Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:05 +0100
Subject: [PATCH] output/create_libvirt_xml: pick "virtio-transitional" models
when needed
In the domain XML we generate, we do not assign PCI B/D/F addresses to
devices; that job is left to libvirtd. When using the Q35 machine type,
libvirtd places the virtio devices into PCI Express Root Ports. As a
consequence, QEMU disables virtio-0.9.5 support on these devices, and so
guest OSes without virtio-1.0 drivers cannot drive them.
Prevent QEMU from turning off the virtio-0.9.5 ("legacy") protocol by
specifying the "virtio-transitional" (not "virtio") model for our virtio
devices:
- For non-disk devices, simply change the value of the existent "model"
attribute.
- For disk devices, add the "model" attribute as a new one.
(In fact, libvirtd doesn't (only) add the "disable_legacy=off" QEMU device
property for the "virtio-transitional" devices -- libvirtd even moves
these devices from PCI Express Root Ports to a dedicated
"pcie-to-pci-bridge". This has the same effect on QEMU.)
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-5-lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
output/create_libvirt_xml.ml | 28 ++++++++++++++++++----------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml
index 9413cc0b..87bfab17 100644
--- a/output/create_libvirt_xml.ml
+++ b/output/create_libvirt_xml.ml
@@ -312,18 +312,26 @@ let create_libvirt_xml ?pool source inspect
(* The devices. *)
let devices = ref [] in
+ (* This will affect all of the virtio devices (if any). *)
+ let virtio_transitional =
+ guestcaps.gcaps_machine = Q35 && not guestcaps.gcaps_virtio_1_0 in
+ let virtio_model =
+ if virtio_transitional then "virtio-transitional" else "virtio" in
+
(* Fixed and removable disks. *)
let () =
- let make_disk bus_name drive_prefix i = function
+ let make_disk bus_name ?(viotrans = false) drive_prefix i = function
| BusSlotEmpty -> Comment (sprintf "%s slot %d is empty" bus_name i)
| BusSlotDisk d ->
let outdisk = outdisk_name d.s_disk_id in
- e "disk" [
- "type", if pool = None then "file" else "volume";
- "device", "disk"
- ] [
+ e "disk" (
+ [
+ "type", if pool = None then "file" else "volume";
+ "device", "disk"
+ ] @ if (viotrans) then [ "model", "virtio-transitional" ] else []
+ ) [
e "driver" [
"name", "qemu";
"type", output_format;
@@ -364,7 +372,7 @@ let create_libvirt_xml ?pool source inspect
in
List.push_back_list devices
- (List.mapi (make_disk "virtio" "vd")
+ (List.mapi (make_disk "virtio" ~viotrans:virtio_transitional "vd")
(Array.to_list target_buses.target_virtio_blk_bus));
let ide_disks =
match guestcaps.gcaps_machine with
@@ -392,7 +400,7 @@ let create_libvirt_xml ?pool source inspect
let nics =
let net_model =
match guestcaps.gcaps_net_bus with
- | Virtio_net -> "virtio" | E1000 -> "e1000" | RTL8139 -> "rtl8139" in
+ | Virtio_net -> virtio_model | E1000 -> "e1000" | RTL8139 -> "rtl8139" in
List.map (
fun { s_mac = mac; s_vnet_type = vnet_type; s_vnet = vnet } ->
let vnet_type_str =
@@ -483,7 +491,7 @@ let create_libvirt_xml ?pool source inspect
(* Miscellaneous KVM devices. *)
if guestcaps.gcaps_virtio_rng then
List.push_back devices (
- e "rng" ["model", "virtio"] [
+ e "rng" ["model", virtio_model] [
(* XXX Using /dev/urandom requires libvirt >= 1.3.4. Libvirt
* was broken before that.
*)
@@ -496,7 +504,7 @@ let create_libvirt_xml ?pool source inspect
List.push_back devices (
e "memballoon"
["model",
- if guestcaps.gcaps_virtio_balloon then "virtio" else "none"]
+ if guestcaps.gcaps_virtio_balloon then virtio_model else "none"]
[]
);
if guestcaps.gcaps_isa_pvpanic then
@@ -508,7 +516,7 @@ let create_libvirt_xml ?pool source inspect
List.push_back devices (
e "viosock"
["model",
- if guestcaps.gcaps_virtio_socket then "virtio" else "none"]
+ if guestcaps.gcaps_virtio_socket then virtio_model else "none"]
[]
);
--
2.31.1

View File

@ -1,66 +0,0 @@
From 9b77e7e51f462cbac978adfcdbed18df112438c8 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 18 Dec 2021 13:42:56 +0000
Subject: [PATCH] v2v: Swap over the output and conversion stages
In old virt-v2v, we did (approximately, since the steps were not as
clear):
Input -> Convert -> Output -> Copy -> Finalize
After modularizing virt-v2v we changed this to:
Input -> Output -> Convert -> Copy -> Finalize
However this has a (sort of) problem. For -o rhv-upload when we start
the nbdkit rhv-upload-plugin machinery, it obtains a time-limited
ticket from imageio. This ticket could expire if the conversion step
takes longer than a certain time (60 seconds by default, may be
increased in a future version of oVirt).
I believe this is really a problem in imageio or that the
rhv-upload-plugin should really renew this ticket automatically, but
it does not, instead failing. (The ticket *is* renewed automatically
whenever a request is sent to imageio, but in this case no requests
are being sent).
Anyway the easiest thing is to switch the ordering back to how it was
in old virt-v2v (at top). It doesn't make a difference for any other
output modes.
Reported-by: Nir Soffer
---
v2v/v2v.ml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index a2414598..1db0c233 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -542,6 +542,11 @@ read the man page virt-v2v(1).
exit 0
);
+ (* Do the conversion. *)
+ with_open_out (tmpdir // "convert") (fun _ -> ());
+ let inspect, target_meta = Convert.convert tmpdir conv_options source in
+ unlink (tmpdir // "convert");
+
(* Start the output module (runs an NBD server in the background). *)
let output_t = Output_module.setup tmpdir output_options source in
@@ -551,11 +556,6 @@ read the man page virt-v2v(1).
ignore (Sys.command cmd)
);
- (* Do the conversion. *)
- with_open_out (tmpdir // "convert") (fun _ -> ());
- let inspect, target_meta = Convert.convert tmpdir conv_options source in
- unlink (tmpdir // "convert");
-
(* Do the copy. *)
with_open_out (tmpdir // "copy") (fun _ -> ());
--
2.19.1.3.g30247aa5d201

View File

@ -1,61 +0,0 @@
From a96669133e5aa5eb1269cf284f8bd7530a4e836a Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 18 Dec 2021 13:40:08 +0000
Subject: [PATCH] XXX v2v: Remove nbdcopy --request-size=4M flag
XXX NEEDS BENCHMARKING XXX
This was added when we were setting the cow-block-size to 1M. However
since commit 351d61f768 ("input: -it vddk: Reduce cow-block-size to 4K")
we stopped doing that so this is no longer needed.
Reverts: commit 08e764959ec9dadd71a95d22d3d88d647a18d165
---
v2v/v2v.ml | 18 ++----------------
1 file changed, 2 insertions(+), 16 deletions(-)
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index 1db0c233..47e6e937 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -587,17 +587,7 @@ read the man page virt-v2v(1).
nbdinfo ~content:false output_uri
);
- (* At the moment, unconditionally set nbdcopy --request-size
- * to 4M (up from the default of 256K). With nbdkit + vddk +
- * cow + cow-block-size=1M this is necessary because requests
- * must be larger than the cow filter block size to avoid
- * breaking up reads. It probably doesn't affect other
- * modes, but in future consider setting this only for
- * specific input modes that adjust cow-block-size.
- *)
- let request_size = Some (4*1024*1024) in
-
- nbdcopy ?request_size output_alloc input_uri output_uri
+ nbdcopy output_alloc input_uri output_uri
) disks;
(* End of copying phase. *)
@@ -616,17 +606,13 @@ read the man page virt-v2v(1).
*)
with_open_out (tmpdir // "done") (fun _ -> ())
-and nbdcopy ?request_size output_alloc input_uri output_uri =
+and nbdcopy output_alloc input_uri output_uri =
(* XXX It's possible that some output modes know whether
* --target-is-zero which would be a useful optimization.
*)
let cmd = ref [] in
List.push_back_list cmd [ "nbdcopy"; input_uri; output_uri ];
List.push_back cmd "--flush";
- (match request_size with
- | None -> ()
- | Some size -> List.push_back cmd (sprintf "--request-size=%d" size)
- );
(*List.push_back cmd "--verbose";*)
if not (quiet ()) then List.push_back cmd "--progress";
if output_alloc = Types.Preallocated then List.push_back cmd "--allocated";
--
2.19.1.3.g30247aa5d201

View File

@ -0,0 +1,33 @@
From 511910e1f7e956fb8a032c1c04fd0a983b2108df Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:06 +0100
Subject: [PATCH] output/create_json: expose "gcaps_virtio_1_0"
Let CNV / KubeVirt know about the "gcaps_virtio_1_0" field as well, so
that it can make the same determination from "machine" and
"gcaps_virtio_1_0" as virt-v2v does in the libvirt output (from an earlier
patch in this series).
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-6-lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
output/create_json.ml | 1 +
1 file changed, 1 insertion(+)
diff --git a/output/create_json.ml b/output/create_json.ml
index b48902b7..985e10a9 100644
--- a/output/create_json.ml
+++ b/output/create_json.ml
@@ -219,6 +219,7 @@ let create_json_metadata source inspect
"isa-pvpanic", JSON.Bool guestcaps.gcaps_isa_pvpanic;
"virtio-socket", JSON.Bool guestcaps.gcaps_virtio_socket;
"acpi", JSON.Bool guestcaps.gcaps_acpi;
+ "virtio-1-0", JSON.Bool guestcaps.gcaps_virtio_1_0;
] in
List.push_back doc ("guestcaps", JSON.Dict guestcaps_dict);
--
2.31.1

View File

@ -0,0 +1,165 @@
From 46f5885dba1b669588d98eb840af454564d07cae Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:07 +0100
Subject: [PATCH] convert/libosinfo: wrap osinfo_os_get_all_devices()
Introduce the "osinfo_os.get_devices" OCaml method, for wrapping the
libosinfo API osinfo_os_get_all_devices().
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-7-lersek@redhat.com>
[lersek@redhat.com: call OCaml values "<something>v" (Rich)]
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
convert/libosinfo-c.c | 66 +++++++++++++++++++++++++++++++++++++++++++
convert/libosinfo.ml | 14 +++++++++
convert/libosinfo.mli | 14 +++++++++
3 files changed, 94 insertions(+)
diff --git a/convert/libosinfo-c.c b/convert/libosinfo-c.c
index 09cf588d..b8e78bec 100644
--- a/convert/libosinfo-c.c
+++ b/convert/libosinfo-c.c
@@ -50,6 +50,7 @@
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OsinfoFilter, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OsinfoLoader, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OsinfoOsList, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(OsinfoDeviceList, g_object_unref)
#endif
typedef OsinfoDb *OsinfoDb_t;
@@ -255,3 +256,68 @@ v2v_osinfo_os_get_device_drivers (value osv)
CAMLreturn (rv);
}
+
+/* Collect OsinfoDevice properties from two levels:
+ *
+ * - The OSINFO_ENTITY_PROP_ID property, originating from the OsinfoEntity base
+ * class. This is a unique URI, identifying the device.
+ *
+ * - All currently known OSINFO_DEVICE_PROP_* properties, originating from the
+ * OsinfoDevice class.
+ *
+ * All of the above properties have string values. Thus, for uniformity, access
+ * all these properties by their names at the OsinfoEntity level (i.e., forego
+ * the class- and property-specific, dedicated property getter functions).
+ */
+static const char * const device_prop[] = {
+ OSINFO_ENTITY_PROP_ID,
+ OSINFO_DEVICE_PROP_VENDOR,
+ OSINFO_DEVICE_PROP_VENDOR_ID,
+ OSINFO_DEVICE_PROP_PRODUCT,
+ OSINFO_DEVICE_PROP_PRODUCT_ID,
+ OSINFO_DEVICE_PROP_NAME,
+ OSINFO_DEVICE_PROP_CLASS,
+ OSINFO_DEVICE_PROP_BUS_TYPE,
+ OSINFO_DEVICE_PROP_SUBSYSTEM,
+};
+#define NUM_DEVICE_PROPS (sizeof device_prop / sizeof device_prop[0])
+
+value
+v2v_osinfo_os_get_all_devices (value osv)
+{
+ CAMLparam1 (osv);
+ CAMLlocal3 (retvalv, linkv, propsv);
+ g_autoptr (OsinfoDeviceList) dev_list = NULL;
+ OsinfoList *ent_list;
+ gint ent_nr;
+
+ retvalv = Val_emptylist;
+ dev_list = osinfo_os_get_all_devices (OsinfoOs_t_val (osv), NULL);
+ ent_list = OSINFO_LIST (dev_list);
+ ent_nr = osinfo_list_get_length (ent_list);
+
+ while (ent_nr > 0) {
+ OsinfoEntity *ent;
+ size_t prop_nr;
+
+ --ent_nr;
+ ent = osinfo_list_get_nth (ent_list, ent_nr);
+
+ propsv = caml_alloc (NUM_DEVICE_PROPS, 0);
+ for (prop_nr = 0; prop_nr < NUM_DEVICE_PROPS; ++prop_nr) {
+ const gchar *prop_val;
+
+ prop_val = osinfo_entity_get_param_value (ent, device_prop[prop_nr]);
+ if (prop_val == NULL)
+ prop_val = "";
+ Store_field (propsv, prop_nr, caml_copy_string (prop_val));
+ }
+
+ linkv = caml_alloc (2, 0);
+ Store_field (linkv, 0, propsv);
+ Store_field (linkv, 1, retvalv);
+ retvalv = linkv;
+ }
+
+ CAMLreturn (retvalv);
+}
diff --git a/convert/libosinfo.ml b/convert/libosinfo.ml
index bd9ca126..78271be2 100644
--- a/convert/libosinfo.ml
+++ b/convert/libosinfo.ml
@@ -32,13 +32,27 @@ type osinfo_device_driver = {
files : string list;
}
+type osinfo_device = {
+ id : string;
+ vendor : string;
+ vendor_id : string;
+ product : string;
+ product_id : string;
+ name : string;
+ class_ : string;
+ bus_type : string;
+ subsystem : string;
+}
+
external osinfo_os_get_id : osinfo_os_t -> string = "v2v_osinfo_os_get_id"
external osinfo_os_get_device_drivers : osinfo_os_t -> osinfo_device_driver list = "v2v_osinfo_os_get_device_drivers"
+external osinfo_os_get_devices : osinfo_os_t -> osinfo_device list = "v2v_osinfo_os_get_all_devices"
class osinfo_os h =
object (self)
method get_id () = osinfo_os_get_id h
method get_device_drivers () = osinfo_os_get_device_drivers h
+ method get_devices () = osinfo_os_get_devices h
end
external osinfo_db_load : unit -> osinfo_db_t = "v2v_osinfo_db_load"
diff --git a/convert/libosinfo.mli b/convert/libosinfo.mli
index 0428ef91..1ece7b41 100644
--- a/convert/libosinfo.mli
+++ b/convert/libosinfo.mli
@@ -29,11 +29,25 @@ type osinfo_device_driver = {
files : string list;
}
+type osinfo_device = {
+ id : string;
+ vendor : string;
+ vendor_id : string;
+ product : string;
+ product_id : string;
+ name : string;
+ class_ : string;
+ bus_type : string;
+ subsystem : string;
+}
+
class osinfo_os : osinfo_os_t -> object
method get_id : unit -> string
(** Return the ID. *)
method get_device_drivers : unit -> osinfo_device_driver list
(** Return the list of device drivers. *)
+ method get_devices : unit -> osinfo_device list
+ (** Return the list of devices. *)
end
(** Minimal OsinfoOs wrapper. *)
--
2.31.1

View File

@ -0,0 +1,77 @@
From 00473c6ac09d85a6b6e1ce0cbe132e31407a2d00 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:08 +0100
Subject: [PATCH] convert/libosinfo_utils: introduce
"string_of_osinfo_device_list"
For debugging purposes, we'll want to print the list of devices returned
by the previously introduced "osinfo_os#get_devices" method.
Format the device list as a nice table.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-8-lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
convert/libosinfo_utils.ml | 35 +++++++++++++++++++++++++++++++++++
convert/libosinfo_utils.mli | 3 +++
2 files changed, 38 insertions(+)
diff --git a/convert/libosinfo_utils.ml b/convert/libosinfo_utils.ml
index 1fc138cc..d5eb082b 100644
--- a/convert/libosinfo_utils.ml
+++ b/convert/libosinfo_utils.ml
@@ -42,3 +42,38 @@ let string_of_osinfo_device_driver { Libosinfo.architecture; location;
(if signed then "signed" else "unsigned")
priority
(String.concat " " files)
+
+let string_of_osinfo_device_list dev_list =
+
+ (* Turn the fields of an "osinfo_device" record into a list. *)
+ let listify { Libosinfo.id; vendor; vendor_id; product; product_id; name;
+ class_; bus_type; subsystem } =
+ [ id; vendor; vendor_id; product; product_id; name;
+ class_; bus_type; subsystem ]
+
+ (* Given a list of strings, and a list of previously known maximum widths,
+ * "increase" each width, if necessary, to the length of the corresponding
+ * string.
+ *)
+ and grow_widths = List.map2 (fun s -> max (String.length s))
+ in
+
+ (* Compute the maximum width for each field in "dev_list". *)
+ let max_widths =
+ List.fold_right grow_widths (List.map listify dev_list)
+ [ 0; 0; 0; 0; 0; 0; 0; 0; 0 ]
+
+ (* Given a list of strings and a list of field widths, format "string1 |
+ * string2 | ... | stringN" such that each field is right-padded to the
+ * corresponding width.
+ *)
+ and columnate strings widths =
+ String.concat " | " (List.map2 (Printf.sprintf "%-*s") widths strings)
+ in
+
+ (* Format "dev_list" as a table by (a) printing one "osinfo_device" record
+ * per line, and (b) right-padding each field of each "osinfo_device" record
+ * to the maximum width of that field.
+ *)
+ String.concat "\n"
+ (List.map (fun dev -> columnate (listify dev) max_widths) dev_list)
diff --git a/convert/libosinfo_utils.mli b/convert/libosinfo_utils.mli
index b3714d22..5a703334 100644
--- a/convert/libosinfo_utils.mli
+++ b/convert/libosinfo_utils.mli
@@ -27,3 +27,6 @@ val get_os_by_short_id : string -> Libosinfo.osinfo_os
val string_of_osinfo_device_driver : Libosinfo.osinfo_device_driver -> string
(** Convert a [osinfo_device_driver] to a printable string for debugging. *)
+
+val string_of_osinfo_device_list : Libosinfo.osinfo_device list -> string
+(** Convert an [osinfo_device] list to a printable string for debugging. *)
--
2.31.1

View File

@ -0,0 +1,77 @@
From 2a2d7e9e1376084670dbf8587549948713341153 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:09 +0100
Subject: [PATCH] convert/libosinfo_utils: introduce
"os_support_of_osinfo_device_list"
Add a helper function for calculating q35 support and virtio-1.0 support
from the list of devices returned by the previously introduced
"osinfo_os#get_devices" method.
(Rather than folding the list into a record of bools, implement the
function explicitly, recursively. Folding wouldn't stop (without abusing
exceptions) once all fields in the record turned "true", but a recursive
function can just return the accumulator at that point.)
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-9-lersek@redhat.com>
[lersek@redhat.com: don't break "in" to a new line after a "let" that
defines a non-function (Rich)]
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
convert/libosinfo_utils.ml | 18 ++++++++++++++++++
convert/libosinfo_utils.mli | 14 ++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/convert/libosinfo_utils.ml b/convert/libosinfo_utils.ml
index d5eb082b..77f22272 100644
--- a/convert/libosinfo_utils.ml
+++ b/convert/libosinfo_utils.ml
@@ -77,3 +77,21 @@ let string_of_osinfo_device_list dev_list =
*)
String.concat "\n"
(List.map (fun dev -> columnate (listify dev) max_widths) dev_list)
+
+type os_support = {
+ q35 : bool;
+ vio10 : bool;
+}
+
+let os_support_of_osinfo_device_list =
+ let rec next accu left =
+ match accu, left with
+ | { q35 = true; vio10 = true }, _
+ | _ , [] ->
+ accu
+ | { q35; vio10 }, { Libosinfo.id } :: tail ->
+ let q35 = q35 || id = "http://qemu.org/chipset/x86/q35"
+ and vio10 = vio10 || id = "http://pcisig.com/pci/1af4/1041" in
+ next { q35; vio10 } tail
+ in
+ next { q35 = false; vio10 = false }
diff --git a/convert/libosinfo_utils.mli b/convert/libosinfo_utils.mli
index 5a703334..ab77ec97 100644
--- a/convert/libosinfo_utils.mli
+++ b/convert/libosinfo_utils.mli
@@ -30,3 +30,17 @@ val string_of_osinfo_device_driver : Libosinfo.osinfo_device_driver -> string
val string_of_osinfo_device_list : Libosinfo.osinfo_device list -> string
(** Convert an [osinfo_device] list to a printable string for debugging. *)
+
+type os_support = {
+ q35 : bool;
+ vio10 : bool;
+}
+(** Tell whether the operating system supports the Q35 board type and/or
+ non-transitional (virtio-1.0-only) virtio devices. (Internally, the
+ virtio-1.0-net device is used as a proxy for the general statement about
+ virtio-1.0.)
+ *)
+
+val os_support_of_osinfo_device_list : Libosinfo.osinfo_device list ->
+ os_support
+(** Get [os_support] from an [osinfo_device] list. *)
--
2.31.1

View File

@ -0,0 +1,207 @@
From f0cea012d0183edf6f7b769c28d5038593f3fe6a Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 6 Jan 2022 15:09:10 +0100
Subject: [PATCH] convert: determine machine type and virtio-1.0 from osinfo
for x86 guests
Determine the machine type and virtio-1.0 support from osinfo, for x86
guests. This connects the previous two parts of this series.
Keep the original logic from commit ac39fa292c31 ("v2v: Set machine type
explicitly for outputs which support it (RHBZ#1581428).", 2020-12-04) for
non-x86 guests, and for the case when libosinfo does not recognize the
guest OS.
Update the "cdrom", "floppy", and "i-ova" test cases, which all use a
(phony) Windows 7 image -- Windows 7 does not support virtio-1.0-only
devices, according to libosinfo.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220106140910.13695-10-lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
---
convert/convert_linux.ml | 51 +++++++++++++++++++++-------------
convert/convert_windows.ml | 32 ++++++++++++++-------
tests/test-v2v-cdrom.expected | 2 +-
tests/test-v2v-floppy.expected | 2 +-
tests/test-v2v-i-ova.xml | 8 +++---
5 files changed, 60 insertions(+), 35 deletions(-)
diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index 3f1114ad..45ce069a 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -123,26 +123,39 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ =
SELinux_relabel.relabel g;
- (* Pivot on the year 2007. Any Linux distro from earlier than
- * 2007 should use i440fx, anything 2007 or newer should use q35.
- * XXX Look up this information in libosinfo in future.
- *)
- let machine =
- match inspect.i_arch, inspect.i_distro, inspect.i_major_version with
- | ("i386"|"x86_64"), "fedora", _ -> Q35
- | ("i386"|"x86_64"), ("rhel"|"centos"|"scientificlinux"|
- "redhat-based"|"oraclelinux"), major ->
- if major <= 4 then I440FX else Q35
- | ("i386"|"x86_64"), ("sles"|"suse-based"|"opensuse"), major ->
- if major < 10 then I440FX else Q35
- | ("i386"|"x86_64"), ("debian"|"ubuntu"|"linuxmint"|
- "kalilinux"), major ->
- if major < 4 then I440FX else Q35
+ let machine, virtio_1_0 =
+ match inspect.i_arch with
+ | ("i386"|"x86_64") ->
+ (try
+ let os = Libosinfo_utils.get_os_by_short_id inspect.i_osinfo in
+ let devices = os#get_devices () in
+ debug "libosinfo devices for OS \"%s\":\n%s" inspect.i_osinfo
+ (Libosinfo_utils.string_of_osinfo_device_list devices);
+ let { Libosinfo_utils.q35; vio10 } =
+ Libosinfo_utils.os_support_of_osinfo_device_list devices in
+ (if q35 then Q35 else I440FX), vio10
+ with
+ | Not_found ->
+ (* Pivot on the year 2007. Any Linux distro from earlier than 2007
+ * should use i440fx, anything 2007 or newer should use q35.
+ *)
+ (match inspect.i_distro, inspect.i_major_version with
+ | "fedora", _ -> Q35
+ | ("rhel"|"centos"|"scientificlinux"|"redhat-based"|"oraclelinux"),
+ major ->
+ if major <= 4 then I440FX else Q35
+ | ("sles"|"suse-based"|"opensuse"), major ->
+ if major < 10 then I440FX else Q35
+ | ("debian"|"ubuntu"|"linuxmint"|"kalilinux"), major ->
+ if major < 4 then I440FX else Q35
- (* reasonable default for all modern Linux kernels *)
- | ("i386"|"x86_64"), _, _ -> Q35
+ (* reasonable default for all modern Linux kernels *)
+ | _, _ -> Q35
+ ), true
+ )
- | _ -> Virt in
+ | _ -> Virt, true
+ in
(* Return guest capabilities from the convert () function. *)
let guestcaps = {
@@ -155,7 +168,7 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ =
gcaps_machine = machine;
gcaps_arch = Utils.kvm_arch inspect.i_arch;
gcaps_acpi = acpi;
- gcaps_virtio_1_0 = true;
+ gcaps_virtio_1_0 = virtio_1_0;
} in
guestcaps
diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
index 30e494ea..1c2d17f2 100644
--- a/convert/convert_windows.ml
+++ b/convert/convert_windows.ml
@@ -238,15 +238,27 @@ let convert (g : G.guestfs) _ inspect _ static_ips =
warning (f_"this guest has Anti-Virus (AV) software and a new virtio block device driver was installed. In some circumstances, AV may prevent new drivers from working (resulting in a 7B boot error). If this happens, try disabling AV before doing the conversion.");
);
- (* Pivot on the year 2007. Any Windows version from earlier than
- * 2007 should use i440fx, anything 2007 or newer should use q35.
- * Luckily this coincides almost exactly with the release of NT 6.
- * XXX Look up this information in libosinfo in future.
- *)
- let machine =
- match inspect.i_arch, inspect.i_major_version with
- | ("i386"|"x86_64"), major -> if major < 6 then I440FX else Q35
- | _ -> Virt in
+ let machine, virtio_1_0 =
+ match inspect.i_arch with
+ | ("i386"|"x86_64") ->
+ (try
+ let os = Libosinfo_utils.get_os_by_short_id inspect.i_osinfo in
+ let devices = os#get_devices () in
+ debug "libosinfo devices for OS \"%s\":\n%s" inspect.i_osinfo
+ (Libosinfo_utils.string_of_osinfo_device_list devices);
+ let { Libosinfo_utils.q35; vio10 } =
+ Libosinfo_utils.os_support_of_osinfo_device_list devices in
+ (if q35 then Q35 else I440FX), vio10
+ with
+ | Not_found ->
+ (* Pivot on the year 2007. Any Windows version from earlier than
+ * 2007 should use i440fx, anything 2007 or newer should use q35.
+ * Luckily this coincides almost exactly with the release of NT 6.
+ *)
+ (if inspect.i_major_version < 6 then I440FX else Q35), true
+ )
+ | _ -> Virt, true
+ in
(* Return guest capabilities from the convert () function. *)
let guestcaps = {
@@ -259,7 +271,7 @@ let convert (g : G.guestfs) _ inspect _ static_ips =
gcaps_machine = machine;
gcaps_arch = Utils.kvm_arch inspect.i_arch;
gcaps_acpi = true;
- gcaps_virtio_1_0 = true;
+ gcaps_virtio_1_0 = virtio_1_0;
} in
guestcaps
diff --git a/tests/test-v2v-cdrom.expected b/tests/test-v2v-cdrom.expected
index 17bd152d..b9504929 100644
--- a/tests/test-v2v-cdrom.expected
+++ b/tests/test-v2v-cdrom.expected
@@ -1,4 +1,4 @@
- <disk type='file' device='disk'>
+ <disk type='file' device='disk' model='virtio-transitional'>
<driver name='qemu' type='raw'/>
<target dev='vda' bus='virtio'/>
</disk>
diff --git a/tests/test-v2v-floppy.expected b/tests/test-v2v-floppy.expected
index a718c21f..f4b67954 100644
--- a/tests/test-v2v-floppy.expected
+++ b/tests/test-v2v-floppy.expected
@@ -1,4 +1,4 @@
- <disk type='file' device='disk'>
+ <disk type='file' device='disk' model='virtio-transitional'>
<driver name='qemu' type='raw'/>
<target dev='vda' bus='virtio'/>
</disk>
diff --git a/tests/test-v2v-i-ova.xml b/tests/test-v2v-i-ova.xml
index 9f3c1974..2b6a8de0 100644
--- a/tests/test-v2v-i-ova.xml
+++ b/tests/test-v2v-i-ova.xml
@@ -21,7 +21,7 @@
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
- <disk type='file' device='disk'>
+ <disk type='file' device='disk' model='virtio-transitional'>
<driver name='qemu' type='raw'/>
<source file='TestOva-sda'/>
<target dev='vda' bus='virtio'/>
@@ -36,16 +36,16 @@
</disk>
<interface type='bridge'>
<source bridge='VM Network'/>
- <model type='virtio'/>
+ <model type='virtio-transitional'/>
</interface>
<video>
<model type='vga' vram='16384' heads='1'/>
</video>
<graphics type='vnc' autoport='yes' port='-1'/>
- <rng model='virtio'>
+ <rng model='virtio-transitional'>
<backend model='random'>/dev/urandom</backend>
</rng>
- <memballoon model='virtio'/>
+ <memballoon model='virtio-transitional'/>
<viosock model='none'/>
<input type='tablet' bus='usb'/>
<input type='mouse' bus='ps2'/>
--
2.31.1

View File

@ -1,4 +1,4 @@
From 5c115d2e7214f1b8bc0c0f19f099bb6e381c6265 Mon Sep 17 00:00:00 2001
From 44314b8d8d201e6043b7148240446c98c726bc95 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sun, 28 Sep 2014 19:14:43 +0100
Subject: [PATCH] RHEL: v2v: Select correct qemu binary for -o qemu mode
@ -29,5 +29,5 @@ index 0aac1eba..c4265703 100644
let flag = Qemuopts.flag cmd
and arg = Qemuopts.arg cmd
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,4 +1,4 @@
From 79d50860b2b16c8668c7bbd3a26972841ec0517d Mon Sep 17 00:00:00 2001
From 1c1eb51b4f7e9d5f1e2aef7d695181a14fbd0a7d Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 30 Sep 2014 10:50:27 +0100
Subject: [PATCH] RHEL: v2v: Disable the --qemu-boot / -oo qemu-boot option
@ -108,5 +108,5 @@ index 47e6e937..503dfb55 100644
s_"How to choose root filesystem";
[ L"vddk-config" ], Getopt.String ("filename", set_input_option_compat "vddk-config"),
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,4 +1,4 @@
From 3d3810f4e8fbde3fa21728c718a0d0ec14efe275 Mon Sep 17 00:00:00 2001
From 281273484f675b3ddba584ddc9751fc74653e67f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 24 Apr 2015 09:45:41 -0400
Subject: [PATCH] RHEL: Fix list of supported sound cards to match RHEL qemu
@ -30,5 +30,5 @@ index d6861d08..a2fccf29 100644
(* Find the UEFI firmware. *)
let find_uefi_firmware guest_arch =
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,4 +1,4 @@
From 68d728c2642f15005811d2878f76f4c31266ff7a Mon Sep 17 00:00:00 2001
From aa4e5271d3fe02f252ace148b89e9894436a79fb Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sun, 30 Aug 2015 03:21:57 -0400
Subject: [PATCH] RHEL: Fixes for libguestfs-winsupport.
@ -100,5 +100,5 @@ index a4cf191d..1ff41f6a 100755
# We also update the Registry several times, for firstboot, and (ONLY
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,4 +1,4 @@
From 9439bad9c940556c33a241c59e38ff35f0ac0284 Mon Sep 17 00:00:00 2001
From a6b21f626a74c436563c14751f19f60a6433e153 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 2 Mar 2017 14:21:37 +0100
Subject: [PATCH] RHEL: v2v: -i disk: force VNC as display (RHBZ#1372671)
@ -22,5 +22,5 @@ index 0d92f256..753938f6 100644
s_sound = None;
s_disks = s_disks;
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,4 +1,4 @@
From 151c1c3c78020c73156d7be66886ca4c92b295ff Mon Sep 17 00:00:00 2001
From 621a424738cb94f387171992af5352305121da6b Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Wed, 8 Mar 2017 11:03:40 +0100
Subject: [PATCH] RHEL: v2v: do not mention SUSE Xen hosts (RHBZ#1430203)
@ -22,5 +22,5 @@ index cd3210bf..e9f336a9 100644
=head1 INPUT FROM XEN
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,4 +1,4 @@
From 77696ce54071f741a44061a7112fb724e3ab25f4 Mon Sep 17 00:00:00 2001
From af0265e36747be9e6e4d7f91af2529f20e91e7ab Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Tue, 26 Mar 2019 09:42:25 +0100
Subject: [PATCH] RHEL: point to KB for supported v2v hypervisors/guests
@ -123,5 +123,5 @@ index 9815f51f..1ffc0f9d 100644
=head2 Guest firmware
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,4 +1,4 @@
From 6b1c1c4a3001a5c8a1adaa020968a390dd593c95 Mon Sep 17 00:00:00 2001
From afec4c531c71de4f98115258d3eee17a25afae5e Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 30 Jun 2021 11:15:52 +0100
Subject: [PATCH] RHEL: Disable -o glance
@ -215,5 +215,5 @@ index 503dfb55..39fef0fa 100644
| `RHV_Upload -> (module Output_rhv_upload.RHVUpload)
| `RHV -> (module Output_rhv.RHV)
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,4 +1,4 @@
From 31a6a8283c5d7ccfe96f67fabb81a21a02631e93 Mon Sep 17 00:00:00 2001
From 39f31f9c86ed94699382b2c4d683fc1fd0d59195 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 2 Dec 2021 11:56:05 +0000
Subject: [PATCH] RHEL: Remove the --in-place option
@ -148,5 +148,5 @@ index 39fef0fa..a1143b68 100644
pr "mac-option\n";
pr "bandwidth-option\n";
--
2.19.1.3.g30247aa5d201
2.31.1

View File

@ -1,2 +1,2 @@
SHA512 (virt-v2v-1.45.95.tar.gz) = 2d408d98d8a67f0aed264cb15fb69d9e5ab4f9b31577ae58a0da7d180f705efb81997308fade3018d16b816a3e3e789927c1a1f03ddc9c02883c37ca0f70e3db
SHA512 (virt-v2v-1.45.95.tar.gz.sig) = cfa919ae26f9497f113c85fa320797eca6977cabc91048cbeacc97e596439fdc93fa9feba2fb3ed1164c7e221dc993344faa4ce07214ee2a697dbd0dc06daf77
SHA512 (virt-v2v-1.45.96.tar.gz) = f4349ce19761db32905395a1ce4bb893eb68823808386edce656bcd452aac1c82d39a6af6e17f226c04e027199cb71b27c42a52bfc4b9153cb31e4c5c1988b49
SHA512 (virt-v2v-1.45.96.tar.gz.sig) = b0bd15eef79267ca93c0af96e5af041fd006dc9e50e25a3afb6a08257bc5ac997690dd5daf993c9fa14428fff2a4e5cca5934adeafc537a47d17c833d004ab1b

View File

@ -14,8 +14,8 @@
Name: virt-v2v
Epoch: 1
Version: 1.45.95
Release: 3%{?dist}
Version: 1.45.96
Release: 1%{?dist}
Summary: Convert a virtual machine to run on KVM
License: GPLv2+
@ -51,20 +51,24 @@ ExclusiveArch: x86_64
# Downstream (RHEL-only) patches.
%if 0%{?rhel}
# Patches.
Patch0001: 0001-input-output-Use-Option.may-for-some-Nbdkit-calls.patch
Patch0002: 0002-input-nbdkit_curl.ml-Fix-typo-in-commented-code.patch
Patch0003: 0003-output_rhv-restrict-block-status-collection-to-the-old-RHV-output.patch
Patch0004: 0004-v2v-Swap-over-the-output-and-conversion-stages.patch
Patch0005: 0005-XXX-v2v-Remove-nbdcopy-request-size-4M-flag.patch
Patch0006: 0006-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-RHBZ-1147313.patch
Patch0007: 0007-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-RHBZ-1147313.patch
Patch0008: 0008-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL-qemu-RHBZ-1176493.patch
Patch0009: 0009-RHEL-Fixes-for-libguestfs-winsupport.patch
Patch0010: 0010-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch
Patch0011: 0011-RHEL-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-1430203.patch
Patch0012: 0012-RHEL-point-to-KB-for-supported-v2v-hypervisors-guests.patch
Patch0013: 0013-RHEL-Disable-o-glance.patch
Patch0014: 0014-RHEL-Remove-the-in-place-option.patch
Patch0001: 0001-lib-types-reformat-string_of_guestcaps.patch
Patch0002: 0002-lib-types-update-string_of_guestcaps.patch
Patch0003: 0003-lib-types-introduce-the-gcaps_virtio_1_0-guest-capab.patch
Patch0004: 0004-output-create_libvirt_xml-pick-virtio-transitional-m.patch
Patch0005: 0005-output-create_json-expose-gcaps_virtio_1_0.patch
Patch0006: 0006-convert-libosinfo-wrap-osinfo_os_get_all_devices.patch
Patch0007: 0007-convert-libosinfo_utils-introduce-string_of_osinfo_d.patch
Patch0008: 0008-convert-libosinfo_utils-introduce-os_support_of_osin.patch
Patch0009: 0009-convert-determine-machine-type-and-virtio-1.0-from-o.patch
Patch0010: 0010-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch
Patch0011: 0011-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch
Patch0012: 0012-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch
Patch0013: 0013-RHEL-Fixes-for-libguestfs-winsupport.patch
Patch0014: 0014-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch
Patch0015: 0015-RHEL-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-1430203.patch
Patch0016: 0016-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch
Patch0017: 0017-RHEL-Disable-o-glance.patch
Patch0018: 0018-RHEL-Remove-the-in-place-option.patch
%endif
%if 0%{patches_touch_autotools}
@ -305,6 +309,12 @@ popd
%changelog
* Thu Jan 06 2022 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.96-1
- Rebase to upstream 1.45.96.
resolves: rhbz#2011713
- Add virtio-transitional for older guests when converting to q35
resolves: rhbz#1942325
* Thu Dec 23 2021 Laszlo Ersek <lersek@redhat.com> - 1:1.45.95-3
- output_rhv: restrict block status collection to the old RHV output
- Rebase from upstream commit 702a511b7f33 to direct child commit 07b12fe99fb9