Compare commits

...

No commits in common. "imports/c9-beta/virt-v2v-1.45.99-2.el9_0" and "c8-beta-stream-rhel" have entirely different histories.

69 changed files with 4787 additions and 1578 deletions

5
.gitignore vendored
View File

@ -1,2 +1,5 @@
SOURCES/RHEV-Application-Provisioning-Tool.exe_4.43-5
SOURCES/libguestfs.keyring
SOURCES/virt-v2v-1.45.99.tar.gz
SOURCES/rhsrvany-fd659e77cdd9da484fdc9dcbe0605c62ec26fa30.tar.gz
SOURCES/rhsrvany.exe
SOURCES/virt-v2v-1.42.0.tar.gz

View File

@ -1,2 +1,5 @@
130adbc011dc0af736465b813c2b22a600c128c1 SOURCES/RHEV-Application-Provisioning-Tool.exe_4.43-5
1bbc40f501a7fef9eef2a39b701a71aee2fea7c4 SOURCES/libguestfs.keyring
23d3b578404a991563d2af88d3118cdbce27a110 SOURCES/virt-v2v-1.45.99.tar.gz
136ff75deb496e48eb448bc4ae156f3911464a90 SOURCES/rhsrvany-fd659e77cdd9da484fdc9dcbe0605c62ec26fa30.tar.gz
2bd96e478fc004cd323b5bd754c856641877dac6 SOURCES/rhsrvany.exe
bdbdc7cca87735af64f7e99c050ead24fa92aa7d SOURCES/virt-v2v-1.42.0.tar.gz

View File

@ -0,0 +1,38 @@
From 2ab37349cf37d0ffdb9929ca24c2a024600a4848 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Thu, 21 May 2020 13:32:21 +0200
Subject: [PATCH] libvirt: make use of libvirt's default auth handler
(RHBZ#1838425)
Use the default libvirt authentication handler as base for ours,
overriding it with our callback only in case we have a password to
supply.
(cherry picked from commit ce66cac50179baf2fb8b404f7eba49048c7819b0)
---
v2v/libvirt_utils.ml | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/v2v/libvirt_utils.ml b/v2v/libvirt_utils.ml
index 7df17b29..4d0b8639 100644
--- a/v2v/libvirt_utils.ml
+++ b/v2v/libvirt_utils.ml
@@ -33,10 +33,14 @@ let auth_for_password_file ?password_file () =
) creds
in
- {
- Libvirt.Connect.credtype = [ Libvirt.Connect.CredentialPassphrase ];
- cb = auth_fn;
- }
+ let base_auth = Libvirt.Connect.get_auth_default () in
+
+ if password_file = None then
+ base_auth
+ else
+ { base_auth with
+ cb = auth_fn;
+ }
let get_domain conn name =
let dom =

View File

@ -0,0 +1,211 @@
From e04f4d6aa0e94a61b40fa6b10a5274ea89cd96a1 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Mon, 25 May 2020 16:52:07 +0200
Subject: [PATCH] -i libvirt: print URI without connecting (RHBZ#1839917)
Pass (again) around the libvirt URI string in the various input_libvirt
subclasses so that input_libvirt#as_options does not need to connect to
print the connection URI.
As related change: pass input_conn as non-optional string parameter in
classes that require one (all but input_libvirt_other, basically). This
avoids the need for extra checks.
(cherry picked from commit 86d87563ee03e86ca9abdcad4f674af66a883006)
---
v2v/input_libvirt.ml | 10 +++++-----
v2v/input_libvirt_other.ml | 12 ++++++++----
v2v/input_libvirt_other.mli | 4 ++--
v2v/input_libvirt_vcenter_https.ml | 4 ++--
v2v/input_libvirt_vcenter_https.mli | 2 +-
v2v/input_libvirt_vddk.ml | 9 ++-------
v2v/input_libvirt_vddk.mli | 4 ++--
v2v/input_libvirt_xen_ssh.ml | 4 ++--
v2v/input_libvirt_xen_ssh.mli | 2 +-
9 files changed, 25 insertions(+), 26 deletions(-)
diff --git a/v2v/input_libvirt.ml b/v2v/input_libvirt.ml
index cd5f351c..352fae94 100644
--- a/v2v/input_libvirt.ml
+++ b/v2v/input_libvirt.ml
@@ -53,22 +53,22 @@ let input_libvirt input_conn input_password input_transport guest =
| Some _, None, _ (* No scheme? *)
| Some _, Some "", _ ->
- Input_libvirt_other.input_libvirt_other libvirt_conn guest
+ Input_libvirt_other.input_libvirt_other libvirt_conn ?input_conn guest
(* vCenter over https. *)
| Some server, Some ("esx"|"gsx"|"vpx"), None ->
Input_libvirt_vcenter_https.input_libvirt_vcenter_https
- libvirt_conn input_password parsed_uri server guest
+ libvirt_conn orig_uri input_password parsed_uri server guest
(* vCenter or ESXi using nbdkit vddk plugin *)
| Some server, Some ("esx"|"gsx"|"vpx"), Some (`VDDK vddk_options) ->
Input_libvirt_vddk.input_libvirt_vddk
- libvirt_conn input_conn input_password vddk_options parsed_uri guest
+ libvirt_conn orig_uri input_password vddk_options parsed_uri guest
(* Xen over SSH *)
| Some server, Some "xen+ssh", _ ->
Input_libvirt_xen_ssh.input_libvirt_xen_ssh
- libvirt_conn input_password parsed_uri server guest
+ libvirt_conn orig_uri input_password parsed_uri server guest
(* Old virt-v2v also supported qemu+ssh://. However I am
* deliberately not supporting this in new virt-v2v. Don't
@@ -79,6 +79,6 @@ let input_libvirt input_conn input_password input_transport guest =
| Some _, Some _, _ ->
warning (f_"no support for remote libvirt connections to '-ic %s'. The conversion may fail when it tries to read the source disks.")
orig_uri;
- Input_libvirt_other.input_libvirt_other libvirt_conn guest
+ Input_libvirt_other.input_libvirt_other libvirt_conn ?input_conn guest
let () = Modules_list.register_input_module "libvirt"
diff --git a/v2v/input_libvirt_other.ml b/v2v/input_libvirt_other.ml
index e00944db..6a19ae52 100644
--- a/v2v/input_libvirt_other.ml
+++ b/v2v/input_libvirt_other.ml
@@ -40,12 +40,16 @@ let error_if_libvirt_does_not_support_json_backingfile () =
error (f_"because of libvirt bug https://bugzilla.redhat.com/1134878 you must EITHER upgrade to libvirt >= 2.1.0 OR set this environment variable:\n\nexport LIBGUESTFS_BACKEND=direct\n\nand then rerun the virt-v2v command.")
(* Superclass. *)
-class virtual input_libvirt libvirt_conn guest =
+class virtual input_libvirt libvirt_conn ?input_conn guest =
object (self)
inherit input
method as_options =
- sprintf "-i libvirt -ic %s %s" (Libvirt.Connect.get_uri self#conn) guest
+ sprintf "-i libvirt%s %s"
+ (match input_conn with
+ | None -> ""
+ | Some uri -> " -ic " ^ uri)
+ guest
method private conn : Libvirt.rw Libvirt.Connect.t =
Lazy.force libvirt_conn
@@ -54,9 +58,9 @@ end
(* Subclass specialized for handling anything that's *not* VMware vCenter
* or Xen.
*)
-class input_libvirt_other libvirt_conn guest =
+class input_libvirt_other libvirt_conn ?input_conn guest =
object (self)
- inherit input_libvirt libvirt_conn guest
+ inherit input_libvirt libvirt_conn ?input_conn guest
method source ?bandwidth () =
debug "input_libvirt_other: source ()";
diff --git a/v2v/input_libvirt_other.mli b/v2v/input_libvirt_other.mli
index c528c3ee..ae2c0c6d 100644
--- a/v2v/input_libvirt_other.mli
+++ b/v2v/input_libvirt_other.mli
@@ -20,11 +20,11 @@
val error_if_libvirt_does_not_support_json_backingfile : unit -> unit
-class virtual input_libvirt : Libvirt.rw Libvirt.Connect.t Lazy.t -> string -> object
+class virtual input_libvirt : Libvirt.rw Libvirt.Connect.t Lazy.t -> ?input_conn:string -> string -> object
method precheck : unit -> unit
method as_options : string
method virtual source : ?bandwidth:Types.bandwidth -> unit -> Types.source * Types.source_disk list
method private conn : Libvirt.rw Libvirt.Connect.t
end
-val input_libvirt_other : Libvirt.rw Libvirt.Connect.t Lazy.t -> string -> Types.input
+val input_libvirt_other : Libvirt.rw Libvirt.Connect.t Lazy.t -> ?input_conn:string -> string -> Types.input
diff --git a/v2v/input_libvirt_vcenter_https.ml b/v2v/input_libvirt_vcenter_https.ml
index 77bc315d..ed2e5eed 100644
--- a/v2v/input_libvirt_vcenter_https.ml
+++ b/v2v/input_libvirt_vcenter_https.ml
@@ -32,9 +32,9 @@ open Printf
(* Subclass specialized for handling VMware vCenter over https. *)
class input_libvirt_vcenter_https
- libvirt_conn input_password parsed_uri server guest =
+ libvirt_conn input_conn input_password parsed_uri server guest =
object (self)
- inherit input_libvirt libvirt_conn guest
+ inherit input_libvirt libvirt_conn ~input_conn guest
val mutable dcPath = ""
diff --git a/v2v/input_libvirt_vcenter_https.mli b/v2v/input_libvirt_vcenter_https.mli
index c2e0f3fe..a12a9815 100644
--- a/v2v/input_libvirt_vcenter_https.mli
+++ b/v2v/input_libvirt_vcenter_https.mli
@@ -18,4 +18,4 @@
(** [-i libvirt] when the source is VMware vCenter *)
-val input_libvirt_vcenter_https : Libvirt.rw Libvirt.Connect.t Lazy.t -> string option -> Xml.uri -> string -> string -> Types.input
+val input_libvirt_vcenter_https : Libvirt.rw Libvirt.Connect.t Lazy.t -> string -> string option -> Xml.uri -> string -> string -> Types.input
diff --git a/v2v/input_libvirt_vddk.ml b/v2v/input_libvirt_vddk.ml
index fbd1e0c6..75fd146e 100644
--- a/v2v/input_libvirt_vddk.ml
+++ b/v2v/input_libvirt_vddk.ml
@@ -99,7 +99,7 @@ class input_libvirt_vddk libvirt_conn input_conn input_password vddk_options
in
object (self)
- inherit input_libvirt libvirt_conn guest as super
+ inherit input_libvirt libvirt_conn ~input_conn guest as super
method precheck () =
error_unless_thumbprint ()
@@ -138,12 +138,7 @@ object (self)
match parsed_uri.Xml.uri_server with
| Some server -> server
| None ->
- match input_conn with
- | Some input_conn ->
- error (f_"-ic %s URL does not contain a host name field")
- input_conn
- | None ->
- error (f_"you must use the -ic parameter. See the virt-v2v-input-vmware(1) manual.") in
+ error (f_"-ic %s URL does not contain a host name field") input_conn in
let user = parsed_uri.Xml.uri_user in
diff --git a/v2v/input_libvirt_vddk.mli b/v2v/input_libvirt_vddk.mli
index 2fc6e9cf..f37d88e7 100644
--- a/v2v/input_libvirt_vddk.mli
+++ b/v2v/input_libvirt_vddk.mli
@@ -25,7 +25,7 @@ val print_input_options : unit -> unit
val parse_input_options : (string * string) list -> vddk_options
(** Print and parse vddk -io options. *)
-val input_libvirt_vddk : Libvirt.rw Libvirt.Connect.t Lazy.t -> string option -> string option -> vddk_options -> Xml.uri -> string -> Types.input
-(** [input_libvirt_vddk libvirt_conn vddk_options parsed_uri guest]
+val input_libvirt_vddk : Libvirt.rw Libvirt.Connect.t Lazy.t -> string -> string option -> vddk_options -> Xml.uri -> string -> Types.input
+(** [input_libvirt_vddk libvirt_conn input_conn vddk_options parsed_uri guest]
creates and returns a {!Types.input} object specialized for reading
the guest disks using the nbdkit vddk plugin. *)
diff --git a/v2v/input_libvirt_xen_ssh.ml b/v2v/input_libvirt_xen_ssh.ml
index bd1235a6..ec366b4a 100644
--- a/v2v/input_libvirt_xen_ssh.ml
+++ b/v2v/input_libvirt_xen_ssh.ml
@@ -30,9 +30,9 @@ open Input_libvirt_other
open Printf
(* Subclass specialized for handling Xen over SSH. *)
-class input_libvirt_xen_ssh libvirt_conn input_password parsed_uri server guest =
+class input_libvirt_xen_ssh libvirt_conn input_conn input_password parsed_uri server guest =
object (self)
- inherit input_libvirt libvirt_conn guest
+ inherit input_libvirt libvirt_conn ~input_conn guest
method precheck () =
if backend_is_libvirt () then
diff --git a/v2v/input_libvirt_xen_ssh.mli b/v2v/input_libvirt_xen_ssh.mli
index 120a52f7..3cbca9d7 100644
--- a/v2v/input_libvirt_xen_ssh.mli
+++ b/v2v/input_libvirt_xen_ssh.mli
@@ -18,4 +18,4 @@
(** [-i libvirt] when the source is Xen *)
-val input_libvirt_xen_ssh : Libvirt.rw Libvirt.Connect.t Lazy.t -> string option -> Xml.uri -> string -> string -> Types.input
+val input_libvirt_xen_ssh : Libvirt.rw Libvirt.Connect.t Lazy.t -> string -> string option -> Xml.uri -> string -> string -> Types.input

View File

@ -0,0 +1,31 @@
From bb94c68c521aa546d3f2e59aa25e388bfd9c5fc5 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Tue, 19 May 2020 12:14:18 +0200
Subject: [PATCH] vCenter: fix parsing of HTTP status string (RHBZ#1837328)
vCenter 7 answers with an HTTP/2 status string, so we cannot extract
the status code from it by using fixed positions in that string.
Hence, pick the status code by reading what's after the whitespace.
Tested with vCenter 6.5 and 7.
(cherry picked from commit d2aa82317964d62fcc8dc7b6737773003d04b998)
---
v2v/vCenter.ml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/v2v/vCenter.ml b/v2v/vCenter.ml
index c28a4ced..4c128b0c 100644
--- a/v2v/vCenter.ml
+++ b/v2v/vCenter.ml
@@ -190,7 +190,9 @@ and fetch_headers_from_url password_file uri sslverify https_url =
| [] ->
dump_response stderr;
error (f_"vcenter: no status code in output of curl command. Is curl installed?")
- | ss -> String.sub (List.hd (List.rev ss)) 9 3 in
+ | ss ->
+ let s = List.hd (List.rev ss) in
+ String.sub s (String.index s ' ' + 1) 3 in
let headers =
List.map (

View File

@ -0,0 +1,94 @@
From 939d57ef4d5bcfa31e9b98104822962b89572481 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 19 May 2020 14:40:01 +0100
Subject: [PATCH] v2v: -o libvirt: Remove cache=none (RHBZ#1837453).
Traditionally if you did live migration (KVM to KVM), you had to
ensure that cache=none was set on all disks of the guest up front.
This was because of quirks in how NFS works (I think the close-to-open
consistency and the fact that during live migration both qemus have
the file open), and we had to assume the worst case that a guest might
be backed by NFS.
Because of this when virt-v2v converts a guest to run on KVM using
libvirt it sets cache=none.
This is not necessary with modern qemu. If qemu supports the
drop-cache property of the file block driver, which libvirt will
automatically detect for us, then libvirt live migration is able to
tell qemu to drop cached data at the right time even if the backing is
NFS.
It also had a significant performance impact. In some synthetic
benchmarks it could show 2 or 3 times slower performance.
Thanks: Ming Xie, Peter Krempa.
(cherry picked from commit 9720f45e0cd9283739fd2a67c19e66912489dfc7)
---
docs/virt-v2v-output-local.pod | 2 +-
tests/test-v2v-cdrom.expected | 2 +-
tests/test-v2v-floppy.expected | 2 +-
tests/test-v2v-i-ova.xml | 2 +-
v2v/create_libvirt_xml.ml | 1 -
5 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/docs/virt-v2v-output-local.pod b/docs/virt-v2v-output-local.pod
index 38df007d..a5f155cb 100644
--- a/docs/virt-v2v-output-local.pod
+++ b/docs/virt-v2v-output-local.pod
@@ -127,7 +127,7 @@ Edit F</var/tmp/NAME.xml> to change F</var/tmp/NAME-sda> to the pool
name. In other words, locate the following bit of XML:
<disk type='file' device='disk'>
- <driver name='qemu' type='raw' cache='none' />
+ <driver name='qemu' type='raw' />
<source file='/var/tmp/NAME-sda' />
<target dev='hda' bus='ide' />
</disk>
diff --git a/tests/test-v2v-cdrom.expected b/tests/test-v2v-cdrom.expected
index e18ea6f2..34d2bf59 100644
--- a/tests/test-v2v-cdrom.expected
+++ b/tests/test-v2v-cdrom.expected
@@ -1,5 +1,5 @@
<disk type='file' device='disk'>
- <driver name='qemu' type='raw' cache='none'/>
+ <driver name='qemu' type='raw'/>
<target dev='vda' bus='virtio'/>
</disk>
<disk device='cdrom' type='file'>
diff --git a/tests/test-v2v-floppy.expected b/tests/test-v2v-floppy.expected
index dd74ed94..a718c21f 100644
--- a/tests/test-v2v-floppy.expected
+++ b/tests/test-v2v-floppy.expected
@@ -1,5 +1,5 @@
<disk type='file' device='disk'>
- <driver name='qemu' type='raw' cache='none'/>
+ <driver name='qemu' type='raw'/>
<target dev='vda' bus='virtio'/>
</disk>
<disk device='floppy' type='file'>
diff --git a/tests/test-v2v-i-ova.xml b/tests/test-v2v-i-ova.xml
index 7c198283..e26f4f83 100644
--- a/tests/test-v2v-i-ova.xml
+++ b/tests/test-v2v-i-ova.xml
@@ -22,7 +22,7 @@
<on_crash>restart</on_crash>
<devices>
<disk type='file' device='disk'>
- <driver name='qemu' type='raw' cache='none'/>
+ <driver name='qemu' type='raw'/>
<source file='TestOva-sda'/>
<target dev='vda' bus='virtio'/>
</disk>
diff --git a/v2v/create_libvirt_xml.ml b/v2v/create_libvirt_xml.ml
index 05553c4f..5a1fba0f 100644
--- a/v2v/create_libvirt_xml.ml
+++ b/v2v/create_libvirt_xml.ml
@@ -336,7 +336,6 @@ let create_libvirt_xml ?pool source targets target_buses guestcaps
e "driver" [
"name", "qemu";
"type", t.target_format;
- "cache", "none"
] [];
(match pool with
| None ->

View File

@ -1,26 +0,0 @@
From 46c843f5d5f19aad7bbfe155d20d5d9f26f8a030 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)
The SDL output mode is not supported in RHEL's qemu-kvm.
---
input/input_disk.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/input/input_disk.ml b/input/input_disk.ml
index 9fd08639..dc3bed6f 100644
--- a/input/input_disk.ml
+++ b/input/input_disk.ml
@@ -76,7 +76,7 @@ module Disk = struct
s_features = [ "acpi"; "apic"; "pae" ];
s_firmware = UnknownFirmware; (* causes virt-v2v to autodetect *)
s_display =
- Some { s_display_type = Window; s_keymap = None; s_password = None;
+ Some { s_display_type = VNC; s_keymap = None; s_password = None;
s_listen = LNoListen; s_port = None };
s_sound = None;
s_disks = s_disks;
--
2.31.1

View File

@ -0,0 +1,48 @@
From f3ea9ceb1c3c9741d4f62d0c1d23b7c94634353a Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 28 May 2020 11:40:45 +0100
Subject: [PATCH] v2v: Remove extraneous '=' when setting bandwidth
(RHBZ#1841096).
Commit c3a54d6aed6dfc65f9ffa59976bb8d20044c03a8 ("v2v: Add standalone
nbdkit module.") was supposed to be a simple refactoring but it broke
the --bandwidth and --bandwidth-file options (amongst other things).
Because of an extra '=' character which was accidentally left over, it
would add an extra character in the nbdkit-rate-filter command line.
For example:
virt-v2v .. --bandwidth 200M
would invoke:
nbdkit .. --filter rate rate==200M
which causes a parse error. The --bandwidth-file option does not
invoke a parse error but does not work, for similar reasons.
Thanks: Ming Xie
(cherry picked from commit a89a084b2d0f6d40716c1d34969f6c49ea28e9b3)
---
v2v/nbdkit_sources.ml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/v2v/nbdkit_sources.ml b/v2v/nbdkit_sources.ml
index 979c3773..402dfd0e 100644
--- a/v2v/nbdkit_sources.ml
+++ b/v2v/nbdkit_sources.ml
@@ -118,11 +118,11 @@ let common_create ?bandwidth ?extra_debug ?extra_env plugin_name plugin_args =
let args =
match bandwidth with
| StaticBandwidth rate ->
- [ "rate=", rate ]
+ [ "rate", rate ]
| DynamicBandwidth (None, filename) ->
- [ "rate-file=", filename ]
+ [ "rate-file", filename ]
| DynamicBandwidth (Some rate, filename) ->
- [ "rate=", rate; "rate-file=", filename ] in
+ [ "rate", rate; "rate-file", filename ] in
cmd, args
)
else cmd, [] in

View File

@ -0,0 +1,46 @@
From 4e0b3de57486613c8f28ef7726df728cccd7624b Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 28 May 2020 10:59:57 +0100
Subject: [PATCH] v2v: -it vddk: Don't use nbdkit readahead filter with VDDK
(RHBZ#1832805).
This filter deliberately tries to coalesce reads into larger requests.
Unfortunately VMware has low limits on the size of requests it can
serve to a VDDK client and the larger requests would break with errors
like this:
nbdkit: vddk[3]: error: [NFC ERROR] NfcFssrvrProcessErrorMsg: received NFC error 5 from server: Failed to allocate the requested 33554456 bytes
We already increase the maximum request size by changing the
configuration on the VMware server, but it's not sufficient for VDDK
with the readahead filter.
As readahead is only an optimization, the simplest solution is to
disable this filter when we're using nbdkit-vddk-plugin.
Thanks: Ming Xie
(cherry picked from commit 1438174488f111fa24420758ba3bf0218dc9ee2a)
---
v2v/nbdkit_sources.ml | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/v2v/nbdkit_sources.ml b/v2v/nbdkit_sources.ml
index 402dfd0e..bfda91a7 100644
--- a/v2v/nbdkit_sources.ml
+++ b/v2v/nbdkit_sources.ml
@@ -97,9 +97,13 @@ let common_create ?bandwidth ?extra_debug ?extra_env plugin_name plugin_args =
let cmd = Nbdkit.add_filter_if_available cmd "retry" in
(* Adding the readahead filter is always a win for our access
- * patterns. However if it doesn't exist don't worry.
+ * patterns. If it doesn't exist don't worry. However it
+ * breaks VMware servers (RHBZ#1832805).
*)
- let cmd = Nbdkit.add_filter_if_available cmd "readahead" in
+ let cmd =
+ if plugin_name <> "vddk" then
+ Nbdkit.add_filter_if_available cmd "readahead"
+ else cmd in
(* Caching extents speeds up qemu-img, especially its consecutive
* block_status requests with req_one=1.

View File

@ -0,0 +1,113 @@
From bcb9f50eee4050e72a532a0b805531dc72105a4f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 1 Jun 2020 17:18:59 +0100
Subject: [PATCH] v2v: nbdkit: Handle password= parameter in common_create.
Just refactoring.
(cherry picked from commit 36c008009a601634ec1c1fbc4f619b21988f075c)
---
v2v/nbdkit_sources.ml | 42 +++++++++++++++++++-----------------------
1 file changed, 19 insertions(+), 23 deletions(-)
diff --git a/v2v/nbdkit_sources.ml b/v2v/nbdkit_sources.ml
index bfda91a7..47832011 100644
--- a/v2v/nbdkit_sources.ml
+++ b/v2v/nbdkit_sources.ml
@@ -58,7 +58,8 @@ let error_unless_nbdkit_compiled_with_selinux config =
error (f_"nbdkit was compiled without SELinux support. You will have to recompile nbdkit with libselinux-devel installed, or else set SELinux to Permissive mode while doing the conversion.")
)
-let common_create ?bandwidth ?extra_debug ?extra_env plugin_name plugin_args =
+let common_create ?bandwidth ?extra_debug ?extra_env password
+ plugin_name plugin_args =
error_unless_nbdkit_working ();
let config = Nbdkit.config () in
error_unless_nbdkit_min_version config;
@@ -136,6 +137,15 @@ let common_create ?bandwidth ?extra_debug ?extra_env plugin_name plugin_args =
List.fold_left (fun cmd (k, v) -> Nbdkit.add_arg cmd k v)
cmd (plugin_args @ rate_args) in
+ (* Handle the password parameter specially. *)
+ let cmd =
+ match password with
+ | NoPassword -> cmd
+ | AskForPassword ->
+ Nbdkit.add_arg cmd "password" "-"
+ | PasswordFile password_file ->
+ Nbdkit.add_arg cmd "password" ("+" ^ password_file) in
+
cmd
(* VDDK libraries are located under lib32/ or lib64/ relative to the
@@ -223,20 +233,16 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
let get_args () = List.rev !args in
add_arg, get_args in
- let password_param =
- match password_file with
- | None ->
- (* nbdkit asks for the password interactively *)
- "password", "-"
- | Some password_file ->
- (* nbdkit reads the password from the file *)
- "password", "+" ^ password_file in
add_arg ("server", server);
add_arg ("user", user);
- add_arg password_param;
add_arg ("vm", sprintf "moref=%s" moref);
add_arg ("file", path);
+ let password =
+ match password_file with
+ | None -> AskForPassword
+ | Some password_file -> PasswordFile password_file in
+
(* The passthrough parameters. *)
Option.may (fun s -> add_arg ("config", s)) config;
Option.may (fun s -> add_arg ("cookie", s)) cookie;
@@ -251,7 +257,7 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
let debug_flag =
if version >= (1, 17, 10) then Some ("vddk.datapath", "0") else None in
- common_create ?bandwidth ?extra_debug:debug_flag ?extra_env:env
+ common_create ?bandwidth ?extra_debug:debug_flag ?extra_env:env password
"vddk" (get_args ())
(* Create an nbdkit module specialized for reading from SSH sources. *)
@@ -267,14 +273,9 @@ let create_ssh ?bandwidth ~password ?port ~server ?user path =
add_arg ("host", server);
Option.may (fun s -> add_arg ("port", s)) port;
Option.may (fun s -> add_arg ("user", s)) user;
- (match password with
- | NoPassword -> ()
- | AskForPassword -> add_arg ("password", "-")
- | PasswordFile password_file -> add_arg ("password", "+" ^ password_file)
- );
add_arg ("path", path);
- common_create ?bandwidth "ssh" (get_args ())
+ common_create ?bandwidth password "ssh" (get_args ())
(* Create an nbdkit module specialized for reading from Curl sources. *)
let create_curl ?bandwidth ?cookie ~password ?(sslverify=true) ?user url =
@@ -287,18 +288,13 @@ let create_curl ?bandwidth ?cookie ~password ?(sslverify=true) ?user url =
add_arg, get_args in
Option.may (fun s -> add_arg ("user", s)) user;
- (match password with
- | NoPassword -> ()
- | AskForPassword -> add_arg ("password", "-")
- | PasswordFile password_file -> add_arg ("password", "+" ^ password_file)
- );
(* https://bugzilla.redhat.com/show_bug.cgi?id=1146007#c10 *)
add_arg ("timeout", "2000");
Option.may (fun s -> add_arg ("cookie", s)) cookie;
if not sslverify then add_arg ("sslverify", "false");
add_arg ("url", url);
- common_create ?bandwidth "curl" (get_args ())
+ common_create ?bandwidth password "curl" (get_args ())
let run cmd =
let sock, _ = Nbdkit.run_unix cmd in

View File

@ -1,219 +0,0 @@
From 95640bac1c00014f94bec5539907fd92d7379ad2 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
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1977539
---
docs/virt-v2v-output-openstack.pod | 56 ++----------------------------
docs/virt-v2v.pod | 20 -----------
output/output_glance.mli | 2 +-
tests/test-v2v-o-glance.sh | 3 ++
v2v/v2v.ml | 7 +---
5 files changed, 7 insertions(+), 81 deletions(-)
diff --git a/docs/virt-v2v-output-openstack.pod b/docs/virt-v2v-output-openstack.pod
index f5a3abad..1ab356e8 100644
--- a/docs/virt-v2v-output-openstack.pod
+++ b/docs/virt-v2v-output-openstack.pod
@@ -10,13 +10,10 @@ virt-v2v-output-openstack - Using virt-v2v to convert guests to OpenStack
[-oo verify-server-certificate=false]
[-oo os-username=admin] [-oo os-*=*]
- virt-v2v [-i* options] -o glance
-
=head1 DESCRIPTION
This page documents how to use L<virt-v2v(1)> to convert guests to run
-on OpenStack. There are two output modes you can select, but only
-I<-o openstack> should be used normally.
+on OpenStack.
=over 4
@@ -27,15 +24,6 @@ Full description: L</OUTPUT TO OPENSTACK>
This is the modern method for uploading to OpenStack via the REST API.
Guests can be directly converted into Cinder volumes.
-=item B<-o glance>
-
-Full description: L</OUTPUT TO GLANCE>
-
-This is the old method for uploading to Glance. Unfortunately Glance
-is not well suited to storing converted guests (since virt-v2v deals
-with "pets" not templated "cattle"), so this method is not recommended
-unless you really know what you are doing.
-
=back
=head1 OUTPUT TO OPENSTACK
@@ -170,50 +158,10 @@ no Cinder volume type is used.
The following options are B<not> supported with OpenStack: I<-oa>,
I<-of>.
-=head1 OUTPUT TO GLANCE
-
-Note this is a legacy option. In most cases you should use
-L</OUTPUT TO OPENSTACK> instead.
-
-To output to OpenStack Glance, use the I<-o glance> option.
-
-This runs the L<glance(1)> CLI program which must be installed on the
-virt-v2v conversion host. For authentication to work, you will need
-to set C<OS_*> environment variables.
-
-Normally there is a file called C<overcloudrc> or C<keystonerc_admin>
-which you can simply C<source> to set everything up.
-
-Virt-v2v adds metadata for the guest to Glance, describing such things
-as the guest operating system and what drivers it requires. The
-command C<glance image-show> will display the metadata as "Property"
-fields such as C<os_type> and C<hw_disk_bus>.
-
-=head2 Glance and sparseness
-
-Glance image upload doesn't appear to correctly handle sparseness.
-For this reason, using qcow2 will be faster and use less space on the
-Glance server. Use the virt-v2v S<I<-of qcow2>> option.
-
-=head2 Glance and multiple disks
-
-If the guest has a single disk, then the name of the disk in Glance
-will be the name of the guest. You can control this using the I<-on>
-option.
-
-Glance doesn't have a concept of associating multiple disks with a
-single guest, and Nova doesn't allow you to boot a guest from multiple
-Glance disks either. If the guest has multiple disks, then the first
-(assumed to be the system disk) will have the name of the guest, and
-the second and subsequent data disks will be called
-C<I<guestname>-disk2>, C<I<guestname>-disk3> etc. It may be best to
-leave the system disk in Glance, and import the data disks to Cinder.
-
=head1 SEE ALSO
L<virt-v2v(1)>,
-L<https://docs.openstack.org/python-openstackclient/latest/cli/man/openstack.html>,
-L<glance(1)>.
+L<https://docs.openstack.org/python-openstackclient/latest/cli/man/openstack.html>.
=head1 AUTHOR
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 9b1e44a1..a1e00db8 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -431,14 +431,6 @@ See L</Networks and bridges> below.
This is the same as I<-o local>.
-=item B<-o> B<glance>
-
-This is a legacy option. You should probably use I<-o openstack>
-instead.
-
-Set the output method to OpenStack Glance. In this mode the converted
-guest is uploaded to Glance. See L<virt-v2v-output-openstack(1)>.
-
=item B<-o> B<json>
Set the output method to I<json>.
@@ -1170,11 +1162,6 @@ and output methods may use disk space, as outlined in the table below.
This temporarily places a full copy of the uncompressed source disks
in C<$VIRT_V2V_TMPDIR> (or F</var/tmp>).
-=item I<-o glance>
-
-This temporarily places a full copy of the output disks in
-C<$VIRT_V2V_TMPDIR> (or F</var/tmp>).
-
=item I<-o local>
=item I<-o qemu>
@@ -1358,13 +1345,6 @@ instance.
Because of how Cinder volumes are presented as F</dev> block devices,
using I<-o openstack> normally requires that virt-v2v is run as root.
-=item Writing to Glance
-
-This does I<not> need root (in fact it probably wont work), but may
-require either a special user and/or for you to source a script that
-sets authentication environment variables. Consult the Glance
-documentation.
-
=item Writing to block devices
This normally requires root. See the next section.
diff --git a/output/output_glance.mli b/output/output_glance.mli
index 972320a2..9befc461 100644
--- a/output/output_glance.mli
+++ b/output/output_glance.mli
@@ -18,4 +18,4 @@
(** [-o glance] output mode. *)
-module Glance : Output.OUTPUT
+(*module Glance : Output.OUTPUT*)
diff --git a/tests/test-v2v-o-glance.sh b/tests/test-v2v-o-glance.sh
index c0db9115..074b5e16 100755
--- a/tests/test-v2v-o-glance.sh
+++ b/tests/test-v2v-o-glance.sh
@@ -20,6 +20,9 @@
set -e
+# Feature is disabled in RHEL 9.
+exit 77
+
source ./functions.sh
set -e
set -x
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index a66fa285..c9ddce36 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -205,7 +205,6 @@ let rec main () =
if !output_mode <> `Not_set then
error (f_"%s option used more than once on the command line") "-o";
match mode with
- | "glance" -> output_mode := `Glance
| "libvirt" -> output_mode := `Libvirt
| "disk" | "local" -> output_mode := `Disk
| "json" -> output_mode := `JSON
@@ -257,7 +256,7 @@ let rec main () =
s_"Map network in to out";
[ L"no-trim" ], Getopt.String ("-", no_trim_warning),
s_"Ignored for backwards compatibility";
- [ S 'o' ], Getopt.String ("glance|json|libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode),
+ [ S 'o' ], Getopt.String ("json|libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode),
s_"Set output mode (default: libvirt)";
[ M"oa" ], Getopt.String ("sparse|preallocated", set_output_alloc),
s_"Set output allocation mode";
@@ -325,8 +324,6 @@ virt-v2v -i libvirtxml guest-domain.xml -o local -os /var/tmp
virt-v2v -i disk disk.img -o local -os /var/tmp
-virt-v2v -i disk disk.img -o glance
-
There is a companion front-end called \"virt-p2v\" which comes as an
ISO or CD image that can be booted on physical machines.
@@ -396,7 +393,6 @@ read the man page virt-v2v(1).
pr "input:libvirtxml\n";
pr "input:ova\n";
pr "input:vmx\n";
- pr "output:glance\n";
pr "output:json\n";
pr "output:libvirt\n";
pr "output:local\n";
@@ -486,7 +482,6 @@ read the man page virt-v2v(1).
| `Disk -> (module Output_disk.Disk)
| `Null -> (module Output_null.Null)
| `QEmu -> (module Output_qemu.QEMU)
- | `Glance -> (module Output_glance.Glance)
| `Openstack -> (module Output_openstack.Openstack)
| `RHV_Upload -> (module Output_rhv_upload.RHVUpload)
| `RHV -> (module Output_rhv.RHV)
--
2.31.1

View File

@ -0,0 +1,54 @@
From 89ab50eb404664ac3522294f2f46a1c904a28abd Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 1 Jun 2020 17:35:58 +0100
Subject: [PATCH] v2v: nbdkit: Don't use password=- parameter (RHBZ#1842440).
This was broken with all nbdkit plugins, some in more ways than others.
Because we start nbdkit in the background and wait 30 seconds for it
to start running, the user had only 30 seconds to type in a password
before we timed out the process. In addition with the VDDK plugin
password=- had been broken ever since we changed the plugin to use a
reexec
(https://www.redhat.com/archives/libguestfs/2020-June/msg00012.html).
The solution is to read the password ourselves and pass it to nbdkit
as a private file.
(cherry picked from commit 16b551c77c88219a2f68e2fc37daf2dc4d88e4ed)
---
v2v/nbdkit_sources.ml | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/v2v/nbdkit_sources.ml b/v2v/nbdkit_sources.ml
index 47832011..f5e91911 100644
--- a/v2v/nbdkit_sources.ml
+++ b/v2v/nbdkit_sources.ml
@@ -142,7 +142,26 @@ let common_create ?bandwidth ?extra_debug ?extra_env password
match password with
| NoPassword -> cmd
| AskForPassword ->
- Nbdkit.add_arg cmd "password" "-"
+ (* Because we will start nbdkit in the background and then wait
+ * for 30 seconds for it to start up, we cannot use the
+ * password=- feature of nbdkit to read the password
+ * interactively (since in the words of the movie the user has
+ * only "30 seconds to comply"). In any case this feature broke
+ * in the VDDK plugin in nbdkit 1.18 and 1.20. So in the
+ * AskForPassword case we read the password here.
+ *)
+ printf "password: ";
+ let open Unix in
+ let orig = tcgetattr stdin in
+ let tios = { orig with c_echo = false } in
+ tcsetattr stdin TCSAFLUSH tios; (* Disable echo. *)
+ let password = read_line () in
+ tcsetattr stdin TCSAFLUSH orig; (* Restore echo. *)
+ printf "\n";
+ let password_file = Filename.temp_file "v2vnbdkit" ".txt" in
+ unlink_on_exit password_file;
+ with_open_out password_file (fun chan -> output_string chan password);
+ Nbdkit.add_arg cmd "password" ("+" ^ password_file)
| PasswordFile password_file ->
Nbdkit.add_arg cmd "password" ("+" ^ password_file) in

View File

@ -1,143 +0,0 @@
From c7c14141d1c985dbba8749f9209b78d96200c2b3 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
This disables the virt-v2v --in-place option which we do not
wish to support in RHEL.
---
docs/virt-v2v.pod | 49 -----------------------------------------------
v2v/v2v.ml | 8 --------
2 files changed, 57 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index a1e00db8..a3fc3dc8 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -8,10 +8,6 @@ virt-v2v - Convert a guest to use KVM
[-o mode] [other -o* options]
[guest|filename]
- virt-v2v --in-place
- [-i mode] [other -i* options]
- [guest|filename]
-
=head1 DESCRIPTION
Virt-v2v converts a single guest from a foreign hypervisor to run on
@@ -37,12 +33,6 @@ The input and output sides of virt-v2v are separate and unrelated.
Virt-v2v can read from any input and write to any output. Therefore
these sides of virt-v2v are documented separately in this manual.
-Virt-v2v normally copies from the input to the output, called "copying
-mode". In this case the source guest is always left unchanged.
-In-place conversion (I<--in-place>) only uses the I<-i*> options and
-modifies the source guest in-place. (See L</In-place conversion>
-below.)
-
=head2 Other virt-v2v topics
L<virt-v2v-support(1)> — Supported hypervisors, virtualization
@@ -289,20 +279,6 @@ For I<-i disk> only, this specifies the format of the input disk
image. For other input methods you should specify the input
format in the metadata.
-=item B<--in-place>
-
-Do not create an output virtual machine in the target hypervisor.
-Instead, adjust the guest OS in the source VM to run in the input
-hypervisor.
-
-This mode is meant for integration with other toolsets, which take the
-responsibility of converting the VM configuration, providing for
-rollback in case of errors, transforming the storage, etc.
-
-See L</In-place conversion> below.
-
-Conflicts with all I<-o *> options.
-
=item B<-io> OPTION=VALUE
Set input option(s) related to the current input mode or transport.
@@ -1417,31 +1393,6 @@ that instead.
</devices>
</domain>
-=head2 In-place conversion
-
-It is also possible to use virt-v2v in scenarios where a foreign VM
-has already been imported into a KVM-based hypervisor, but still needs
-adjustments in the guest to make it run in the new virtual hardware.
-
-In that case it is assumed that a third-party tool has created the
-target VM in the supported KVM-based hypervisor based on the source VM
-configuration and contents, but using virtual devices more appropriate
-for KVM (e.g. virtio storage and network, etc.).
-
-Then, to make the guest OS boot and run in the changed environment,
-one can use:
-
- virt-v2v -ic qemu:///system converted_vm --in-place
-
-Virt-v2v will analyze the configuration of C<converted_vm> in the
-C<qemu:///system> libvirt instance, and apply various fixups to the
-guest OS configuration to make it match the VM configuration. This
-may include installing virtio drivers, configuring the bootloader, the
-mountpoints, the network interfaces, and so on.
-
-Should an error occur during the operation, virt-v2v exits with an
-error code leaving the VM in an undefined state.
-
=head2 Machine readable output
The I<--machine-readable> option can be used to make the output more
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index c9ddce36..6859a02c 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -183,7 +183,6 @@ let rec main () =
let output_storage = ref None in
(* Other options that we handle here. *)
- let in_place = ref false in
let print_source = ref false in
let input_mode = ref `Not_set in
@@ -248,8 +247,6 @@ let rec main () =
s_"Use password from file to connect to input hypervisor";
[ M"it" ], Getopt.String ("transport", set_string_option_once "-it" input_transport),
s_"Input transport";
- [ L"in-place" ], Getopt.Set in_place,
- s_"Only tune the guest in the input VM";
[ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac),
s_"Map NIC to network or bridge or assign static IP";
[ S 'n'; L"network" ], Getopt.String ("in:out", add_network),
@@ -347,7 +344,6 @@ read the man page virt-v2v(1).
(* Dereference the arguments. *)
let args = List.rev !args in
- let in_place = !in_place in
let input_conn = !input_conn in
let input_mode = !input_mode in
let input_transport =
@@ -367,9 +363,6 @@ read the man page virt-v2v(1).
let root_choice = !root_choice in
let static_ips = !static_ips in
- (* --in-place isn't implemented yet - TODO *)
- if in_place then error "XXX --in-place option is not implemented yet";
-
(* No arguments and machine-readable mode? Print out some facts
* about what this binary supports.
*)
@@ -383,7 +376,6 @@ read the man page virt-v2v(1).
pr "vddk\n";
pr "colours-option\n";
pr "vdsm-compat-option\n";
- pr "in-place\n";
pr "io/oo\n";
pr "mac-option\n";
pr "bandwidth-option\n";
--
2.31.1

View File

@ -0,0 +1,41 @@
From a8f3d2b2e87aead9f6a1db66dccebb6239ddf004 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Fri, 19 Jun 2020 17:57:36 +0200
Subject: [PATCH] libosinfo: declare autocleanup funcs with libosinfo < 1.8.0
libosinfo 1.8.0 declares them automatically for all of its classes, so
there is no need to declare ours. This requires fixing the definition of
the IS_LIBOSINFO_VERSION macro to wrap its body in brackets.
While in the process, simplify the workaround for a related bug by
removing a now-useless check.
(cherry picked from commit c1caf7132000a4560c3e20c2753978e8dd10036a)
---
v2v/libosinfo-c.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/v2v/libosinfo-c.c b/v2v/libosinfo-c.c
index 1ab6bb4d..497840c2 100644
--- a/v2v/libosinfo-c.c
+++ b/v2v/libosinfo-c.c
@@ -40,12 +40,18 @@
#define V2V_LIBOSINFO_VERSION_HEX \
MAKE_VERSION_HEX(OSINFO_MAJOR_VERSION, OSINFO_MINOR_VERSION, OSINFO_MICRO_VERSION)
#define IS_LIBOSINFO_VERSION(maj, min, mic) \
- V2V_LIBOSINFO_VERSION_HEX >= MAKE_VERSION_HEX(maj, min, mic)
+ (V2V_LIBOSINFO_VERSION_HEX >= MAKE_VERSION_HEX(maj, min, mic))
+/*
+ * libosinfo 1.8.0 provides auto-cleanup functions for all its classes,
+ * so avoid declaring our own.
+ */
+#if !IS_LIBOSINFO_VERSION(1, 8, 0)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OsinfoFilter, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OsinfoLoader, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OsinfoList, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OsinfoOsList, g_object_unref)
+#endif
typedef OsinfoDb *OsinfoDb_t;
typedef OsinfoOs *OsinfoOs_t;

View File

@ -1,55 +0,0 @@
From 67ebe6585e7db9cfc1f01de9777f780db42868f2 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 22 Mar 2022 13:39:57 +0000
Subject: [PATCH] lib: Remove Utils.metaversion
This was used before we turned the helpers into OCaml modules but is
now dead code, remove it.
Fixes: commit 4de22686fe74e1711efd9bfed3f663b67e7ad69e
Fixes: commit 724ecb5e887e5b71db836143ec0c0d8a20b05903
Fixes: commit 5609c73c615a8f12c5c6d50908bb4761bdc16173
(cherry picked from commit c208bc97d863aa43857c72608a1fc57ab50047ed)
---
lib/utils.ml | 2 --
lib/utils.mli | 11 -----------
2 files changed, 13 deletions(-)
diff --git a/lib/utils.ml b/lib/utils.ml
index 7b16dd8b..4f0ff67a 100644
--- a/lib/utils.ml
+++ b/lib/utils.ml
@@ -164,8 +164,6 @@ let rec wait_for_file filename timeout =
wait_for_file filename (timeout-1)
)
-let metaversion = Digest.to_hex (Digest.string Config.package_version_full)
-
let with_nbd_connect_unix ?(meta_contexts = []) ~socket f =
let nbd = NBD.create () in
protect
diff --git a/lib/utils.mli b/lib/utils.mli
index 76a2ec8c..3f8e4b3c 100644
--- a/lib/utils.mli
+++ b/lib/utils.mli
@@ -67,17 +67,6 @@ val wait_for_file : string -> int -> bool
(** [wait_for_file filename timeout] waits up to [timeout] seconds for
[filename] to appear. It returns [true] if the file appeared. *)
-val metaversion : string
-(** When writing the metadata files between versions we serialize this
- string first to ensure the binary metadata blob is compatible.
-
- This prevents mixing and matching helpers between incompatible
- versions of virt-v2v (which could cause a crash) and discourages
- people from trying to write their own metadata.
-
- Eventually we may switch to using an "open metadata" format instead
- (eg. XML). *)
-
val with_nbd_connect_unix : ?meta_contexts:string list ->
socket:string ->
(NBD.t -> 'a) ->
--
2.31.1

View File

@ -0,0 +1,57 @@
From 6aec975c07d60a2518d3f16ee91db1d03a704882 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 30 Jul 2020 14:01:48 +0100
Subject: [PATCH] v2v: Use common documentation for --keys-from-stdin.
(cherry picked from commit 3f9b5f26398694a8a496eae85525e3be5c4b9cca)
---
common | 2 +-
docs/virt-v2v.pod | 11 ++++-------
2 files changed, 5 insertions(+), 8 deletions(-)
Submodule common be42b0b8..5ea1baec:
diff --git a/common/options/Makefile.am b/common/options/Makefile.am
index b38fedc7..f7ea7493 100644
--- a/common/options/Makefile.am
+++ b/common/options/Makefile.am
@@ -19,6 +19,7 @@ include $(top_srcdir)/subdir-rules.mk
EXTRA_DIST = \
key-option.pod \
+ keys-from-stdin-option.pod \
blocksize-option.pod
# liboptions.la contains guestfish code which is used in other
diff --git a/common/options/keys-from-stdin-option.pod b/common/options/keys-from-stdin-option.pod
new file mode 100644
index 00000000..03c5339b
--- /dev/null
+++ b/common/options/keys-from-stdin-option.pod
@@ -0,0 +1,4 @@
+=item B<--keys-from-stdin>
+
+Read key or passphrase parameters from stdin. The default is
+to try to read passphrases from the user by opening F</dev/tty>.
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index a00fa8af..74934eb4 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -382,14 +382,11 @@ through VDDK.
__INCLUDE:key-option.pod__
-=item B<--keys-from-stdin>
+__INCLUDE:keys-from-stdin-option.pod__
-Read key or passphrase parameters from stdin. The default is
-to try to read passphrases from the user by opening F</dev/tty>.
-
-Note this options only applies to keys and passphrases for encrypted
-devices and partitions, not for passwords used to connect to remote
-servers.
+Note I<--keys-from-stdin> only applies to keys and passphrases for
+encrypted devices and partitions, not for passwords used to connect to
+remote servers.
=item B<--mac> aa:bb:cc:dd:ee:ffB<:network:>out

View File

@ -0,0 +1,23 @@
From 37ae5e04bd5f95c0c8a462dc6ef3fbdcfff4af75 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 30 Jul 2020 14:10:18 +0100
Subject: [PATCH] docs: Multiple keys must be supplied one per line
(RHBZ#1858765).
(cherry picked from commit 7ba65d14c0139dcf7fec45d33cee67c0f6737dd2)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 5ea1baec..9338df5e:
diff --git a/common/options/keys-from-stdin-option.pod b/common/options/keys-from-stdin-option.pod
index 03c5339b..83790394 100644
--- a/common/options/keys-from-stdin-option.pod
+++ b/common/options/keys-from-stdin-option.pod
@@ -2,3 +2,6 @@
Read key or passphrase parameters from stdin. The default is
to try to read passphrases from the user by opening F</dev/tty>.
+
+If there are multiple encrypted devices then you may need to supply
+multiple keys on stdin, one per line.

View File

@ -1,169 +0,0 @@
From d604830d0da31280c347346343dc880e14965cf8 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 22 Mar 2022 13:49:20 +0000
Subject: [PATCH] lib, v2v: Move common code for creating v2v directory to
Utils
I have also renamed the directory in the code from "tmpdir" to
"v2vdir" since tmpdir was a bit generic and didn't accurately describe
what this directory is for.
This is simple refactoring.
(cherry picked from commit 5a60e9a4f6e68d50c6b22eb0c8608aef563bf516)
---
lib/utils.ml | 9 +++++++++
lib/utils.mli | 3 +++
v2v/v2v.ml | 37 ++++++++++++++-----------------------
v2v/v2v_unit_tests.ml | 1 +
4 files changed, 27 insertions(+), 23 deletions(-)
diff --git a/lib/utils.ml b/lib/utils.ml
index 4f0ff67a..876a44c6 100644
--- a/lib/utils.ml
+++ b/lib/utils.ml
@@ -22,6 +22,7 @@ open Printf
open Std_utils
open Tools_utils
+open Unix_utils
open Common_gettext.Gettext
let large_tmpdir =
@@ -155,6 +156,14 @@ let error_if_no_ssh_agent () =
with Not_found ->
error (f_"ssh-agent authentication has not been set up ($SSH_AUTH_SOCK is not set). This is required by qemu to do passwordless ssh access. See the virt-v2v(1) man page for more information.")
+(* Create the directory containing inX and outX sockets. *)
+let create_v2v_directory () =
+ let d = Mkdtemp.temp_dir "v2v." in
+ let running_as_root = Unix.geteuid () = 0 in
+ if running_as_root then Unix.chmod d 0o711;
+ On_exit.rmdir d;
+ d
+
(* Wait for a file to appear until a timeout. *)
let rec wait_for_file filename timeout =
if Sys.file_exists filename then true
diff --git a/lib/utils.mli b/lib/utils.mli
index 3f8e4b3c..c571cca5 100644
--- a/lib/utils.mli
+++ b/lib/utils.mli
@@ -63,6 +63,9 @@ val backend_is_libvirt : unit -> bool
val error_if_no_ssh_agent : unit -> unit
+val create_v2v_directory : unit -> string
+(** Create the directory containing inX and outX sockets. *)
+
val wait_for_file : string -> int -> bool
(** [wait_for_file filename timeout] waits up to [timeout] seconds for
[filename] to appear. It returns [true] if the file appeared. *)
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index 6859a02c..71dd1c4d 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -37,17 +37,8 @@ open Utils
let mac_re = PCRE.compile ~anchored:true "([[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}):(network|bridge|ip):(.*)"
let mac_ip_re = PCRE.compile ~anchored:true "([[:xdigit:]]|:|\\.)+"
-(* Create the temporary directory to control conversion.
- *
- * Because it contains sockets, if we're running as root then
- * we must make it executable by world.
- *)
-let tmpdir =
- let tmpdir = Mkdtemp.temp_dir "v2v." in
- let running_as_root = geteuid () = 0 in
- if running_as_root then chmod tmpdir 0o711;
- On_exit.rmdir tmpdir;
- tmpdir
+(* Create the temporary directory to control conversion. *)
+let v2vdir = create_v2v_directory ()
let rec main () =
let set_string_option_once optname optref arg =
@@ -523,7 +514,7 @@ read the man page virt-v2v(1).
(* Start the input module (runs an NBD server in the background). *)
message (f_"Setting up the source: %s")
(Input_module.to_string input_options args);
- let source = Input_module.setup tmpdir input_options args in
+ let source = Input_module.setup v2vdir input_options args in
(* If --print-source then print the source metadata and exit. *)
if print_source then (
@@ -540,28 +531,28 @@ read the man page virt-v2v(1).
let output_poptions = Output_module.parse_options output_options source in
(* Do the conversion. *)
- with_open_out (tmpdir // "convert") (fun _ -> ());
- let inspect, target_meta = Convert.convert tmpdir conv_options source in
- unlink (tmpdir // "convert");
+ with_open_out (v2vdir // "convert") (fun _ -> ());
+ let inspect, target_meta = Convert.convert v2vdir conv_options source in
+ unlink (v2vdir // "convert");
(* Start the output module (runs an NBD server in the background). *)
message (f_"Setting up the destination: %s")
(Output_module.to_string output_options);
- let output_t = Output_module.setup tmpdir output_poptions source in
+ let output_t = Output_module.setup v2vdir output_poptions source in
(* Debug the v2vdir. *)
if verbose () then (
- let cmd = sprintf "ls -alZ %s 1>&2" (quote tmpdir) in
+ let cmd = sprintf "ls -alZ %s 1>&2" (quote v2vdir) in
ignore (Sys.command cmd)
);
(* Do the copy. *)
- with_open_out (tmpdir // "copy") (fun _ -> ());
+ with_open_out (v2vdir // "copy") (fun _ -> ());
(* Get the list of disks and corresponding sockets. *)
let rec loop acc i =
- let input_socket = sprintf "%s/in%d" tmpdir i
- and output_socket = sprintf "%s/out%d" tmpdir i in
+ let input_socket = sprintf "%s/in%d" v2vdir i
+ and output_socket = sprintf "%s/out%d" v2vdir i in
if Sys.file_exists input_socket && Sys.file_exists output_socket then
loop ((i, input_socket, output_socket) :: acc) (i+1)
else
@@ -591,11 +582,11 @@ read the man page virt-v2v(1).
) disks;
(* End of copying phase. *)
- unlink (tmpdir // "copy");
+ unlink (v2vdir // "copy");
(* Do the finalization step. *)
message (f_"Creating output metadata");
- Output_module.finalize tmpdir output_poptions output_t
+ Output_module.finalize v2vdir output_poptions output_t
source inspect target_meta;
message (f_"Finishing off");
@@ -604,7 +595,7 @@ read the man page virt-v2v(1).
* use the presence or absence of the file to determine if
* on-success or on-fail cleanup is required.
*)
- with_open_out (tmpdir // "done") (fun _ -> ())
+ with_open_out (v2vdir // "done") (fun _ -> ())
(* Conversion can fail or hang if there is insufficient free space in
* the large temporary directory. Some input modules use large_tmpdir
diff --git a/v2v/v2v_unit_tests.ml b/v2v/v2v_unit_tests.ml
index 889f7998..bf5306c4 100644
--- a/v2v/v2v_unit_tests.ml
+++ b/v2v/v2v_unit_tests.ml
@@ -26,6 +26,7 @@ open Std_utils
open Tools_utils
open Types
+open Utils
let inspect_defaults = {
i_type = ""; i_distro = ""; i_osinfo = ""; i_arch = "";
--
2.31.1

View File

@ -0,0 +1,123 @@
From fd1cbaa0907b30f639497c38953fe605bfc68ad0 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 28 Jul 2020 13:20:10 +0100
Subject: [PATCH] v2v: Check that --mac :ip: parameters are sensible
(RHBZ#1858775).
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This is not a complete check since IP addresses come in many forms,
but this at least stops nonsense being written through to the Windows
firstboot script.
$ virt-v2v --mac 11:22:33:44:55:66:ip:hello,world,999,invalid -i disk test1.img -o null
virt-v2v: error: cannot parse --mac ip ipaddr: doesnt look like
“hello” is an IP address
$ virt-v2v --mac 11:22:33:44:55:66:ip:192.168.0.10,192.168.0.1,999,192.168.2.1,192.168.2.2 -i disk test1.img -o null
virt-v2v: error: --mac ip prefix length field is out of range
Thanks: Zi Liu
(cherry picked from commit e8bcf9615490447e1b53a8b0d3e9d202ab178cf0)
---
v2v/cmdline.ml | 55 ++++++++++++++++++++++++++++++++------------------
1 file changed, 35 insertions(+), 20 deletions(-)
diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
index 249137ab..3b74f307 100644
--- a/v2v/cmdline.ml
+++ b/v2v/cmdline.ml
@@ -47,6 +47,7 @@ type cmdline = {
(* Matches --mac command line parameters. *)
let mac_re = PCRE.compile ~anchored:true "([[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}):(network|bridge|ip):(.*)"
+let mac_ip_re = PCRE.compile ~anchored:true "([[:xdigit:]]|:|\\.)+"
let parse_cmdline () =
let bandwidth = ref None in
@@ -102,7 +103,7 @@ let parse_cmdline () =
let network_map = Networks.create () in
let static_ips = ref [] in
- let add_network str =
+ let rec add_network str =
match String.split ":" str with
| "", "" ->
error (f_"invalid -n/--network parameter")
@@ -110,8 +111,7 @@ let parse_cmdline () =
Networks.add_default_network network_map out
| in_, out ->
Networks.add_network network_map in_ out
- in
- let add_bridge str =
+ and add_bridge str =
match String.split ":" str with
| "", "" ->
error (f_"invalid -b/--bridge parameter")
@@ -119,8 +119,7 @@ let parse_cmdline () =
Networks.add_default_bridge network_map out
| in_, out ->
Networks.add_bridge network_map in_ out
- in
- let add_mac str =
+ and add_mac str =
if not (PCRE.matches mac_re str) then
error (f_"cannot parse --mac \"%s\" parameter") str;
let mac = PCRE.sub 1 and out = PCRE.sub 3 in
@@ -130,24 +129,40 @@ let parse_cmdline () =
| "bridge" ->
Networks.add_mac network_map mac Bridge out
| "ip" ->
- let add if_mac_addr if_ip_address if_default_gateway
- if_prefix_length if_nameservers =
- List.push_back static_ips
- { if_mac_addr; if_ip_address; if_default_gateway;
- if_prefix_length; if_nameservers }
- in
(match String.nsplit "," out with
- | [] ->
- error (f_"invalid --mac ip option")
- | [ip] -> add mac ip None None []
- | [ip; gw] -> add mac ip (Some gw) None []
+ | [] -> error (f_"invalid --mac ip option")
+ | [ip] -> add_static_ip mac ip None None []
+ | [ip; gw] -> add_static_ip mac ip (Some gw) None []
| ip :: gw :: len :: nameservers ->
- let len =
- try int_of_string len with
- | Failure _ -> error (f_"cannot parse --mac ip prefix length field as an integer: %s") len in
- add mac ip (Some gw) (Some len) nameservers
- );
+ add_static_ip mac ip (Some gw) (Some len) nameservers
+ )
| _ -> assert false
+ and add_static_ip if_mac_addr if_ip_address if_default_gateway
+ if_prefix_length_str if_nameservers =
+ (* Check the IP addresses and prefix length are sensible. This
+ * is only a very simple test that they are sane, since IP addresses
+ * come in too many valid forms to check thoroughly.
+ *)
+ let rec error_unless_ip_addr what addr =
+ if not (PCRE.matches mac_ip_re addr) then
+ error (f_"cannot parse --mac ip %s: doesnt look like “%s” is an IP address") what addr
+ in
+ error_unless_ip_addr "ipaddr" if_ip_address;
+ Option.may (error_unless_ip_addr "gw") if_default_gateway;
+ List.iter (error_unless_ip_addr "nameserver") if_nameservers;
+ let if_prefix_length =
+ match if_prefix_length_str with
+ | None -> None
+ | Some len ->
+ let len =
+ try int_of_string len with
+ | Failure _ -> error (f_"cannot parse --mac ip prefix length field as an integer: %s") len in
+ if len < 0 || len > 128 then
+ error (f_"--mac ip prefix length field is out of range");
+ Some len in
+ List.push_back static_ips
+ { if_mac_addr; if_ip_address; if_default_gateway;
+ if_prefix_length; if_nameservers }
in
let no_trim_warning _ =

View File

@ -1,44 +0,0 @@
From e001191c79e3e890d433fa237deda2332773ab97 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 22 Mar 2022 15:36:00 +0000
Subject: [PATCH] v2v: Move creation of v2v directory until after option
parsing
Only after option parsing does the -v (verbose) option take effect,
and so any debug messages emitted before this point are not seen. In
particular, debug messages emitted when creating the v2v directory
were lost. In any case there's no point creating this directory until
nearer the point when we might actually need it.
(cherry picked from commit 88aaf8263ae89a40e72197ba58f08bc777dc59c3)
---
v2v/v2v.ml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index 71dd1c4d..661f2dec 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -37,9 +37,6 @@ open Utils
let mac_re = PCRE.compile ~anchored:true "([[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}):(network|bridge|ip):(.*)"
let mac_ip_re = PCRE.compile ~anchored:true "([[:xdigit:]]|:|\\.)+"
-(* Create the temporary directory to control conversion. *)
-let v2vdir = create_v2v_directory ()
-
let rec main () =
let set_string_option_once optname optref arg =
match !optref with
@@ -333,6 +330,9 @@ read the man page virt-v2v(1).
debug "libvirt version: %d.%d.%d" major minor release
);
+ (* Create the temporary directory to control conversion. *)
+ let v2vdir = create_v2v_directory () in
+
(* Dereference the arguments. *)
let args = List.rev !args in
let input_conn = !input_conn in
--
2.31.1

View File

@ -1,26 +0,0 @@
From 3d20ba06ab98388c3f08e2430eef53e1e912ef62 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 23 Mar 2022 10:37:24 +0000
Subject: [PATCH] lib/nbdkit.ml: Correct copy/paste error in comment
(cherry picked from commit f44c8d2e819a38ea670b0577fafc8f88265ceacf)
---
lib/nbdkit.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/nbdkit.ml b/lib/nbdkit.ml
index 6787fbb0..85621775 100644
--- a/lib/nbdkit.ml
+++ b/lib/nbdkit.ml
@@ -202,7 +202,7 @@ If the messages above are not sufficient to diagnose the problem then add the
socket]);
);
- (* Set the regular Unix permissions, in case qemu is
+ (* Set the regular Unix permissions, in case nbdkit is
* running as another user.
*)
chmod socket 0o777;
--
2.31.1

View File

@ -0,0 +1,30 @@
From 207552533f0b4ed2e2d570a827a85a44d4248b78 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Mon, 17 Aug 2020 09:17:51 +0200
Subject: [PATCH] libvirt: read password file outside libvirt auth callback
This way errors that occur while reading the password file are properly
propagated, instead of being reported as errors of the libvirt
authentication callback.
Reported by: Ming Xie.
(cherry picked from commit 76f9f3a0603f33c85d681fe13e24516331c6aea7)
---
v2v/libvirt_utils.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/v2v/libvirt_utils.ml b/v2v/libvirt_utils.ml
index 4d0b8639..1a24b049 100644
--- a/v2v/libvirt_utils.ml
+++ b/v2v/libvirt_utils.ml
@@ -24,8 +24,8 @@ open Common_gettext.Gettext
module. *)
let auth_for_password_file ?password_file () =
+ let password = Option.map read_first_line_from_file password_file in
let auth_fn creds =
- let password = Option.map read_first_line_from_file password_file in
List.map (
function
| { Libvirt.Connect.typ = Libvirt.Connect.CredentialPassphrase } -> password

View File

@ -1,10 +1,10 @@
From 5b3653332be7b739755f53cca19ce10768585a61 Mon Sep 17 00:00:00 2001
From 9331544f2456f1aef7299920d0c84dff4e47d132 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
Subject: [PATCH] RHEL 8: v2v: Select correct qemu binary for -o qemu mode
(RHBZ#1147313).
RHEL does not have qemu-system-x86_64 (etc), and in addition the
RHEL 8 does not have qemu-system-x86_64 (etc), and in addition the
qemu binary is located in /usr/libexec. Encode the path to this
binary directly in the script.
@ -12,14 +12,14 @@ Note that we don't support people running qemu directly like this.
It's just for quick testing of converted VMs, and to help us with
support cases.
---
output/output_qemu.ml | 2 +-
v2v/output_qemu.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/output/output_qemu.ml b/output/output_qemu.ml
index f8d2e171..700de058 100644
--- a/output/output_qemu.ml
+++ b/output/output_qemu.ml
@@ -137,7 +137,7 @@ module QEMU = struct
diff --git a/v2v/output_qemu.ml b/v2v/output_qemu.ml
index be3a3c5e..85d08265 100644
--- a/v2v/output_qemu.ml
+++ b/v2v/output_qemu.ml
@@ -81,7 +81,7 @@ object
* module deals with shell and qemu comma quoting.
*)
let cmd = Qemuopts.create () in
@ -28,6 +28,3 @@ index f8d2e171..700de058 100644
let flag = Qemuopts.flag cmd
and arg = Qemuopts.arg cmd
--
2.31.1

View File

@ -1,151 +0,0 @@
From 6ca02e37d72a81e7e32d4d3eef24d8a0abe3deb2 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 22 Mar 2022 13:53:41 +0000
Subject: [PATCH] lib: Improve security of in/out sockets when running virt-v2v
as root
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When using the libvirt backend and running as root, libvirt will run
qemu as a non-root user (eg. qemu:qemu). The v2v directory stores NBD
endpoints that qemu must be able to open and so we set the directory
to mode 0711. Unfortunately this permits any non-root user to open
the sockets (since, by design, they have predictable names within the
directory).
Additionally we were setting the sockets themselves to 0777 mode.
Instead of using directory permissions, change the owner of the
directory and sockets to precisely give access to the qemu user and no
one else.
Reported-by: Xiaodai Wang
Thanks: Dr David Gilbert, Daniel Berrangé, Laszlo Ersek
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2066773
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
(cherry picked from commit 4e7f206843735ba24e2034f694a214ef057ee139)
---
lib/nbdkit.ml | 3 ++-
lib/qemuNBD.ml | 3 ++-
lib/utils.ml | 47 +++++++++++++++++++++++++++++++++++++++++++++--
lib/utils.mli | 11 +++++++++++
4 files changed, 60 insertions(+), 4 deletions(-)
diff --git a/lib/nbdkit.ml b/lib/nbdkit.ml
index 85621775..9ee6f39c 100644
--- a/lib/nbdkit.ml
+++ b/lib/nbdkit.ml
@@ -205,6 +205,7 @@ If the messages above are not sufficient to diagnose the problem then add the
(* Set the regular Unix permissions, in case nbdkit is
* running as another user.
*)
- chmod socket 0o777;
+ chown_for_libvirt_rhbz_1045069 socket;
+ chmod socket 0o700;
socket, pid
diff --git a/lib/qemuNBD.ml b/lib/qemuNBD.ml
index 54139ce0..2c999b9f 100644
--- a/lib/qemuNBD.ml
+++ b/lib/qemuNBD.ml
@@ -150,7 +150,8 @@ If the messages above are not sufficient to diagnose the problem then add the
(* Set the regular Unix permissions, in case qemu is
* running as another user.
*)
- chmod socket 0o777;
+ chown_for_libvirt_rhbz_1045069 socket;
+ chmod socket 0o700;
(* We don't need the PID file any longer. *)
unlink pidfile;
diff --git a/lib/utils.ml b/lib/utils.ml
index 876a44c6..7116a4f9 100644
--- a/lib/utils.ml
+++ b/lib/utils.ml
@@ -147,6 +147,50 @@ let backend_is_libvirt () =
let backend = fst (String.split ":" backend) in
backend = "libvirt"
+let rec chown_for_libvirt_rhbz_1045069 file =
+ let running_as_root = Unix.geteuid () = 0 in
+ if running_as_root && backend_is_libvirt () then (
+ try
+ let user = Option.default "qemu" (libvirt_qemu_user ()) in
+ let uid =
+ if String.is_prefix user "+" then
+ int_of_string (String.sub user 1 (String.length user - 1))
+ else
+ (Unix.getpwnam user).pw_uid in
+ debug "setting owner of %s to %d:root" file uid;
+ Unix.chown file uid 0
+ with
+ | exn -> (* Print exception, but continue. *)
+ debug "could not set owner of %s: %s"
+ file (Printexc.to_string exn)
+ )
+
+(* Get the local user that libvirt uses to run qemu when we are
+ * running as root. This is returned as an optional string
+ * containing the username. The username might be "+NNN"
+ * meaning a numeric UID.
+ * https://listman.redhat.com/archives/libguestfs/2022-March/028450.html
+ *)
+and libvirt_qemu_user =
+ let user =
+ lazy (
+ let conn = Libvirt.Connect.connect_readonly () in
+ let xml = Libvirt.Connect.get_capabilities conn in
+ let doc = Xml.parse_memory xml in
+ let xpathctx = Xml.xpath_new_context doc in
+ let expr =
+ "//secmodel[./model=\"dac\"]/baselabel[@type=\"kvm\"]/text()" in
+ let uid_gid = Xpath_helpers.xpath_string xpathctx expr in
+ match uid_gid with
+ | None -> None
+ | Some uid_gid ->
+ (* The string will be something like "+107:+107", return the
+ * UID part.
+ *)
+ Some (fst (String.split ":" uid_gid))
+ ) in
+ fun () -> Lazy.force user
+
(* When using the SSH driver in qemu (currently) this requires
* ssh-agent authentication. Give a clear error if this hasn't been
* set up (RHBZ#1139973). This might improve if we switch to libssh1.
@@ -159,8 +203,7 @@ let error_if_no_ssh_agent () =
(* Create the directory containing inX and outX sockets. *)
let create_v2v_directory () =
let d = Mkdtemp.temp_dir "v2v." in
- let running_as_root = Unix.geteuid () = 0 in
- if running_as_root then Unix.chmod d 0o711;
+ chown_for_libvirt_rhbz_1045069 d;
On_exit.rmdir d;
d
diff --git a/lib/utils.mli b/lib/utils.mli
index c571cca5..d431e21f 100644
--- a/lib/utils.mli
+++ b/lib/utils.mli
@@ -61,6 +61,17 @@ val qemu_img_supports_offset_and_size : unit -> bool
val backend_is_libvirt : unit -> bool
(** Return true iff the current backend is libvirt. *)
+val chown_for_libvirt_rhbz_1045069 : string -> unit
+(** If running and root, and if the backend is libvirt, libvirt
+ will run qemu as a non-root user. This prevents access
+ to root-owned files and directories. To fix this, provide
+ a function to chown things we might need to qemu:root so
+ qemu can access them. Note that root normally ignores
+ permissions so can still access the resource.
+
+ This is best-effort. If something fails then we carry
+ on and hope for the best. *)
+
val error_if_no_ssh_agent : unit -> unit
val create_v2v_directory : unit -> string
--
2.31.1

View File

@ -1,20 +1,18 @@
From b896dab3d8d4226b246e2e90d07235a38b6c8a79 Mon Sep 17 00:00:00 2001
From 7df465dede750140bbc5a2579a5256061af63e03 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
(RHBZ#1147313).
Subject: [PATCH] RHEL 8: v2v: Disable the --qemu-boot option (RHBZ#1147313).
This cannot work because there is no Gtk or SDL output mode
in RHEL's qemu-kvm.
in RHEL 8's qemu-kvm.
In addition you will have to edit the -display option in the
qemu script.
---
docs/virt-v2v-output-local.pod | 6 ++----
docs/virt-v2v.pod | 12 ------------
output/output_qemu.ml | 3 +++
v2v/v2v.ml | 2 --
4 files changed, 5 insertions(+), 18 deletions(-)
docs/virt-v2v.pod | 13 -------------
v2v/cmdline.ml | 3 ++-
3 files changed, 4 insertions(+), 18 deletions(-)
diff --git a/docs/virt-v2v-output-local.pod b/docs/virt-v2v-output-local.pod
index a5f155cb..3a2e6238 100644
@ -44,69 +42,61 @@ index a5f155cb..3a2e6238 100644
=item B<-o json -os> C<DIRECTORY>
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index f50d27a0..9b1e44a1 100644
index 74934eb4..a19f0a73 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -140,11 +140,6 @@ Since F<guest-domain.xml> contains the path(s) to the guest disk
@@ -144,11 +144,6 @@ Since F<guest-domain.xml> contains the path(s) to the guest disk
image(s) you do not need to specify the name of the disk image on the
command line.
-To convert a local disk image and immediately boot it in local
-qemu, do:
-
- virt-v2v -i disk disk.img -o qemu -os /var/tmp -oo qemu-boot
- virt-v2v -i disk disk.img -o qemu -os /var/tmp --qemu-boot
-
=head1 OPTIONS
=over 4
@@ -509,9 +504,6 @@ This is similar to I<-o local>, except that a shell script is written
@@ -537,9 +532,6 @@ This is similar to I<-o local>, except that a shell script is written
which you can use to boot the guest in qemu. The converted disks and
shell script are written to the directory specified by I<-os>.
-When using this output mode, you can also specify the I<-oo qemu-boot>
-When using this output mode, you can also specify the I<--qemu-boot>
-option which boots the guest under qemu immediately.
-
=item B<-o> B<rhev>
This is the same as I<-o rhv>.
@@ -765,10 +757,6 @@ Print information about the source guest and stop. This option is
@@ -815,11 +807,6 @@ Print information about the source guest and stop. This option is
useful when you are setting up network and bridge maps.
See L</Networks and bridges>.
-=item B<--qemu-boot>
-
-This is the same as I<-oo qemu-boot>.
-When using I<-o qemu> only, this boots the guest immediately after
-virt-v2v finishes.
-
=item B<-q>
=item B<--quiet>
diff --git a/output/output_qemu.ml b/output/output_qemu.ml
index 700de058..3ad98a58 100644
--- a/output/output_qemu.ml
+++ b/output/output_qemu.ml
@@ -63,6 +63,9 @@ module QEMU = struct
) options.output_options;
let qemu_boot = !qemu_boot in
+ if qemu_boot then
+ error (f_"-o qemu: the -oo qemu-boot option cannot be used in RHEL");
+
(* -os must be set to a directory. *)
let output_storage =
match options.output_storage with
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index 7bd47c1e..a66fa285 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -277,8 +277,6 @@ let rec main () =
s_"Same as -ip filename";
diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
index 3b74f307..df69e2e0 100644
--- a/v2v/cmdline.ml
+++ b/v2v/cmdline.ml
@@ -284,7 +284,6 @@ let parse_cmdline () =
s_"Estimate size of source and stop";
[ L"print-source" ], Getopt.Set print_source,
s_"Print source and stop";
- [ L"qemu-boot" ], Getopt.Unit (fun () -> set_output_option_compat "qemu-boot" ""),
- s_"Boot in qemu (-o qemu only)";
s_"Print source and stop";
- [ L"qemu-boot" ], Getopt.Set qemu_boot, s_"Boot in qemu (-o qemu only)";
[ L"root" ], Getopt.String ("ask|... ", set_root_choice),
s_"How to choose root filesystem";
s_"How to choose root filesystem";
[ L"vddk-config" ], Getopt.String ("filename", set_input_option_compat "vddk-config"),
--
2.31.1
@@ -668,6 +667,8 @@ read the man page virt-v2v(1).
| Some d when not (is_directory d) ->
error (f_"-os %s: output directory does not exist or is not a directory") d
| Some d -> d in
+ if qemu_boot then
+ error (f_"-o qemu: the --qemu-boot option cannot be used in RHEL");
Output_qemu.output_qemu os qemu_boot,
output_format, output_alloc

View File

@ -1,343 +0,0 @@
From 6d99469c696ea691a908ad8a65314475e43b7bd0 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Wed, 23 Mar 2022 11:43:30 +0100
Subject: [PATCH] nbdkit, qemuNBD: run_unix: formally require externally
provided socket
At this point, virt-v2v never relies on the Unix domain sockets created
inside the "run_unix" implementations. Simplify the code by removing this
option.
Consequently, the internally created temporary directory only holds the
NBD server's PID file, and never its UNIX domain socket. Therefore:
(1) we no longer need the libguestfs socket dir to be our temp dir,
(2) we need not change the file mode bits on the temp dir,
(3) we can rename "tmpdir" to the more specific "piddir".
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2066773
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220323104330.9667-1-lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 9788b06765af335b054aba03f41d1b829ed13092)
---
input/input_disk.ml | 4 ++--
input/input_libvirt.ml | 8 ++++----
input/input_ova.ml | 2 +-
input/input_vddk.ml | 2 +-
input/input_vmx.ml | 4 ++--
input/input_xen_ssh.ml | 2 +-
input/vCenter.ml | 2 +-
lib/nbdkit.ml | 24 +++++-------------------
lib/nbdkit.mli | 6 +-----
lib/qemuNBD.ml | 25 +++++--------------------
lib/qemuNBD.mli | 6 +-----
output/output.ml | 4 ++--
output/output_null.ml | 2 +-
output/output_rhv_upload.ml | 2 +-
14 files changed, 28 insertions(+), 65 deletions(-)
diff --git a/input/input_disk.ml b/input/input_disk.ml
index dc3bed6f..c08548ee 100644
--- a/input/input_disk.ml
+++ b/input/input_disk.ml
@@ -109,7 +109,7 @@ module Disk = struct
Nbdkit.add_arg cmd "file" disk;
if Nbdkit.version nbdkit_config >= (1, 22, 0) then
Nbdkit.add_arg cmd "cache" "none";
- let _, pid = Nbdkit.run_unix ~socket cmd in
+ let _, pid = Nbdkit.run_unix socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
* up when we exit, but it's not supported everywhere.
@@ -120,7 +120,7 @@ module Disk = struct
let cmd = QemuNBD.create disk in
QemuNBD.set_snapshot cmd true; (* protective overlay *)
QemuNBD.set_format cmd (Some format);
- let _, pid = QemuNBD.run_unix ~socket cmd in
+ let _, pid = QemuNBD.run_unix socket cmd in
On_exit.kill pid
) args;
diff --git a/input/input_libvirt.ml b/input/input_libvirt.ml
index ee836aa0..ad7e20e8 100644
--- a/input/input_libvirt.ml
+++ b/input/input_libvirt.ml
@@ -87,7 +87,7 @@ and setup_servers dir disks =
Nbdkit.add_arg cmd "hostname" hostname;
Nbdkit.add_arg cmd "port" (string_of_int port);
Nbdkit.add_arg cmd "shared" "true";
- let _, pid = Nbdkit.run_unix ~socket cmd in
+ let _, pid = Nbdkit.run_unix socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
* up when we exit, but it's not supported everywhere.
@@ -98,7 +98,7 @@ and setup_servers dir disks =
| HTTP url ->
let cor = dir // "convert" in
let cmd = Nbdkit_curl.create_curl ~cor url in
- let _, pid = Nbdkit.run_unix ~socket cmd in
+ let _, pid = Nbdkit.run_unix socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
* up when we exit, but it's not supported everywhere.
@@ -113,7 +113,7 @@ and setup_servers dir disks =
Nbdkit.add_arg cmd "file" filename;
if Nbdkit.version nbdkit_config >= (1, 22, 0) then
Nbdkit.add_arg cmd "cache" "none";
- let _, pid = Nbdkit.run_unix ~socket cmd in
+ let _, pid = Nbdkit.run_unix socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
* up when we exit, but it's not supported everywhere.
@@ -125,7 +125,7 @@ and setup_servers dir disks =
let cmd = QemuNBD.create filename in
QemuNBD.set_snapshot cmd true; (* protective overlay *)
QemuNBD.set_format cmd format;
- let _, pid = QemuNBD.run_unix ~socket cmd in
+ let _, pid = QemuNBD.run_unix socket cmd in
On_exit.kill pid
) disks
diff --git a/input/input_ova.ml b/input/input_ova.ml
index c94ddc79..796cc3bc 100644
--- a/input/input_ova.ml
+++ b/input/input_ova.ml
@@ -192,7 +192,7 @@ module OVA = struct
let cmd = QemuNBD.create qemu_uri in
QemuNBD.set_snapshot cmd true; (* protective overlay *)
QemuNBD.set_format cmd None; (* auto-detect format *)
- let _, pid = QemuNBD.run_unix ~socket cmd in
+ let _, pid = QemuNBD.run_unix socket cmd in
On_exit.kill pid
) qemu_uris;
diff --git a/input/input_vddk.ml b/input/input_vddk.ml
index 29764095..f8bf3d28 100644
--- a/input/input_vddk.ml
+++ b/input/input_vddk.ml
@@ -196,7 +196,7 @@ information on these settings.
?nfchostport ?password_file:options.input_password ?port
~server ?snapshot ~thumbprint ?transports ?user
path in
- let _, pid = Nbdkit.run_unix ~socket nbdkit in
+ let _, pid = Nbdkit.run_unix socket nbdkit in
On_exit.kill pid
) disks;
diff --git a/input/input_vmx.ml b/input/input_vmx.ml
index 3aa49fa6..34ae99a3 100644
--- a/input/input_vmx.ml
+++ b/input/input_vmx.ml
@@ -66,7 +66,7 @@ module VMX = struct
(absolute_path_from_other_file vmx_filename filename) in
QemuNBD.set_snapshot cmd true; (* protective overlay *)
QemuNBD.set_format cmd (Some "vmdk");
- let _, pid = QemuNBD.run_unix ~socket cmd in
+ let _, pid = QemuNBD.run_unix socket cmd in
On_exit.kill pid
) filenames
@@ -108,7 +108,7 @@ module VMX = struct
let bandwidth = options.bandwidth in
let nbdkit = Nbdkit_ssh.create_ssh ?bandwidth ~cor ~password
~server ?port ?user abs_path in
- let _, pid = Nbdkit.run_unix ~socket nbdkit in
+ let _, pid = Nbdkit.run_unix socket nbdkit in
On_exit.kill pid
) filenames
);
diff --git a/input/input_xen_ssh.ml b/input/input_xen_ssh.ml
index 85e24bce..989a0cc7 100644
--- a/input/input_xen_ssh.ml
+++ b/input/input_xen_ssh.ml
@@ -118,7 +118,7 @@ module XenSSH = struct
let bandwidth = options.bandwidth in
let nbdkit = Nbdkit_ssh.create_ssh ?bandwidth ~cor ~password
?port ~server ?user path in
- let _, pid = Nbdkit.run_unix ~socket nbdkit in
+ let _, pid = Nbdkit.run_unix socket nbdkit in
On_exit.kill pid
) disks;
diff --git a/input/vCenter.ml b/input/vCenter.ml
index 40d594f0..8a1a5655 100644
--- a/input/vCenter.ml
+++ b/input/vCenter.ml
@@ -117,7 +117,7 @@ let rec start_nbdkit_for_path ?bandwidth ?cor ?password_file
Nbdkit_curl.create_curl ?bandwidth ?cor
~cookie_script ~cookie_script_renew
~sslverify https_url in
- let _, pid = Nbdkit.run_unix ~socket nbdkit in
+ let _, pid = Nbdkit.run_unix socket nbdkit in
pid
and get_https_url dcPath uri server path =
diff --git a/lib/nbdkit.ml b/lib/nbdkit.ml
index 9ee6f39c..07896684 100644
--- a/lib/nbdkit.ml
+++ b/lib/nbdkit.ml
@@ -102,27 +102,13 @@ let add_env cmd name value = cmd.env <- (name, value) :: cmd.env
let add_filter_if_available cmd filter =
if probe_filter filter then add_filter cmd filter
-let run_unix ?socket cmd =
- (* Create a temporary directory where we place the socket and PID file.
- * Use the libguestfs socket directory, so it is more likely the full path
- * of the UNIX sockets will fit in the (limited) socket pathname.
- *)
- let tmpdir =
- let base_dir = (open_guestfs ())#get_sockdir () in
- let t = Mkdtemp.temp_dir ~base_dir "v2vnbdkit." in
- (* tmpdir must be readable (but not writable) by "other" so that
- * qemu can open the sockets.
- *)
- chmod t 0o755;
- On_exit.rmdir t;
- t in
+let run_unix socket cmd =
+ (* Create a temporary directory where we place the PID file. *)
+ let piddir = Mkdtemp.temp_dir "v2vnbdkit." in
+ On_exit.rmdir piddir;
let id = unique () in
- let pidfile = tmpdir // sprintf "nbdkit%d.pid" id in
- let socket =
- match socket with
- | None -> tmpdir // sprintf "nbdkit%d.sock" id
- | Some socket -> socket in
+ let pidfile = piddir // sprintf "nbdkit%d.pid" id in
(* Construct the final command line. *)
let add_arg, add_args_reversed, get_args =
diff --git a/lib/nbdkit.mli b/lib/nbdkit.mli
index dc2fd04b..5ba83ab0 100644
--- a/lib/nbdkit.mli
+++ b/lib/nbdkit.mli
@@ -92,14 +92,10 @@ val add_args : cmd -> (string * string) list -> unit
val add_env : cmd -> string -> string -> unit
(** Add name=value environment variable. *)
-val run_unix : ?socket:string -> cmd -> string * int
+val run_unix : string -> cmd -> string * int
(** Start nbdkit command listening on a Unix domain socket, waiting
for the process to start up.
- If optional [?socket] parameter is omitted, then a temporary
- Unix domain socket name is created. If [?socket] is present
- then this overrides the temporary name.
-
Returns the Unix domain socket name and the nbdkit process ID.
The --exit-with-parent, --foreground, --pidfile, --newstyle and
diff --git a/lib/qemuNBD.ml b/lib/qemuNBD.ml
index 2c999b9f..ae21b17c 100644
--- a/lib/qemuNBD.ml
+++ b/lib/qemuNBD.ml
@@ -62,30 +62,15 @@ let create disk = { disk; snapshot = false; format = None }
let set_snapshot cmd snap = cmd.snapshot <- snap
let set_format cmd format = cmd.format <- format
-let run_unix ?socket { disk; snapshot; format } =
+let run_unix socket { disk; snapshot; format } =
assert (disk <> "");
- (* Create a temporary directory where we place the socket and PID file.
- * Use the libguestfs socket directory, so it is more likely the full path
- * of the UNIX sockets will fit in the (limited) socket pathname.
- *)
- let tmpdir =
- let base_dir = (open_guestfs ())#get_sockdir () in
- let t = Mkdtemp.temp_dir ~base_dir "v2vqemunbd." in
- (* tmpdir must be readable (but not writable) by "other" so that
- * qemu can open the sockets.
- *)
- chmod t 0o755;
- On_exit.rmdir t;
- t in
+ (* Create a temporary directory where we place the PID file. *)
+ let piddir = Mkdtemp.temp_dir "v2vqemunbd." in
+ On_exit.rmdir piddir;
let id = unique () in
- let pidfile = tmpdir // sprintf "qemunbd%d.pid" id in
-
- let socket =
- match socket with
- | Some socket -> socket
- | None -> tmpdir // sprintf "qemunbd%d.sock" id in
+ let pidfile = piddir // sprintf "qemunbd%d.pid" id in
(* Construct the qemu-nbd command line. *)
let args = ref [] in
diff --git a/lib/qemuNBD.mli b/lib/qemuNBD.mli
index 83871c5b..e10d3106 100644
--- a/lib/qemuNBD.mli
+++ b/lib/qemuNBD.mli
@@ -43,12 +43,8 @@ val set_snapshot : cmd -> bool -> unit
val set_format : cmd -> string option -> unit
(** Set the format [--format] parameter. *)
-val run_unix : ?socket:string -> cmd -> string * int
+val run_unix : string -> cmd -> string * int
(** Start qemu-nbd command listening on a Unix domain socket,
waiting for the process to start up.
- If optional [?socket] parameter is omitted, then a temporary
- Unix domain socket name is created. If [?socket] is present
- then this overrides the temporary name.
-
Returns the Unix domain socket name and the qemu-nbd process ID. *)
diff --git a/output/output.ml b/output/output.ml
index 7256b547..10e685c4 100644
--- a/output/output.ml
+++ b/output/output.ml
@@ -90,7 +90,7 @@ let output_to_local_file ?(changeuid = fun f -> f ())
let cmd = Nbdkit.add_arg cmd "cache" "none" in
cmd
);
- let _, pid = Nbdkit.run_unix ~socket cmd in
+ let _, pid = Nbdkit.run_unix socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
* up when we exit, but it's not supported everywhere.
@@ -101,7 +101,7 @@ let output_to_local_file ?(changeuid = fun f -> f ())
let cmd = QemuNBD.create filename in
QemuNBD.set_snapshot cmd false;
QemuNBD.set_format cmd (Some "qcow2");
- let _, pid = QemuNBD.run_unix ~socket cmd in
+ let _, pid = QemuNBD.run_unix socket cmd in
On_exit.kill pid
| _ ->
diff --git a/output/output_null.ml b/output/output_null.ml
index 86d81eaa..c8e27c0b 100644
--- a/output/output_null.ml
+++ b/output/output_null.ml
@@ -70,7 +70,7 @@ module Null = struct
let () =
let cmd = Nbdkit.create ~quiet:true "null" in
Nbdkit.add_arg cmd "size" "7E";
- let _, pid = Nbdkit.run_unix ~socket cmd in
+ let _, pid = Nbdkit.run_unix socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
* up when we exit, but it's not supported everywhere.
diff --git a/output/output_rhv_upload.ml b/output/output_rhv_upload.ml
index 72463e57..828996b3 100644
--- a/output/output_rhv_upload.ml
+++ b/output/output_rhv_upload.ml
@@ -398,7 +398,7 @@ e command line has to match the number of guest disk images (for this guest: %d)
Nbdkit.add_arg cmd "insecure" "true";
if is_ovirt_host then
Nbdkit.add_arg cmd "is_ovirt_host" "true";
- let _, pid = Nbdkit.run_unix ~socket cmd in
+ let _, pid = Nbdkit.run_unix socket cmd in
List.push_front pid nbdkit_pids
) (List.combine disks disk_uuids);
--
2.31.1

View File

@ -1,18 +1,18 @@
From 3745743d97bc432854750afd6d04d6391f19bf2f Mon Sep 17 00:00:00 2001
From ff5ae6613f5b344371cd8523a022af08fa6f191b 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
Subject: [PATCH] RHEL 8: Fix list of supported sound cards to match RHEL qemu
(RHBZ#1176493).
---
lib/utils.ml | 5 +++--
v2v/utils.ml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/lib/utils.ml b/lib/utils.ml
index 4c8998c2..7b16dd8b 100644
--- a/lib/utils.ml
+++ b/lib/utils.ml
@@ -59,13 +59,14 @@ let kvm_arch = function
diff --git a/v2v/utils.ml b/v2v/utils.ml
index ccbb9d68..c2940582 100644
--- a/v2v/utils.ml
+++ b/v2v/utils.ml
@@ -55,13 +55,14 @@ let kvm_arch = function
(* Does qemu support the given sound card? *)
let qemu_supports_sound_card = function
| Types.AC97
@ -29,6 +29,3 @@ index 4c8998c2..7b16dd8b 100644
(* Find the UEFI firmware. *)
let find_uefi_firmware guest_arch =
--
2.31.1

View File

@ -1,42 +1,15 @@
From f7ed42f475271291d126084cb92157974ea274c6 Mon Sep 17 00:00:00 2001
From d6b625021e4bc1662b796e8c2f2a646d118f9fa1 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.
Subject: [PATCH] RHEL 8: Fix tests for libguestfs-winsupport.
In tests we cannot use guestfish for arbitrary Windows edits.
In virt-v2v helpers we must set the program name to virt-v2v.
It doesn't let us use guestfish for arbitrary Windows edits.
---
convert/convert.ml | 1 +
convert/windows_virtio.ml | 1 +
test-data/phony-guests/make-windows-img.sh | 1 +
tests/test-v2v-virtio-win-iso.sh | 8 +++++++-
tests/test-v2v-windows-conversion.sh | 8 +++++++-
5 files changed, 17 insertions(+), 2 deletions(-)
3 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/convert/convert.ml b/convert/convert.ml
index 87fca725..5e0e6c2b 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -51,6 +51,7 @@ let rec convert dir options source =
message (f_"Opening the source");
let g = open_guestfs ~identifier:"v2v" () in
+ g#set_program "virt-v2v";
g#set_memsize (g#get_memsize () * 2);
(* Setting the number of vCPUs allows parallel mkinitrd, but make
* sure this is not too large because each vCPU consumes guest RAM.
diff --git a/convert/windows_virtio.ml b/convert/windows_virtio.ml
index 5254322c..301f7544 100644
--- a/convert/windows_virtio.ml
+++ b/convert/windows_virtio.ml
@@ -283,6 +283,7 @@ and copy_from_virtio_win g inspect srcdir destdir filter missing =
let g2 =
try
let g2 = open_guestfs ~identifier:"virtio_win" () in
+ g#set_program "virt-v2v";
g2#add_drive_opts virtio_win ~readonly:true;
g2#launch ();
g2
diff --git a/test-data/phony-guests/make-windows-img.sh b/test-data/phony-guests/make-windows-img.sh
index 30908a91..73cf5144 100755
--- a/test-data/phony-guests/make-windows-img.sh
@ -50,10 +23,10 @@ index 30908a91..73cf5144 100755
run
diff --git a/tests/test-v2v-virtio-win-iso.sh b/tests/test-v2v-virtio-win-iso.sh
index 69f6f414..b9b806fb 100755
index 6e99f0f1..a8e572c5 100755
--- a/tests/test-v2v-virtio-win-iso.sh
+++ b/tests/test-v2v-virtio-win-iso.sh
@@ -82,6 +82,12 @@ mktest ()
@@ -79,6 +79,12 @@ mktest ()
:> "$script"
:> "$expected"
@ -66,18 +39,20 @@ index 69f6f414..b9b806fb 100755
firstboot_dir="/Program Files/Guestfs/Firstboot"
mktest "is-dir \"$firstboot_dir\"" true
mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
@@ -94,5 +100,5 @@ for drv in netkvm vioscsi viostor; do
@@ -91,7 +97,7 @@ for drv in netkvm vioscsi viostor; do
done
done
-guestfish --ro -a "$d/windows-sda" -i < "$script" > "$response"
+guestfish --ro -a "$d/windows-sda" < "$script" > "$response"
diff -u "$expected" "$response"
rm -r $d
diff --git a/tests/test-v2v-windows-conversion.sh b/tests/test-v2v-windows-conversion.sh
index a4cf191d..1ff41f6a 100755
index f1da222a..ff94fe39 100755
--- a/tests/test-v2v-windows-conversion.sh
+++ b/tests/test-v2v-windows-conversion.sh
@@ -76,6 +76,12 @@ mktest ()
@@ -73,6 +73,12 @@ mktest ()
:> "$script"
:> "$expected"
@ -90,7 +65,7 @@ index a4cf191d..1ff41f6a 100755
firstboot_dir="/Program Files/Guestfs/Firstboot"
mktest "is-dir \"$firstboot_dir\"" true
mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
@@ -88,7 +94,7 @@ for drv in netkvm vioscsi viostor; do
@@ -85,7 +91,7 @@ for drv in netkvm qxl vioscsi viostor; do
done
done
@ -99,6 +74,3 @@ index a4cf191d..1ff41f6a 100755
diff -u "$expected" "$response"
# We also update the Registry several times, for firstboot, and (ONLY
--
2.31.1

View File

@ -0,0 +1,283 @@
From d55dcb095a383ff924acbfbe1c81a3a1eb4f4495 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 14 Jan 2016 11:53:42 -0500
Subject: [PATCH] RHEL 8: v2v: Disable the virt-v2v --in-place option.
This disables the virt-v2v --in-place option which we do not
wish to support in RHEL.
(See commit d0069559a939e47e5f29973ed9a69a13f0b58301).
---
docs/test-v2v-docs.sh | 1 +
docs/virt-v2v.pod | 48 +----------------
tests/Makefile.am | 2 -
tests/test-v2v-in-place.sh | 108 -------------------------------------
v2v/cmdline.ml | 8 +--
5 files changed, 7 insertions(+), 160 deletions(-)
delete mode 100755 tests/test-v2v-in-place.sh
diff --git a/docs/test-v2v-docs.sh b/docs/test-v2v-docs.sh
index dd2b1233..8fef46cc 100755
--- a/docs/test-v2v-docs.sh
+++ b/docs/test-v2v-docs.sh
@@ -27,6 +27,7 @@ $top_srcdir/podcheck.pl virt-v2v.pod virt-v2v \
--debug-overlay,\
--ic,\
--if,\
+--in-place,\
--io,\
--ip,\
--it,\
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index a19f0a73..6f9f323e 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -8,10 +8,6 @@ virt-v2v - Convert a guest to use KVM
[-o mode] [other -o* options]
[guest|filename]
- virt-v2v --in-place
- [-i mode] [other -i* options]
- [guest|filename]
-
=head1 DESCRIPTION
Virt-v2v converts a single guest from a foreign hypervisor to run on
@@ -39,9 +35,6 @@ these sides of virt-v2v are documented separately in this manual.
Virt-v2v normally copies from the input to the output, called "copying
mode". In this case the source guest is always left unchanged.
-In-place conversion (I<--in-place>) only uses the I<-i*> options and
-modifies the source guest in-place. (See L</In-place conversion>
-below.)
=head2 Other virt-v2v topics
@@ -301,20 +294,6 @@ For I<-i disk> only, this specifies the format of the input disk
image. For other input methods you should specify the input
format in the metadata.
-=item B<--in-place>
-
-Do not create an output virtual machine in the target hypervisor.
-Instead, adjust the guest OS in the source VM to run in the input
-hypervisor.
-
-This mode is meant for integration with other toolsets, which take the
-responsibility of converting the VM configuration, providing for
-rollback in case of errors, transforming the storage, etc.
-
-See L</In-place conversion> below.
-
-Conflicts with all I<-o *> options.
-
=item B<-io> OPTION=VALUE
Set input option(s) related to the current input mode or transport.
@@ -1332,7 +1311,7 @@ have at least 100 available inodes.
=head3 Minimum free space check in the host
You must have sufficient free space in the host directory used to
-store temporary overlays (except in I<--in-place> mode). To find out
+store temporary overlays. To find out
which directory this is, use:
$ df -h "`guestfish get-cachedir`"
@@ -1435,31 +1414,6 @@ that instead.
</devices>
</domain>
-=head2 In-place conversion
-
-It is also possible to use virt-v2v in scenarios where a foreign VM
-has already been imported into a KVM-based hypervisor, but still needs
-adjustments in the guest to make it run in the new virtual hardware.
-
-In that case it is assumed that a third-party tool has created the
-target VM in the supported KVM-based hypervisor based on the source VM
-configuration and contents, but using virtual devices more appropriate
-for KVM (e.g. virtio storage and network, etc.).
-
-Then, to make the guest OS boot and run in the changed environment,
-one can use:
-
- virt-v2v -ic qemu:///system converted_vm --in-place
-
-Virt-v2v will analyze the configuration of C<converted_vm> in the
-C<qemu:///system> libvirt instance, and apply various fixups to the
-guest OS configuration to make it match the VM configuration. This
-may include installing virtio drivers, configuring the bootloader, the
-mountpoints, the network interfaces, and so on.
-
-Should an error occur during the operation, virt-v2v exits with an
-error code leaving the VM in an undefined state.
-
=head2 Machine readable output
The I<--machine-readable> option can be used to make the output more
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 871dc3c9..eee4e1af 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -76,7 +76,6 @@ TESTS = \
test-v2v-floppy.sh \
test-v2v-i-disk.sh \
test-v2v-i-ova.sh \
- test-v2v-in-place.sh \
test-v2v-mac.sh \
test-v2v-machine-readable.sh \
test-v2v-networks-and-bridges.sh \
@@ -225,7 +224,6 @@ EXTRA_DIST += \
test-v2v-i-vmx-3.vmx \
test-v2v-i-vmx-4.vmx \
test-v2v-i-vmx-5.vmx \
- test-v2v-in-place.sh \
test-v2v-it-vddk-io-query.sh \
test-v2v-machine-readable.sh \
test-v2v-mac-expected.xml \
diff --git a/tests/test-v2v-in-place.sh b/tests/test-v2v-in-place.sh
deleted file mode 100755
index 6f7d78f3..00000000
--- a/tests/test-v2v-in-place.sh
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/bin/bash -
-# libguestfs virt-v2v test script
-# Copyright (C) 2014 Red Hat Inc.
-# Copyright (C) 2015 Parallels IP Holdings GmbH.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Test --in-place.
-
-unset CDPATH
-export LANG=C
-set -e
-
-$TEST_FUNCTIONS
-skip_if_skipped
-skip_if_backend uml
-skip_unless_phony_guest windows.img
-
-img_base="$abs_top_builddir/test-data/phony-guests/windows.img"
-
-export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools"
-export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win"
-
-d=$PWD/test-v2v-in-place.d
-rm -rf $d
-mkdir $d
-
-img="$d/test.qcow2"
-rm -f $img
-qemu-img create -f qcow2 -b $img_base -o compat=1.1,backing_fmt=raw $img
-md5="$(do_md5 $img_base)"
-
-libvirt_xml="$d/test.xml"
-rm -f $libvirt_xml
-n=windows-overlay
-cat > $libvirt_xml <<EOF
-<node>
- <domain type='test'>
- <name>$n</name>
- <memory>1048576</memory>
- <os>
- <type>hvm</type>
- <boot dev='hd'/>
- </os>
- <devices>
- <disk type='file' device='disk'>
- <driver name='qemu' type='qcow2'/>
- <source file='$img'/>
- <target dev='vda' bus='virtio'/>
- </disk>
- </devices>
- </domain>
-</node>
-EOF
-
-$VG virt-v2v --debug-gc -i libvirt -ic "test://$libvirt_xml" $n --in-place
-
-# Test that the drivers have been copied over into the guest
-script="$d/test.fish"
-expected="$d/expected"
-response="$d/response"
-
-mktest ()
-{
- local cmd="$1" exp="$2"
-
- echo "echo '$cmd'" >> "$script"
- echo "$cmd" >> "$expected"
-
- echo "$cmd" >> "$script"
- echo "$exp" >> "$expected"
-}
-
-:> "$script"
-:> "$expected"
-
-firstboot_dir="/Program Files/Guestfs/Firstboot"
-mktest "is-dir \"$firstboot_dir\"" true
-mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
-mktest "is-dir \"$firstboot_dir/scripts\"" true
-virtio_dir="/Windows/Drivers/VirtIO"
-mktest "is-dir \"$virtio_dir\"" true
-for drv in netkvm qxl vioscsi viostor; do
- for sfx in cat inf sys; do
- mktest "is-file \"$virtio_dir/$drv.$sfx\"" true
- done
-done
-
-guestfish --ro -a "$img" -i < "$script" > "$response"
-diff -u "$expected" "$response"
-
-# Test the base image remained untouched
-test "$md5" = "$(do_md5 $img_base)"
-
-# Clean up.
-rm -r $d
diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
index df69e2e0..7b79d462 100644
--- a/v2v/cmdline.ml
+++ b/v2v/cmdline.ml
@@ -252,8 +252,7 @@ let parse_cmdline () =
s_"Use password from file to connect to input hypervisor";
[ M"it" ], Getopt.String ("transport", set_string_option_once "-it" input_transport),
s_"Input transport";
- [ L"in-place" ], Getopt.Set in_place,
- s_"Only tune the guest in the input VM";
+ [ L"in-place" ], Getopt.Set in_place, Getopt.hidden_option_description;
[ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac),
s_"Map NIC to network or bridge or assign static IP";
[ S 'n'; L"network" ], Getopt.String ("in:out", add_network),
@@ -396,7 +395,6 @@ read the man page virt-v2v(1).
pr "vddk\n";
pr "colours-option\n";
pr "vdsm-compat-option\n";
- pr "in-place\n";
pr "io/oo\n";
pr "mac-option\n";
pr "bandwidth-option\n";
@@ -572,6 +570,10 @@ read the man page virt-v2v(1).
error (f_"only -it ssh can be used here") in
Input_vmx.input_vmx input_password input_transport arg in
+ (* Prevent use of --in-place option in RHEL. *)
+ if in_place then
+ error (f_"--in-place cannot be used in RHEL");
+
(* Common error message. *)
let error_option_cannot_be_used_in_output_mode mode opt =
error (f_"-o %s: %s option cannot be used in this output mode") mode opt

View File

@ -0,0 +1,23 @@
From ca9e31a9ae2e9cf5df5c65955ad746ee9f8d560b 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 8: v2v: -i disk: force VNC as display (RHBZ#1372671)
The SDL output mode is not supported in RHEL 8's qemu-kvm.
---
v2v/input_disk.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/v2v/input_disk.ml b/v2v/input_disk.ml
index d146e84c..4e403003 100644
--- a/v2v/input_disk.ml
+++ b/v2v/input_disk.ml
@@ -89,7 +89,7 @@ class input_disk input_format disk = object
s_features = [ "acpi"; "apic"; "pae" ];
s_firmware = UnknownFirmware; (* causes virt-v2v to autodetect *)
s_display =
- Some { s_display_type = Window; s_keymap = None; s_password = None;
+ Some { s_display_type = VNC; s_keymap = None; s_password = None;
s_listen = LNoListen; s_port = None };
s_video = None;
s_sound = None;

View File

@ -1,18 +1,18 @@
From 70b8b26867ca0c4a142f3fb436e4dbb66a01f187 Mon Sep 17 00:00:00 2001
From 959c084383b259ff54a247b4fdda3254e3f335db 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)
Subject: [PATCH] RHEL 8: v2v: do not mention SUSE Xen hosts (RHBZ#1430203)
They are not supported in RHEL.
They are not supported in RHEL 8.
---
docs/virt-v2v-input-xen.pod | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/virt-v2v-input-xen.pod b/docs/virt-v2v-input-xen.pod
index c4948e5e..97727b8f 100644
index 3b3cf0f0..32da2848 100644
--- a/docs/virt-v2v-input-xen.pod
+++ b/docs/virt-v2v-input-xen.pod
@@ -11,7 +11,7 @@ virt-v2v-input-xen - Using virt-v2v to convert guests from Xen
@@ -12,7 +12,7 @@ virt-v2v-input-xen - Using virt-v2v to convert guests from Xen
=head1 DESCRIPTION
This page documents how to use L<virt-v2v(1)> to convert guests from
@ -21,6 +21,3 @@ index c4948e5e..97727b8f 100644
=head1 INPUT FROM XEN
--
2.31.1

View File

@ -0,0 +1,86 @@
From 4bd92b1fc4f830529b439c4a4e09281fcd9eab78 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 14 May 2018 10:16:58 +0100
Subject: [PATCH] RHEL 8: v2v: rhv-upload: Remove restriction on -oa sparse.
See: https://bugzilla.redhat.com/show_bug.cgi?id=1565681
and the v2v-devel private thread "Do we already support migration using FC?"
---
docs/virt-v2v-output-rhv.pod | 8 +-------
v2v/output_rhv_upload.ml | 10 +---------
v2v/rhv-upload-plugin.py | 4 +---
3 files changed, 3 insertions(+), 19 deletions(-)
diff --git a/docs/virt-v2v-output-rhv.pod b/docs/virt-v2v-output-rhv.pod
index 7c9b478a..36c3676f 100644
--- a/docs/virt-v2v-output-rhv.pod
+++ b/docs/virt-v2v-output-rhv.pod
@@ -5,7 +5,7 @@ virt-v2v-output-rhv - Using virt-v2v to convert guests to oVirt or RHV
=head1 SYNOPSIS
virt-v2v [-i* options] -o rhv-upload [-oc ENGINE_URL] -os STORAGE
- [-op PASSWORD] [-of raw]
+ [-op PASSWORD]
[-oo rhv-cafile=FILE]
[-oo rhv-cluster=CLUSTER]
[-oo rhv-direct]
@@ -79,12 +79,6 @@ username is not specified then virt-v2v defaults to using
C<admin@internal> which is the typical superuser account for oVirt
instances.
-=item I<-of raw>
-
-Currently you must use I<-of raw> and you cannot use I<-oa preallocated>.
-
-These restrictions will be loosened in a future version.
-
=item I<-op> F<password-file>
A file containing a password to be used when connecting to the oVirt
diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml
index 5c6c2611..81896e53 100644
--- a/v2v/output_rhv_upload.ml
+++ b/v2v/output_rhv_upload.ml
@@ -135,17 +135,10 @@ let error_unless_nbdkit_compiled_with_selinux config =
error (f_"nbdkit was compiled without SELinux support. You will have to recompile nbdkit with libselinux-devel installed, or else set SELinux to Permissive mode while doing the conversion.")
)
-(* Output sparse must be sparse. We may be able to
- * lift this limitation in future, but it requires changes on the
- * RHV side. See TODO file for details. XXX
- *)
+(* Output format must be raw. *)
let error_current_limitation required_param =
error (f_"rhv-upload: currently you must use %s. This restriction will be loosened in a future version.") required_param
-let error_unless_output_alloc_sparse output_alloc =
- if output_alloc <> Sparse then
- error_current_limitation "-oa sparse"
-
let json_optstring = function
| Some s -> JSON.String s
| None -> JSON.Null
@@ -247,7 +240,6 @@ object
error_unless_nbdkit_min_version config;
error_unless_nbdkit_python_plugin_working plugin_script;
error_unless_nbdkit_compiled_with_selinux config;
- error_unless_output_alloc_sparse output_alloc;
(* Python code prechecks. *)
let precheck_fn = tmpdir // "v2vprecheck.json" in
diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py
index d3e6260e..471102da 100644
--- a/v2v/rhv-upload-plugin.py
+++ b/v2v/rhv-upload-plugin.py
@@ -477,10 +477,8 @@ def create_disk(connection):
# size, based on qemu-img measure of the overlay.
initial_size=params['disk_size'],
provisioned_size=params['disk_size'],
- # XXX Ignores params['output_sparse'].
- # Handling this properly will be complex, see:
# https://www.redhat.com/archives/libguestfs/2018-March/msg00177.html
- sparse=True,
+ sparse=params['output_sparse'],
storage_domains=[
types.StorageDomain(
name=params['output_storage'],

View File

@ -0,0 +1,24 @@
From ca86a08fe00a56a21d239cb6d1ca6dc9f8ff28fa Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Sun, 16 Dec 2018 16:42:46 +0100
Subject: [PATCH] RHEL 8: use platform-python
Use the stable platform-python provided in BaseOS, instead of relying on
some arbitrary version installed by the user.
---
v2v/python_script.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/v2v/python_script.ml b/v2v/python_script.ml
index 33c5e9a2..b1ea8f9d 100644
--- a/v2v/python_script.ml
+++ b/v2v/python_script.ml
@@ -24,7 +24,7 @@ open Unix_utils
open Common_gettext.Gettext
-let python = "python3" (* Defined by PEP 394 *)
+let python = "/usr/libexec/platform-python"
type script = {
tmpdir : string; (* Temporary directory. *)

View File

@ -1,17 +1,17 @@
From fa8028afa670c3575f31b838f1d15ed7ee16f26a Mon Sep 17 00:00:00 2001
From 1de8532631a765c03196774e0b4a41966284bae3 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
Subject: [PATCH] RHEL 8: point to KB for supported v2v hypervisors/guests
---
docs/virt-v2v-support.pod | 104 ++------------------------------------
1 file changed, 4 insertions(+), 100 deletions(-)
docs/virt-v2v-support.pod | 102 ++------------------------------------
1 file changed, 4 insertions(+), 98 deletions(-)
diff --git a/docs/virt-v2v-support.pod b/docs/virt-v2v-support.pod
index 9815f51f..1ffc0f9d 100644
index 8333366b..a5150907 100644
--- a/docs/virt-v2v-support.pod
+++ b/docs/virt-v2v-support.pod
@@ -8,106 +8,10 @@ systems and guests in virt-v2v
@@ -8,104 +8,10 @@ systems and guests in virt-v2v
This page documents which foreign hypervisors, virtualization
management systems and guest types that L<virt-v2v(1)> can support.
@ -98,8 +98,6 @@ index 9815f51f..1ffc0f9d 100644
-
-=item OpenSUSE 10 and up
-
-=item ALT Linux 9 and up
-
-=item Debian 6 and up
-
-=item Ubuntu 10.04, 12.04, 14.04, 16.04, and up
@ -122,6 +120,3 @@ index 9815f51f..1ffc0f9d 100644
=head2 Guest firmware
--
2.31.1

View File

@ -0,0 +1,385 @@
From 186c237ac1cb6f6830cfe2d08dfdcfdbdffab264 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 6 Apr 2020 10:19:12 +0100
Subject: [PATCH] v2v: Allow large temporary directory to be set on a global
basis.
Previously we placed large files in g#get_cachedir () (usually
/var/tmp). However the problem is this ties the libguestfs appliance
and the virt-v2v overlay files to the same location.
When virt-v2v is run in a container, or any other situation where
local storage is limited, it's helpful to be able to put the overlay
files on an externally mounted PVC, which might be using NFS and
shared between containers. But putting the libguestfs appliance on
NFS in a shared location is certainly not recommended.
This allows the two locations to be set separately:
VIRT_V2V_TMPDIR - location of large temporary files, can use NFS
and may be shared
LIBGUESTFS_CACHEDIR - location of libguestfs appliance
Another motivation for this patch is to allow more reliable cleanup of
large temporary files by an external process, as described in the
updated documentation.
Small temporary files are placed in $TMPDIR (usually /tmp). I cleaned
up some existing code which used /var/tmp for small temporaries.
(cherry picked from commit 717b808bc5cb632778973eb000600e87eaf5c31a)
---
docs/virt-v2v.pod | 27 +++++++++++++++++++--------
v2v/input_ova.ml | 4 ++--
v2v/input_vmx.ml | 3 +--
v2v/output_glance.ml | 3 +--
v2v/output_null.ml | 3 +--
v2v/output_rhv_upload.ml | 29 ++++++++++++++++-------------
v2v/parse_ova.ml | 6 ++----
v2v/python_script.ml | 12 +++---------
v2v/python_script.mli | 5 +----
v2v/utils.ml | 6 +++++-
v2v/utils.mli | 5 +++++
v2v/v2v.ml | 14 ++++++--------
12 files changed, 62 insertions(+), 55 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 6f9f323e..af69d633 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -1172,8 +1172,8 @@ possible.
=head3 Disk space
Virt-v2v places potentially large temporary files in
-C<$LIBGUESTFS_CACHEDIR> (which is F</var/tmp> if you don't set it).
-Using tmpfs is a bad idea.
+C<$VIRT_V2V_TMPDIR> (usually F</var/tmp>, see also
+L</ENVIRONMENT VARIBLES> below). Using tmpfs is a bad idea.
For each guest disk, an overlay is stored temporarily. This stores
the changes made during conversion, and is used as a cache. The
@@ -1186,12 +1186,12 @@ and output methods may use disk space, as outlined in the table below.
=item I<-i ova>
This temporarily places a full copy of the uncompressed source disks
-in C<$LIBGUESTFS_CACHEDIR> (or F</var/tmp>).
+in C<$VIRT_V2V_TMPDIR> (or F</var/tmp>).
=item I<-o glance>
This temporarily places a full copy of the output disks in
-C<$LIBGUESTFS_CACHEDIR> (or F</var/tmp>).
+C<$VIRT_V2V_TMPDIR> (or F</var/tmp>).
=item I<-o local>
@@ -1311,7 +1311,7 @@ have at least 100 available inodes.
=head3 Minimum free space check in the host
You must have sufficient free space in the host directory used to
-store temporary overlays. To find out
+store large temporary overlays. To find out
which directory this is, use:
$ df -h "`guestfish get-cachedir`"
@@ -1319,9 +1319,12 @@ which directory this is, use:
/dev/mapper/root 50G 40G 6.8G 86% /
and look under the C<Avail> column. Virt-v2v will refuse to do the
-conversion at all unless at least 1GB is available there.
+conversion at all unless at least 1GB is available there. You can
+change the directory that virt-v2v uses by setting
+C<$VIRT_V2V_TMPDIR>.
-See also L</Resource requirements> above.
+See also L</Resource requirements> above and L</ENVIRONMENT VARIABLES>
+below.
=head2 Running virt-v2v as root or non-root
@@ -1496,10 +1499,18 @@ conversion.
=over 4
+=item C<VIRT_V2V_TMPDIR>
+
=item C<LIBGUESTFS_CACHEDIR>
Location of the temporary directory used for the potentially large
-temporary overlay file. If not set, F</var/tmp> is used.
+temporary overlay file. If neither environment variable is set then
+F</var/tmp> is used.
+
+To reliably ensure large temporary files are cleaned up (for example
+in case virt-v2v crashes) you should create a randomly named directory
+under F</var/tmp>, set C<VIRT_V2V_TMPDIR> to point to this directory,
+then when virt-v2v exits remove the directory.
See the L</Disk space> section above.
diff --git a/v2v/input_ova.ml b/v2v/input_ova.ml
index 5d3bece1..d78a5ce8 100644
--- a/v2v/input_ova.ml
+++ b/v2v/input_ova.ml
@@ -132,8 +132,8 @@ class input_ova ova = object
(* The spec allows the file to be gzip-compressed, in
* which case we must uncompress it into a temporary.
*)
- let temp_dir = (open_guestfs ())#get_cachedir () in
- let new_filename = Filename.temp_file ~temp_dir "ova" ".vmdk" in
+ let new_filename =
+ Filename.temp_file ~temp_dir:Utils.large_tmpdir "ova" ".vmdk" in
unlink_on_exit new_filename;
let cmd =
sprintf "zcat %s > %s" (quote filename) (quote new_filename) in
diff --git a/v2v/input_vmx.ml b/v2v/input_vmx.ml
index f1d143e9..7a7647e5 100644
--- a/v2v/input_vmx.ml
+++ b/v2v/input_vmx.ml
@@ -389,8 +389,7 @@ and find_nics vmx =
class input_vmx input_password input_transport arg =
let tmpdir =
- let base_dir = (open_guestfs ())#get_cachedir () in
- let t = Mkdtemp.temp_dir ~base_dir "vmx." in
+ let t = Mkdtemp.temp_dir "vmx." in
rmdir_on_exit t;
t in
object
diff --git a/v2v/output_glance.ml b/v2v/output_glance.ml
index 0a9e9181..e8facd0a 100644
--- a/v2v/output_glance.ml
+++ b/v2v/output_glance.ml
@@ -33,8 +33,7 @@ class output_glance () =
* to write to a temporary file. XXX
*)
let tmpdir =
- let base_dir = (open_guestfs ())#get_cachedir () in
- let t = Mkdtemp.temp_dir ~base_dir "glance." in
+ let t = Mkdtemp.temp_dir ~base_dir:large_tmpdir "glance." in
rmdir_on_exit t;
t in
object
diff --git a/v2v/output_null.ml b/v2v/output_null.ml
index 3528da50..edb749ea 100644
--- a/v2v/output_null.ml
+++ b/v2v/output_null.ml
@@ -75,8 +75,7 @@ class output_null =
* the null-co device w/ a JSON URL.
*)
let tmpdir =
- let base_dir = (open_guestfs ())#get_cachedir () in
- let t = Mkdtemp.temp_dir ~base_dir "null." in
+ let t = Mkdtemp.temp_dir ~base_dir:large_tmpdir "null." in
rmdir_on_exit t;
t in
object
diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml
index 81896e53..913992d9 100644
--- a/v2v/output_rhv_upload.ml
+++ b/v2v/output_rhv_upload.ml
@@ -148,25 +148,28 @@ class output_rhv_upload output_alloc output_conn
rhv_options =
(* Create a temporary directory which will be deleted on exit. *)
let tmpdir =
- let base_dir = (open_guestfs ())#get_cachedir () in
- let t = Mkdtemp.temp_dir ~base_dir "rhvupload." in
+ let t = Mkdtemp.temp_dir "rhvupload." in
rmdir_on_exit t;
t in
let diskid_file_of_id id = tmpdir // sprintf "diskid.%d" id in
(* Create Python scripts for precheck, vmcheck, plugin and create VM. *)
- let py_create = Python_script.create ~tmpdir in
- let precheck_script = py_create ~name:"rhv-upload-precheck.py"
- Output_rhv_upload_precheck_source.code in
- let vmcheck_script = py_create ~name:"rhv-upload-vmcheck.py"
- Output_rhv_upload_vmcheck_source.code in
- let plugin_script = py_create ~name:"rhv-upload-plugin.py"
- Output_rhv_upload_plugin_source.code in
- let createvm_script = py_create ~name:"rhv-upload-createvm.py"
- Output_rhv_upload_createvm_source.code in
- let deletedisks_script = py_create ~name:"rhv-upload-deletedisks.py"
- Output_rhv_upload_deletedisks_source.code in
+ let precheck_script =
+ Python_script.create ~name:"rhv-upload-precheck.py"
+ Output_rhv_upload_precheck_source.code in
+ let vmcheck_script =
+ Python_script.create ~name:"rhv-upload-vmcheck.py"
+ Output_rhv_upload_vmcheck_source.code in
+ let plugin_script =
+ Python_script.create ~name:"rhv-upload-plugin.py"
+ Output_rhv_upload_plugin_source.code in
+ let createvm_script =
+ Python_script.create ~name:"rhv-upload-createvm.py"
+ Output_rhv_upload_createvm_source.code in
+ let deletedisks_script =
+ Python_script.create ~name:"rhv-upload-deletedisks.py"
+ Output_rhv_upload_deletedisks_source.code in
(* JSON parameters which are invariant between disks. *)
let json_params = [
diff --git a/v2v/parse_ova.ml b/v2v/parse_ova.ml
index 0b939ac4..568ac5fa 100644
--- a/v2v/parse_ova.ml
+++ b/v2v/parse_ova.ml
@@ -71,8 +71,7 @@ let rec parse_ova ova =
if is_directory ova then ova, Directory
else (
let tmpdir =
- let base_dir = (open_guestfs ())#get_cachedir () in
- let t = Mkdtemp.temp_dir ~base_dir "ova." in
+ let t = Mkdtemp.temp_dir ~base_dir:large_tmpdir "ova." in
rmdir_on_exit t;
t in
@@ -221,8 +220,7 @@ and uncompress_head format file =
*)
and uncompressed_type format file =
let head, headlen = uncompress_head format file in
- let tmpfile, chan =
- Filename.open_temp_file "ova.file." "" in
+ let tmpfile, chan = Filename.open_temp_file "ova.file." "" in
output chan head 0 headlen;
close_out chan;
let ret = detect_file_type tmpfile in
diff --git a/v2v/python_script.ml b/v2v/python_script.ml
index b1ea8f9d..212c8e1b 100644
--- a/v2v/python_script.ml
+++ b/v2v/python_script.ml
@@ -31,15 +31,9 @@ type script = {
path : string; (* Path to script. *)
}
-let create ?(name = "script.py") ?tmpdir code =
- let tmpdir =
- match tmpdir with
- | None ->
- let base_dir = (open_guestfs ())#get_cachedir () in
- let t = Mkdtemp.temp_dir ~base_dir "v2v." in
- rmdir_on_exit t;
- t
- | Some dir -> dir in
+let create ?(name = "script.py") code =
+ let tmpdir = Mkdtemp.temp_dir "v2v." in
+ rmdir_on_exit tmpdir;
let path = tmpdir // name in
with_open_out path (fun chan -> output_string chan code);
{ tmpdir; path }
diff --git a/v2v/python_script.mli b/v2v/python_script.mli
index 6bf77e34..fdf73514 100644
--- a/v2v/python_script.mli
+++ b/v2v/python_script.mli
@@ -20,14 +20,11 @@
type script
-val create : ?name:string -> ?tmpdir:string -> string -> script
+val create : ?name:string -> string -> script
(** Create a Python script object.
The optional parameter [?name] is a hint for the name of the script.
- The optional parameter [?tmpdir] is the temporary directory to use
- (instead of creating a new one).
-
The parameter is the Python code. Usually this is
[Some_source.code] where [some_source.ml] is generated from
the Python file by [v2v/embed.sh] (see also [v2v/Makefile.am]). *)
diff --git a/v2v/utils.ml b/v2v/utils.ml
index c2940582..a6c359f0 100644
--- a/v2v/utils.ml
+++ b/v2v/utils.ml
@@ -24,6 +24,10 @@ open Std_utils
open Tools_utils
open Common_gettext.Gettext
+let large_tmpdir =
+ try Sys.getenv "VIRT_V2V_TMPDIR"
+ with Not_found -> (open_guestfs ())#get_cachedir ()
+
(* Is SELinux enabled and enforcing on the host? *)
let have_selinux =
0 = Sys.command "getenforce 2>/dev/null | grep -isq Enforcing"
@@ -114,6 +118,7 @@ let qemu_img_supports_offset_and_size () =
* file that has an offset and size.
*)
let tmp = Filename.temp_file "v2vqemuimgtst" ".img" in
+ unlink_on_exit tmp;
Unix.truncate tmp 1024;
let json = [
@@ -133,7 +138,6 @@ let qemu_img_supports_offset_and_size () =
(if verbose () then "" else " 2>&1") in
debug "%s" cmd;
let r = 0 = Sys.command cmd in
- Unix.unlink tmp;
debug "qemu-img supports \"offset\" and \"size\" in json URLs: %b" r;
r
diff --git a/v2v/utils.mli b/v2v/utils.mli
index 937e2b9b..d86ca507 100644
--- a/v2v/utils.mli
+++ b/v2v/utils.mli
@@ -18,6 +18,11 @@
(** Utilities used in virt-v2v only. *)
+val large_tmpdir : string
+(** [VIRT_V2V_TMPDIR] or [/var/tmp]. Create all large temporary files
+ such as overlays in this directory. Small temporary files can
+ use the default behaviour eg. of {!Filename.temp_file} *)
+
val have_selinux : bool
(** True if SELinux is enabled and enforcing on the host. *)
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index 73edff2c..a58ff433 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -264,8 +264,6 @@ and set_source_networks_and_bridges cmdline source =
let nics = List.map (Networks.map cmdline.network_map) source.s_nics in
{ source with s_nics = nics }
-and overlay_dir = (open_guestfs ())#get_cachedir ()
-
(* Conversion can fail or hang if there is insufficient free space in
* the temporary directory used to store overlays on the host
* (RHBZ#1316479). Although only a few hundred MB is actually
@@ -273,12 +271,12 @@ and overlay_dir = (open_guestfs ())#get_cachedir ()
* guestfs appliance which is also stored here.
*)
and check_host_free_space () =
- let free_space = StatVFS.free_space (StatVFS.statvfs overlay_dir) in
- debug "check_host_free_space: overlay_dir=%s free_space=%Ld"
- overlay_dir free_space;
+ let free_space = StatVFS.free_space (StatVFS.statvfs large_tmpdir) in
+ debug "check_host_free_space: large_tmpdir=%s free_space=%Ld"
+ large_tmpdir free_space;
if free_space < 1_073_741_824L then
error (f_"insufficient free space in the conversion server temporary directory %s (%s).\n\nEither free up space in that directory, or set the LIBGUESTFS_CACHEDIR environment variable to point to another directory with more than 1GB of free space.\n\nSee also the virt-v2v(1) manual, section \"Minimum free space check in the host\".")
- overlay_dir (human_size free_space)
+ large_tmpdir (human_size free_space)
(* Create a qcow2 v3 overlay to protect the source image(s). *)
and create_overlays source_disks =
@@ -286,7 +284,7 @@ and create_overlays source_disks =
List.mapi (
fun i ({ s_qemu_uri = qemu_uri; s_format = format } as source) ->
let overlay_file =
- Filename.temp_file ~temp_dir:overlay_dir "v2vovl" ".qcow2" in
+ Filename.temp_file ~temp_dir:large_tmpdir "v2vovl" ".qcow2" in
unlink_on_exit overlay_file;
(* There is a specific reason to use the newer qcow2 variant:
@@ -823,7 +821,7 @@ and preserve_overlays overlays src_name =
List.iter (
fun ov ->
let saved_filename =
- sprintf "%s/%s-%s.qcow2" overlay_dir src_name ov.ov_sd in
+ sprintf "%s/%s-%s.qcow2" large_tmpdir src_name ov.ov_sd in
rename ov.ov_overlay_file saved_filename;
info (f_"Overlay saved as %s [--debug-overlays]") saved_filename
) overlays

View File

@ -0,0 +1,31 @@
From 82d56820db4f05711b125daf46a4777e99dbdf87 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 25 Aug 2020 08:23:52 +0100
Subject: [PATCH] v2v: -o openstack: Allow guests to be converted to UEFI
(RHBZ#1872094).
Since this output method was written the code has always been capable
of adding the hw_firmware_type = uefi image property, and this
property has been supported since at least OpenStack 12 which is years
old.
Interestingly now all of the output modes support both BIOS and UEFI.
(cherry picked from commit 5fa65a13fbbaab03cb558d0c776c17227433f1b3)
---
v2v/output_openstack.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/v2v/output_openstack.ml b/v2v/output_openstack.ml
index 179b0edf..fdc04b02 100644
--- a/v2v/output_openstack.ml
+++ b/v2v/output_openstack.ml
@@ -390,7 +390,7 @@ object
| None -> ""
| Some op -> " -op " ^ op)
- method supported_firmware = [ TargetBIOS ]
+ method supported_firmware = [ TargetBIOS; TargetUEFI ]
(* List of Cinder volume IDs. *)
val mutable volume_ids = []

View File

@ -0,0 +1,41 @@
From 358122c089d1e4df014a6821365341d3220ab6e6 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 19 Jan 2021 11:26:23 +0000
Subject: [PATCH] v2v: Fix spelling mistake in uninstall function name.
Fixes: commit 53847717fa1d0ffc2a174275badf486eb1ed6fae
(cherry picked from commit 3515c9f617271bec89962ba8a2b8c690e6df4c99)
---
v2v/convert_windows.ml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index ba26949f..f2f7b95c 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -135,7 +135,7 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
(* Locate and retrieve all the uninstallation commands for installed
* applications.
*)
- let unistallation_commands pretty_name matchfn extra_uninstall_string =
+ let uninstallation_commands pretty_name matchfn extra_uninstall_string =
let uninsts = ref [] in
Registry.with_hive_readonly g inspect.i_windows_software_hive
@@ -198,14 +198,14 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
*)
let extra_uninstall_string =
Some "PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in
- unistallation_commands "Parallels Tools" matchfn extra_uninstall_string in
+ uninstallation_commands "Parallels Tools" matchfn extra_uninstall_string in
(* Locate and retrieve all uninstallation commands for VMware Tools. *)
let vmwaretools_uninst =
let matchfn s =
String.find s "VMware Tools" != -1
in
- unistallation_commands "VMware Tools" matchfn None in
+ uninstallation_commands "VMware Tools" matchfn None in
(*----------------------------------------------------------------------*)
(* Perform the conversion of the Windows guest. *)

View File

@ -0,0 +1,134 @@
From 9c81b523857e057b8361cbbcc4647ed02b572ca0 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 19 Jan 2021 11:38:46 +0000
Subject: [PATCH] v2v: windows: Refactor uninstallation_commands function.
Simplify and shorten this function:
- Remove unnecessary use of Not_found exception and generally
simplify flow control.
- Use sprintf.
This shouldn't change what the function does.
(cherry picked from commit d48530209a79725f26d6e25101bed6f228f45e8d)
---
v2v/convert_windows.ml | 89 ++++++++++++++++++------------------------
1 file changed, 37 insertions(+), 52 deletions(-)
diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index f2f7b95c..84db742f 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -135,56 +135,41 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
(* Locate and retrieve all the uninstallation commands for installed
* applications.
*)
- let uninstallation_commands pretty_name matchfn extra_uninstall_string =
- let uninsts = ref [] in
+ let uninstallation_commands pretty_name matchfn extra_uninstall_params =
+ let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in
+ let uninstval = "UninstallString" in
+ let ret = ref [] in
- Registry.with_hive_readonly g inspect.i_windows_software_hive
- (fun reg ->
- try
- let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in
- let node =
- match Registry.get_node reg path with
- | None -> raise Not_found
- | Some node -> node in
- let uninstnodes = g#hivex_node_children node in
-
- Array.iter (
- fun { G.hivex_node_h = uninstnode } ->
- try
+ Registry.with_hive_readonly g inspect.i_windows_software_hive (
+ fun reg ->
+ match Registry.get_node reg path with
+ | None -> ()
+ | Some node ->
+ let uninstnodes = g#hivex_node_children node in
+ Array.iter (
+ fun { G.hivex_node_h = uninstnode } ->
let valueh = g#hivex_node_get_value uninstnode "DisplayName" in
- if valueh = 0L then
- raise Not_found;
-
- let dispname = g#hivex_value_string valueh in
- if not (matchfn dispname) then
- raise Not_found;
-
- let uninstval = "UninstallString" in
- let valueh = g#hivex_node_get_value uninstnode uninstval in
- if valueh = 0L then (
- let name = g#hivex_node_name uninstnode in
- warning (f_"cannot uninstall %s: registry key HKLM\\SOFTWARE\\%s\\%s with DisplayName %s doesn't contain value %s")
- pretty_name (String.concat "\\" path) name dispname uninstval;
- raise Not_found
- );
-
- let uninst = (g#hivex_value_string valueh) ^
- " /quiet /norestart /l*v+ \"%~dpn0.log\"" ^
- " REBOOT=ReallySuppress REMOVE=ALL" in
- let uninst =
- match extra_uninstall_string with
- | None -> uninst
- | Some s -> uninst ^ " " ^ s in
-
- List.push_front uninst uninsts
- with
- Not_found -> ()
- ) uninstnodes
- with
- Not_found -> ()
- );
-
- !uninsts
+ if valueh <> 0L then (
+ let dispname = g#hivex_value_string valueh in
+ if matchfn dispname then (
+ let valueh = g#hivex_node_get_value uninstnode uninstval in
+ if valueh <> 0L then (
+ let reg_cmd = g#hivex_value_string valueh in
+ let cmd =
+ sprintf "%s /quiet /norestart /l*v+ \"%%~dpn0.log\" REBOOT=ReallySuppress REMOVE=ALL %s"
+ reg_cmd extra_uninstall_params in
+ List.push_front cmd ret
+ )
+ else
+ let name = g#hivex_node_name uninstnode in
+ warning (f_"cannot uninstall %s: registry key HKLM\\SOFTWARE\\%s\\%s with DisplayName %s doesn't contain value %s")
+ pretty_name (String.concat "\\" path) name
+ dispname uninstval
+ )
+ )
+ ) uninstnodes
+ ) (* with_hive_readonly *);
+ !ret
in
(* Locate and retrieve all uninstallation commands for Parallels Tools. *)
@@ -196,16 +181,16 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
(* Without these custom Parallels-specific MSI properties the
* uninstaller still shows a no-way-out reboot dialog.
*)
- let extra_uninstall_string =
- Some "PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in
- uninstallation_commands "Parallels Tools" matchfn extra_uninstall_string in
+ let extra_uninstall_params =
+ "PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in
+ uninstallation_commands "Parallels Tools" matchfn extra_uninstall_params in
(* Locate and retrieve all uninstallation commands for VMware Tools. *)
let vmwaretools_uninst =
let matchfn s =
String.find s "VMware Tools" != -1
in
- uninstallation_commands "VMware Tools" matchfn None in
+ uninstallation_commands "VMware Tools" matchfn "" in
(*----------------------------------------------------------------------*)
(* Perform the conversion of the Windows guest. *)

View File

@ -0,0 +1,59 @@
From 2bf5fc815d53e581398e787ae96444c438945ab3 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 19 Jan 2021 12:17:49 +0000
Subject: [PATCH] v2v: Replace broken VMware Tools uninstall command msiexec /i
with /x.
Fixes: https://bugzilla.redhat.com/1917760
Thanks: Chetan Nagarkar
(cherry picked from commit f7496b0a7e76a06bda8d7ec1aba36741f8cb295c)
---
v2v/convert_windows.ml | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index 84db742f..44cef5ed 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -135,7 +135,7 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
(* Locate and retrieve all the uninstallation commands for installed
* applications.
*)
- let uninstallation_commands pretty_name matchfn extra_uninstall_params =
+ let uninstallation_commands pretty_name matchfn modfn extra_uninstall_params =
let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in
let uninstval = "UninstallString" in
let ret = ref [] in
@@ -155,6 +155,7 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
let valueh = g#hivex_node_get_value uninstnode uninstval in
if valueh <> 0L then (
let reg_cmd = g#hivex_value_string valueh in
+ let reg_cmd = modfn reg_cmd in
let cmd =
sprintf "%s /quiet /norestart /l*v+ \"%%~dpn0.log\" REBOOT=ReallySuppress REMOVE=ALL %s"
reg_cmd extra_uninstall_params in
@@ -183,14 +184,22 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
*)
let extra_uninstall_params =
"PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in
- uninstallation_commands "Parallels Tools" matchfn extra_uninstall_params in
+ uninstallation_commands "Parallels Tools" matchfn identity
+ extra_uninstall_params in
(* Locate and retrieve all uninstallation commands for VMware Tools. *)
let vmwaretools_uninst =
let matchfn s =
String.find s "VMware Tools" != -1
in
- uninstallation_commands "VMware Tools" matchfn "" in
+ (* VMware Tools writes the install command (MsiExec /I) into the
+ * UninstallString key in the registry, rather than the uninstall
+ * command. Try to spot this and rewrite. (RHBZ#1917760).
+ *)
+ let re1 = PCRE.compile ~caseless:true "msiexec" in
+ let re2 = PCRE.compile ~caseless:true "/i" in
+ let msifn s = if PCRE.matches re1 s then PCRE.replace re2 "/x" s else s in
+ uninstallation_commands "VMware Tools" matchfn msifn "" in
(*----------------------------------------------------------------------*)
(* Perform the conversion of the Windows guest. *)

View File

@ -0,0 +1,447 @@
From 9292a4637e8f4d534f4dde70e8e5451f61ad0162 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 19 Jan 2021 14:22:33 +0000
Subject: [PATCH] Update common/ submodule to latest upstream.
Only for RHEL AV 8.4.0, allowing this branch to be compiled
from git with libguestfs 1.44.
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 9338df5e...be09523d:
diff --git a/common/mlcustomize/SELinux_relabel.ml b/common/mlcustomize/SELinux_relabel.ml
index 44995df6..5ecf7bd7 100644
--- a/common/mlcustomize/SELinux_relabel.ml
+++ b/common/mlcustomize/SELinux_relabel.ml
@@ -28,65 +28,80 @@ module G = Guestfs
let array_find a l =
List.mem a (Array.to_list l)
-let relabel (g : G.guestfs) =
- (* Is the guest using SELinux? *)
- if g#is_file ~followsymlinks:true "/usr/sbin/load_policy" &&
- g#is_file ~followsymlinks:true "/etc/selinux/config" then (
- (* Is setfiles / SELinux relabelling functionality available? *)
- if g#feature_available [| "selinuxrelabel" |] then (
- (* Use Augeas to parse /etc/selinux/config. *)
- g#aug_init "/" (16+32) (* AUG_SAVE_NOOP | AUG_NO_LOAD *);
- (* See: https://bugzilla.redhat.com/show_bug.cgi?id=975412#c0 *)
- ignore (g#aug_rm "/augeas/load/*[\"/etc/selinux/config/\" !~ regexp('^') + glob(incl) + regexp('/.*')]");
- g#aug_load ();
- debug_augeas_errors g;
-
- (* Get the SELinux policy name, eg. "targeted", "minimum".
- * Use "targeted" if not specified, just like libselinux does.
- *)
- let policy =
- let config_path = "/files/etc/selinux/config" in
- let selinuxtype_path = config_path ^ "/SELINUXTYPE" in
- let keys = g#aug_ls config_path in
- if array_find selinuxtype_path keys then
- g#aug_get selinuxtype_path
- else
- "targeted" in
-
- g#aug_close ();
-
- (* Get the spec file name. *)
- let specfile =
- sprintf "/etc/selinux/%s/contexts/files/file_contexts" policy in
-
- (* RHEL 6.2 - 6.5 had a malformed specfile that contained the
- * invalid regular expression "/var/run/spice-vdagentd.\pid"
- * (instead of "\.p"). This stops setfiles from working on
- * the guest.
- *
- * Because an SELinux relabel writes all over the filesystem,
- * it seems reasonable to fix this problem in the specfile
- * at the same time. (RHBZ#1374232)
- *)
- if g#grep ~fixed:true "vdagentd.\\pid" specfile <> [||] then (
- debug "fixing invalid regular expression in %s" specfile;
- let old_specfile = specfile ^ "~" in
- g#mv specfile old_specfile;
- let content = g#read_file old_specfile in
- let content =
- String.replace content "vdagentd.\\pid" "vdagentd\\.pid" in
- g#write specfile content;
- g#copy_attributes ~all:true old_specfile specfile
- );
-
- (* Relabel everything. *)
- g#selinux_relabel ~force:true specfile "/";
-
- (* If that worked, we don't need to autorelabel. *)
+let rec relabel (g : G.guestfs) =
+ (* Is the guest using SELinux? (Otherwise this is a no-op). *)
+ if is_selinux_guest g then (
+ try
+ use_setfiles g;
+ (* That worked, so we don't need to autorelabel. *)
g#rm_f "/.autorelabel"
- )
- else (
- (* SELinux guest, but not SELinux host. Fallback to this. *)
+ with Failure _ ->
+ (* This is the fallback in case something in the setfiles
+ * method didn't work. That includes the case where a non-SELinux
+ * host is processing an SELinux guest, and other things.
+ *)
g#touch "/.autorelabel"
- )
)
+
+and is_selinux_guest g =
+ g#is_file ~followsymlinks:true "/usr/sbin/load_policy" &&
+ g#is_file ~followsymlinks:true "/etc/selinux/config"
+
+and use_setfiles g =
+ (* Is setfiles / SELinux relabelling functionality available? *)
+ if not (g#feature_available [| "selinuxrelabel" |]) then
+ failwith "no selinux relabel feature";
+
+ (* Use Augeas to parse /etc/selinux/config. *)
+ g#aug_init "/" (16+32) (* AUG_SAVE_NOOP | AUG_NO_LOAD *);
+ (* See: https://bugzilla.redhat.com/show_bug.cgi?id=975412#c0 *)
+ ignore (g#aug_rm "/augeas/load/*[\"/etc/selinux/config/\" !~ regexp('^') + glob(incl) + regexp('/.*')]");
+ g#aug_load ();
+ debug_augeas_errors g;
+
+ (* Get the SELinux policy name, eg. "targeted", "minimum".
+ * Use "targeted" if not specified, just like libselinux does.
+ *)
+ let policy =
+ let config_path = "/files/etc/selinux/config" in
+ let selinuxtype_path = config_path ^ "/SELINUXTYPE" in
+ let keys = g#aug_ls config_path in
+ if array_find selinuxtype_path keys then
+ g#aug_get selinuxtype_path
+ else
+ "targeted" in
+
+ g#aug_close ();
+
+ (* Get the spec file name. *)
+ let specfile =
+ sprintf "/etc/selinux/%s/contexts/files/file_contexts" policy in
+
+ (* If the spec file doesn't exist then fall back to using
+ * autorelabel (RHBZ#1828952).
+ *)
+ if not (g#is_file ~followsymlinks:true specfile) then
+ failwith "no spec file";
+
+ (* RHEL 6.2 - 6.5 had a malformed specfile that contained the
+ * invalid regular expression "/var/run/spice-vdagentd.\pid"
+ * (instead of "\.p"). This stops setfiles from working on
+ * the guest.
+ *
+ * Because an SELinux relabel writes all over the filesystem,
+ * it seems reasonable to fix this problem in the specfile
+ * at the same time. (RHBZ#1374232)
+ *)
+ if g#grep ~fixed:true "vdagentd.\\pid" specfile <> [||] then (
+ debug "fixing invalid regular expression in %s" specfile;
+ let old_specfile = specfile ^ "~" in
+ g#mv specfile old_specfile;
+ let content = g#read_file old_specfile in
+ let content =
+ String.replace content "vdagentd.\\pid" "vdagentd\\.pid" in
+ g#write specfile content;
+ g#copy_attributes ~all:true old_specfile specfile
+ );
+
+ (* Relabel everything. *)
+ g#selinux_relabel ~force:true specfile "/"
diff --git a/common/mltools/Makefile.am b/common/mltools/Makefile.am
index 3b4172db..aea2dce9 100644
--- a/common/mltools/Makefile.am
+++ b/common/mltools/Makefile.am
@@ -95,6 +95,7 @@ libmltools_a_CPPFLAGS = \
-I$(shell $(OCAMLC) -where) \
-I$(top_srcdir)/common/utils \
-I$(top_srcdir)/lib \
+ $(INCLUDE_DIRECTORY) \
-I$(top_srcdir)/common/options \
-I$(top_srcdir)/common/mlgettext \
-I$(top_srcdir)/common/mlpcre \
diff --git a/common/mltools/tools_utils.ml b/common/mltools/tools_utils.ml
index 12718022..d54ec581 100644
--- a/common/mltools/tools_utils.ml
+++ b/common/mltools/tools_utils.ml
@@ -679,3 +679,53 @@ let with_timeout op timeout ?(sleep = 2) fn =
loop ()
in
loop ()
+
+let run_in_guest_command g root ?logfile ?incompatible_fn cmd =
+ (* Is the host_cpu compatible with the guest arch? ie. Can we
+ * run commands in this guest?
+ *)
+ let guest_arch = g#inspect_get_arch root in
+ let guest_arch_compatible = guest_arch_compatible guest_arch in
+ if not guest_arch_compatible then (
+ match incompatible_fn with
+ | None -> ()
+ | Some fn -> fn ()
+ )
+ else (
+ (* Add a prologue to the scripts:
+ * - Pass environment variables through from the host.
+ * - Optionally send stdout and stderr to a log file so we capture
+ * all output in error messages.
+ * - Use setarch when running x86_64 host + i686 guest.
+ *)
+ let env_vars =
+ List.filter_map (
+ fun name ->
+ try Some (sprintf "export %s=%s" name (quote (Sys.getenv name)))
+ with Not_found -> None
+ ) [ "http_proxy"; "https_proxy"; "ftp_proxy"; "no_proxy" ] in
+ let env_vars = String.concat "\n" env_vars ^ "\n" in
+
+ let cmd =
+ match Guestfs_config.host_cpu, guest_arch with
+ | "x86_64", ("i386"|"i486"|"i586"|"i686") ->
+ sprintf "setarch i686 <<\"__EOCMD\"
+%s
+__EOCMD
+" cmd
+ | _ -> cmd in
+
+ let logfile_redirect =
+ match logfile with
+ | None -> ""
+ | Some logfile -> sprintf "exec >>%s 2>&1" (quote logfile) in
+
+ let cmd = sprintf "\
+%s
+%s
+%s
+" (logfile_redirect) env_vars cmd in
+
+ debug "running command:\n%s" cmd;
+ ignore (g#sh cmd)
+ )
diff --git a/common/mltools/tools_utils.mli b/common/mltools/tools_utils.mli
index ab70f583..1d1ac8a8 100644
--- a/common/mltools/tools_utils.mli
+++ b/common/mltools/tools_utils.mli
@@ -195,9 +195,8 @@ val is_btrfs_subvolume : Guestfs.guestfs -> string -> bool
(** Checks if a filesystem is a btrfs subvolume. *)
val inspect_decrypt : Guestfs.guestfs -> key_store -> unit
-(** Simple implementation of decryption: look for any [crypto_LUKS]
- partitions and decrypt them, then rescan for VGs. This only works
- for Fedora whole-disk encryption. *)
+(** Simple implementation of decryption: look for any encrypted
+ partitions and decrypt them, then rescan for VGs. *)
val with_timeout : string -> int -> ?sleep:int -> (unit -> 'a option) -> 'a
(** [with_timeout op timeout ?sleep fn] implements a timeout loop.
@@ -212,3 +211,13 @@ val with_timeout : string -> int -> ?sleep:int -> (unit -> 'a option) -> 'a
calls {!error} and the program exits. The error message will
contain the diagnostic string [op] to identify the operation
which timed out. *)
+
+val run_in_guest_command : Guestfs.guestfs -> string -> ?logfile:string -> ?incompatible_fn:(unit -> unit) -> string -> unit
+(** [run_in_guest_command g root ?incompatible_archs_fn cmd]
+ runs a command in the guest, which is already mounted for the
+ specified [root]. The command is run directly in case the
+ architecture of the host and the guest are compatible, optionally
+ calling [?incompatible_fn] in case they are not.
+
+ [?logfile] is an optional file in the guest to where redirect
+ stdout and stderr of the command. *)
diff --git a/common/mlutils/unix_utils-c.c b/common/mlutils/unix_utils-c.c
index 33099611..8acf0395 100644
--- a/common/mlutils/unix_utils-c.c
+++ b/common/mlutils/unix_utils-c.c
@@ -77,6 +77,7 @@ extern value guestfs_int_mllib_mkdtemp (value val_pattern);
extern value guestfs_int_mllib_realpath (value pathv);
extern value guestfs_int_mllib_statvfs_statvfs (value pathv);
extern value guestfs_int_mllib_statvfs_is_network_filesystem (value pathv);
+extern value guestfs_int_mllib_sysconf_nr_processors_online (value unitv);
/* NB: This is a "noalloc" call. */
value
@@ -368,3 +369,17 @@ guestfs_int_mllib_statvfs_is_network_filesystem (value pathv)
return Val_bool (0);
#endif
}
+
+/* NB: This is a "noalloc" call. */
+value
+guestfs_int_mllib_sysconf_nr_processors_online (value unitv)
+{
+#ifdef _SC_NPROCESSORS_ONLN
+ long n;
+
+ n = sysconf (_SC_NPROCESSORS_ONLN);
+ if (n > 0) return Val_int (n);
+#endif
+ /* Return a safe value so that callers don't need to deal with errors. */
+ return Val_int (1);
+}
diff --git a/common/mlutils/unix_utils.ml b/common/mlutils/unix_utils.ml
index 52eb824d..2bdda12a 100644
--- a/common/mlutils/unix_utils.ml
+++ b/common/mlutils/unix_utils.ml
@@ -84,3 +84,8 @@ module StatVFS = struct
external is_network_filesystem : string -> bool =
"guestfs_int_mllib_statvfs_is_network_filesystem" "noalloc"
end
+
+module Sysconf = struct
+ external nr_processors_online : unit -> int =
+ "guestfs_int_mllib_sysconf_nr_processors_online" "noalloc"
+end
diff --git a/common/mlutils/unix_utils.mli b/common/mlutils/unix_utils.mli
index 4fcea4a3..aead4df2 100644
--- a/common/mlutils/unix_utils.mli
+++ b/common/mlutils/unix_utils.mli
@@ -121,3 +121,12 @@ module StatVFS : sig
(** [is_network_filesystem path] returns true if [path] is located on
a network filesystem such as NFS or CIFS. *)
end
+
+module Sysconf : sig
+ val nr_processors_online : unit -> int
+ (** [nr_processors_online ()] returns the number of processors
+ currently online, from [sysconf (_SC_NPROCESSORS_ONLN)].
+
+ Note this never fails. In case we cannot get the number of
+ cores it returns 1. *)
+end
diff --git a/common/options/Makefile.am b/common/options/Makefile.am
index f7ea7493..162d143b 100644
--- a/common/options/Makefile.am
+++ b/common/options/Makefile.am
@@ -41,8 +41,9 @@ liboptions_la_SOURCES = \
liboptions_la_CPPFLAGS = \
-DGUESTFS_NO_DEPRECATED=1 \
-I$(top_srcdir)/common/utils -I$(top_builddir)/common/utils \
+ -I$(top_srcdir)/gnulib/lib -I$(top_builddir)/gnulib/lib \
-I$(top_srcdir)/lib -I$(top_builddir)/lib \
- -I$(top_srcdir)/gnulib/lib -I$(top_builddir)/gnulib/lib
+ $(INCLUDE_DIRECTORY)
liboptions_la_CFLAGS = \
$(WARN_CFLAGS) $(WERROR_CFLAGS) \
$(LIBCONFIG_CFLAGS) \
diff --git a/common/options/decrypt.c b/common/options/decrypt.c
index 683cf5ed..434b7d58 100644
--- a/common/options/decrypt.c
+++ b/common/options/decrypt.c
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <string.h>
#include <libintl.h>
#include <error.h>
@@ -38,18 +39,18 @@
/**
* Make a LUKS map name from the partition name,
- * eg. C<"/dev/vda2" =E<gt> "luksvda2">
+ * eg. C<"/dev/vda2" =E<gt> "cryptvda2">
*/
static void
make_mapname (const char *device, char *mapname, size_t len)
{
size_t i = 0;
- if (len < 5)
+ if (len < 6)
abort ();
- strcpy (mapname, "luks");
- mapname += 4;
- len -= 4;
+ strcpy (mapname, "crypt");
+ mapname += 5;
+ len -= 5;
if (STRPREFIX (device, "/dev/"))
i = 5;
@@ -65,10 +66,8 @@ make_mapname (const char *device, char *mapname, size_t len)
}
/**
- * Simple implementation of decryption: look for any C<crypto_LUKS>
- * partitions and decrypt them, then rescan for VGs. This only works
- * for Fedora whole-disk encryption. WIP to make this work for other
- * encryption schemes.
+ * Simple implementation of decryption: look for any encrypted
+ * partitions and decrypt them, then rescan for VGs.
*/
void
inspect_do_decrypt (guestfs_h *g, struct key_store *ks)
@@ -82,12 +81,21 @@ inspect_do_decrypt (guestfs_h *g, struct key_store *ks)
for (i = 0; partitions[i] != NULL; ++i) {
CLEANUP_FREE char *type = guestfs_vfs_type (g, partitions[i]);
- if (type && STREQ (type, "crypto_LUKS")) {
+ if (type &&
+ (STREQ (type, "crypto_LUKS") || STREQ (type, "BitLocker"))) {
+ bool is_bitlocker = STREQ (type, "BitLocker");
char mapname[32];
make_mapname (partitions[i], mapname, sizeof mapname);
#ifdef GUESTFS_HAVE_LUKS_UUID
- CLEANUP_FREE char *uuid = guestfs_luks_uuid (g, partitions[i]);
+ CLEANUP_FREE char *uuid = NULL;
+
+ /* This fails for Windows BitLocker disks because cryptsetup
+ * luksUUID cannot read a UUID (unclear if this is a limitation
+ * of the format or cryptsetup).
+ */
+ if (!is_bitlocker)
+ uuid = guestfs_luks_uuid (g, partitions[i]);
#else
const char *uuid = NULL;
#endif
@@ -97,11 +105,15 @@ inspect_do_decrypt (guestfs_h *g, struct key_store *ks)
/* Try each key in turn. */
for (j = 0; keys[j] != NULL; ++j) {
- /* XXX Should we call guestfs_luks_open_ro if readonly flag
+ /* XXX Should we set GUESTFS_CRYPTSETUP_OPEN_READONLY if readonly
* is set? This might break 'mount_ro'.
*/
guestfs_push_error_handler (g, NULL, NULL);
+#ifdef GUESTFS_HAVE_CRYPTSETUP_OPEN
+ r = guestfs_cryptsetup_open (g, partitions[i], keys[j], mapname, -1);
+#else
r = guestfs_luks_open (g, partitions[i], keys[j], mapname);
+#endif
guestfs_pop_error_handler (g);
if (r == 0)
goto opened;
diff --git a/common/options/uri.c b/common/options/uri.c
index ac36bccb..6b696fc2 100644
--- a/common/options/uri.c
+++ b/common/options/uri.c
@@ -194,6 +194,7 @@ parse (const char *arg, char **path_ret, char **protocol_ret,
if (path && path[0] == '/' &&
(STREQ (uri->scheme, "gluster") ||
STREQ (uri->scheme, "iscsi") ||
+ STREQ (uri->scheme, "nbd") ||
STREQ (uri->scheme, "rbd") ||
STREQ (uri->scheme, "sheepdog")))
path++;
diff --git a/common/utils/guestfs-stringlists-utils.h b/common/utils/guestfs-stringlists-utils.h
index 0bac1587..ade3b6f3 100644
--- a/common/utils/guestfs-stringlists-utils.h
+++ b/common/utils/guestfs-stringlists-utils.h
@@ -21,7 +21,8 @@
/* stringlists-utils.c */
extern void guestfs_int_free_string_list (char **);
-extern size_t guestfs_int_count_strings (char *const *);
+extern size_t guestfs_int_count_strings (char *const *)
+ __attribute__((__nonnull__ (1)));
extern char *guestfs_int_concat_strings (char *const *);
extern char **guestfs_int_copy_string_list (char *const *);
extern char *guestfs_int_join_strings (const char *sep, char *const *);

View File

@ -0,0 +1,80 @@
From 987ddcd2ad7546212d3afed52b56f27a664624d6 Mon Sep 17 00:00:00 2001
From: Nir Soffer <nsoffer@redhat.com>
Date: Thu, 21 Jan 2021 03:40:00 +0200
Subject: [PATCH] v2v: rhv-upload-plugin: Defer imageio connection
When using vddk input with certain vmware version, qemu-img may spend
lot of time getting source image extents. If getting image extents takes
more than 60 seconds, imageio server closes the idle connection, and the
transfer will fail on the first write with:
nbdkit: python[1]: error: /var/tmp/rhvupload.0OKqWA/rhv-upload-plugin.py: pwrite: error:
Traceback (most recent call last):
File "/var/tmp/rhvupload.0OKqWA/rhv-upload-plugin.py", line 94, in wrapper
return func(h, *args)
File "/var/tmp/rhvupload.0OKqWA/rhv-upload-plugin.py", line 230, in pwrite
r = http.getresponse()
File "/usr/lib64/python3.6/http/client.py", line 1361, in getresponse
response.begin()
File "/usr/lib64/python3.6/http/client.py", line 311, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python3.6/http/client.py", line 280, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response
This happens only when not using unix socket, for example when running
on non-ovirt host, or ovirt host from another data center, or when using
-oo rhv_direct=false
When using unix socket, we close the initial HTTPSConnection, and
created a new UnixHTTPConnection. This connection is not connected to
the server yet. When qemu-img tries to access the server, the connection
is connected automatically.
Fix the issue by closing the initial connection used to get server
options and initialize the handle, and storing a closed connection in
the handle.
Here is the flow with this change:
1. Create HTTPSConnection for getting server options
2. Close the connection[1]
3. If using unix socket, create UnixHTTPConnection.
4. Store the connection in the handle.
5. When qemu-img try to write/zero, the connection is reconnects
automatically to imageio server[2]
Tested by adding a 300 milliseconds delay in nbdkit file plugin. Due to
the way qemu-img works, this cause more than 2 minutes delay after
open() but before the first pwrite(). Without this change, the import
fails consistently when using rhv_direct=false.
[1] https://github.com/python/cpython/blob/34df10a9a16b38d54421eeeaf73ec89828563be7/Lib/http/client.py#L958
[2] https://github.com/python/cpython/blob/34df10a9a16b38d54421eeeaf73ec89828563be7/Lib/http/client.py#L972
Signed-off-by: Nir Soffer <nsoffer@redhat.com>
(cherry picked from commit 1d5fc257765c444644e5bfc6525e86ff201755f0)
---
v2v/rhv-upload-plugin.py | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py
index 471102da..7cd6dea6 100644
--- a/v2v/rhv-upload-plugin.py
+++ b/v2v/rhv-upload-plugin.py
@@ -117,6 +117,15 @@ def open(readonly):
destination_url = parse_transfer_url(transfer)
http = create_http(destination_url)
options = get_options(http, destination_url)
+
+ # Close the initial connection to imageio server. When qemu-img will
+ # try to access the server, HTTPConnection will reconnect
+ # automatically. If we keep this connection idle and qemu-img is too
+ # slow getting image extents, imageio server may close the connection,
+ # and the import will fail on the first write.
+ # See https://bugzilla.redhat.com/1916176.
+ http.close()
+
http = optimize_http(http, host, options)
except:
cancel_transfer(connection, transfer)

View File

@ -0,0 +1,34 @@
From 88429f56491ed0e5b3f5f91e6e352fa1251484bc Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 30 Nov 2020 08:55:34 +0000
Subject: [PATCH] v2v: windows: Fix schtasks /SD parameter.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Thanks: Dinesh Herath, Tomáš Golembiovský, Bryan Kinney, Mark Zealey
Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1895323
(cherry picked from commit b65711c9293415f671d35d0e2f9b55a74343da45)
---
v2v/convert_windows.ml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index 44cef5ed..4d844e2d 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -422,11 +422,12 @@ popd
and configure_qemu_ga files =
List.iter (
fun msi_path ->
+ (* Windows is a trashfire. https://stackoverflow.com/a/18730884 *)
let fb_script = sprintf "\
echo Removing any previously scheduled qemu-ga installation
schtasks.exe /Delete /TN Firstboot-qemu-ga /F
echo Scheduling delayed installation of qemu-ga from %s
-powershell.exe -command \"$d = (get-date).AddSeconds(120); schtasks.exe /Create /SC ONCE /ST $d.ToString('HH:mm') /SD $d.ToString('MM/dd/yyyy') /RU SYSTEM /TN Firstboot-qemu-ga /TR \\\"C:\\%s /forcerestart /qn /l+*vx C:\\%s.log\\\"\"
+powershell.exe -command \"$d = (get-date).AddSeconds(120); $FormatHack = ($([System.Globalization.DateTimeFormatInfo]::CurrentInfo.ShortDatePattern) -replace 'M+/', 'MM/') -replace 'd+/', 'dd/'; schtasks.exe /Create /SC ONCE /ST $d.ToString('HH:mm') /SD $d.ToString($FormatHack) /RU SYSTEM /TN Firstboot-qemu-ga /TR \\\"C:\\%s /forcerestart /qn /l+*vx C:\\%s.log\\\"\"
"
msi_path msi_path msi_path in
Firstboot.add_firstboot_script g inspect.i_root

View File

@ -0,0 +1,29 @@
From b04361528b04dc39368c1d90760e50fad63baa9f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 3 Dec 2020 10:14:08 +0000
Subject: [PATCH] v2v: Turn pnp_wait.exe warning into a debug message.
We've used virt-v2v for years in RHEL without pnp_wait and it's never
been an issue. We don't need a warning here.
Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1903960
(cherry picked from commit 834bea6931b49dc4b14ebe04fd0e0884290bfb78)
---
v2v/convert_windows.ml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index 4d844e2d..33fbd410 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -267,8 +267,8 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
if Sys.file_exists tool_path then
configure_wait_pnp tool_path
else
- warning (f_"%s is missing. Firstboot scripts may conflict with PnP.")
- tool_path;
+ debug (f_"%s is missing. Firstboot scripts may conflict with PnP.")
+ tool_path;
(* Install RHEV-APT only if appropriate for the output hypervisor. *)
if output#install_rhev_apt then (

View File

@ -0,0 +1,24 @@
From 6fb69c6239902cd4462b6c28bc82118cbf9643f2 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 25 Aug 2020 08:27:42 +0100
Subject: [PATCH] docs: UEFI guest conversion to -o openstack is supported
(RHBZ#1872100).
(cherry picked from commit db4e673df51d1235a040dc4a4782268743523e5a)
---
docs/virt-v2v-support.pod | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/virt-v2v-support.pod b/docs/virt-v2v-support.pod
index a5150907..1ffc0f9d 100644
--- a/docs/virt-v2v-support.pod
+++ b/docs/virt-v2v-support.pod
@@ -38,7 +38,7 @@ hypervisor, else you will have to adjust paths in the metadata.
=item UEFI on OpenStack
-Not supported.
+Supported since virt-v2v E<ge> 1.43.2.
=item UEFI on oVirt or RHV

View File

@ -0,0 +1,44 @@
From 8a57af71779e274d31fe7f87a75bc937a59575db Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 27 Apr 2021 16:12:12 +0100
Subject: [PATCH] docs: -o openstack: Clarify name of file containing OpenStack
auth
In particular, don't use "stackrc" since you will likely be connecting
to the undercloud.
Thanks: Ming Xie
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1871754
(cherry picked from commit 61b4b5cc2f64e7a642ea03681f36829dbe665825)
---
docs/virt-v2v-output-openstack.pod | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/docs/virt-v2v-output-openstack.pod b/docs/virt-v2v-output-openstack.pod
index 78623d97..f5a3abad 100644
--- a/docs/virt-v2v-output-openstack.pod
+++ b/docs/virt-v2v-output-openstack.pod
@@ -89,8 +89,8 @@ endpoints. You will need to either set up your C<$OS_*> environment
variables or use output options on the virt-v2v command line to
authenticate with OpenStack.
-Normally there is a file called something like C<stackrc>,
-C<overcloudrc> etc which you can simply C<source> to set everything up.
+Normally there is a file called C<overcloudrc> or C<keystonerc_admin>
+which you can simply C<source> to set everything up.
For example:
@@ -179,8 +179,10 @@ To output to OpenStack Glance, use the I<-o glance> option.
This runs the L<glance(1)> CLI program which must be installed on the
virt-v2v conversion host. For authentication to work, you will need
-to set C<OS_*> environment variables. In most cases you can do this
-by sourcing a file called something like F<keystonerc_admin>.
+to set C<OS_*> environment variables.
+
+Normally there is a file called C<overcloudrc> or C<keystonerc_admin>
+which you can simply C<source> to set everything up.
Virt-v2v adds metadata for the guest to Glance, describing such things
as the guest operating system and what drivers it requires. The

View File

@ -0,0 +1,149 @@
From 704e86cb3bd4ddc3b7c207967f0413b4637be1f3 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 1 Sep 2020 14:44:17 +0100
Subject: [PATCH] v2v: Allow output to block devices (RHBZ#1868690).
We previously implicitly supported writing to block devices instead of
local files, but there were several problems:
* Block devices could be deleted, especially if virt-v2v failed during
a conversion.
* Block devices could be overwritten by a file with the same name,
although I believe this is just an observed consequence of the
previous point, or at least I was not able to reproduce this until
virt-v2v failed for another reason and then I noticed that because
the block device was deleted, the next run overwrote it with a file.
* It was not documented anywhere how to do it.
This commit makes the small code change needed to allow virt-v2v to
write to a block device, only for existing outputs which write to
local files (ie. using TargetFile). Also it avoids deleting block
devices accidentally on failure.
Note this commit intentionally does not prevent you from writing qcow2
to a block device. RHV uses this so it is a thing that people do.
(cherry picked from commit 9a5974fa3bc038e5e5dbb9605a6db77d06e7bf77)
---
docs/virt-v2v.pod | 33 ++++++++++++++++++++++++++++++
v2v/v2v.ml | 51 ++++++++++++++++++++++++++++-------------------
2 files changed, 63 insertions(+), 21 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index af69d633..50b0bc8e 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -1378,8 +1378,41 @@ require either a special user and/or for you to source a script that
sets authentication environment variables. Consult the Glance
documentation.
+=item Writing to block devices
+
+This normally requires root. See the next section.
+
=back
+=head2 Writing to block devices
+
+Some output modes write to local files. In general these modes also
+let you write to block devices, but before you run virt-v2v you may
+have to arrange for symbolic links to the desired block devices in the
+output directory.
+
+For example if using I<-o local -os /dir> then virt-v2v would normally
+create files called:
+
+ /dir/name-sda # first disk
+ /dir/name-sdb # second disk
+ ...
+ /dir/name.xml # metadata
+
+If you wish the disks to be written to block devices then you would
+need to create F</dir/I<name>-sda> (etc) as symlinks to the block
+devices:
+
+ # lvcreate -L 10G -n VolumeForDiskA VG
+ # lvcreate -L 6G -n VolumeForDiskB VG
+ # ln -sf /dev/VG/VolumeForDiskA /dir/name-sda
+ # ln -sf /dev/VG/VolumeForDiskB /dir/name-sdb
+
+Note that you must precreate the correct number of block devices of
+the correct size. Typically I<-of raw> has to be used too, but other
+formats such as qcow2 can be useful occasionally so virt-v2v does not
+force you to use raw on block devices.
+
=head2 Minimal XML for -i libvirtxml option
When using the I<-i libvirtxml> option, you have to supply some
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index a58ff433..1f8d0138 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -681,7 +681,10 @@ and copy_targets cmdline targets input output =
fun t ->
match t.target_file with
| TargetURI _ -> ()
- | TargetFile s -> try unlink s with _ -> ()
+ | TargetFile filename ->
+ if not (is_block_device filename) then (
+ try unlink filename with _ -> ()
+ )
) targets
)
);
@@ -711,27 +714,33 @@ and copy_targets cmdline targets input output =
(match t.target_file with
| TargetFile filename ->
- (* It turns out that libguestfs's disk creation code is
- * considerably more flexible and easier to use than
- * qemu-img, so create the disk explicitly using libguestfs
- * then pass the 'qemu-img convert -n' option so qemu reuses
- * the disk.
- *
- * Also we allow the output mode to actually create the disk
- * image. This lets the output mode set ownership and
- * permissions correctly if required.
+ (* As a special case, allow output to a block device or
+ * symlink to a block device. In this case we don't
+ * create/overwrite the block device. (RHBZ#1868690).
*)
- (* What output preallocation mode should we use? *)
- let preallocation =
- match t.target_format, cmdline.output_alloc with
- | ("raw"|"qcow2"), Sparse -> Some "sparse"
- | ("raw"|"qcow2"), Preallocated -> Some "full"
- | _ -> None (* ignore -oa flag for other formats *) in
- let compat =
- match t.target_format with "qcow2" -> Some "1.1" | _ -> None in
- output#disk_create filename t.target_format
- t.target_overlay.ov_virtual_size
- ?preallocation ?compat
+ if not (is_block_device filename) then (
+ (* It turns out that libguestfs's disk creation code is
+ * considerably more flexible and easier to use than
+ * qemu-img, so create the disk explicitly using libguestfs
+ * then pass the 'qemu-img convert -n' option so qemu reuses
+ * the disk.
+ *
+ * Also we allow the output mode to actually create the disk
+ * image. This lets the output mode set ownership and
+ * permissions correctly if required.
+ *)
+ (* What output preallocation mode should we use? *)
+ let preallocation =
+ match t.target_format, cmdline.output_alloc with
+ | ("raw"|"qcow2"), Sparse -> Some "sparse"
+ | ("raw"|"qcow2"), Preallocated -> Some "full"
+ | _ -> None (* ignore -oa flag for other formats *) in
+ let compat =
+ match t.target_format with "qcow2" -> Some "1.1" | _ -> None in
+ output#disk_create filename t.target_format
+ t.target_overlay.ov_virtual_size
+ ?preallocation ?compat
+ )
| TargetURI _ ->
(* XXX For the moment we assume that qemu URI outputs

View File

@ -0,0 +1,39 @@
From e12604349587b67b3b4c3d0b7b1779999460a93d Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 19 Jun 2020 13:43:47 +0100
Subject: [PATCH] v2v: Disable readahead for VMware curl sources too
(RHBZ#1848862).
This appears to be the cause of timeouts during the conversion step
where VMware VCenter server's Tomcat HTTPS server stops responding to
requests (or rather, responds only with 503 errors). The server later
recovers and in fact because of the retry filter the conversion
usually succeeds, but I found that we can avoid the problem by
disabling readahead.
(cherry picked from commit 9f4940068022d4e7abdfea6617b73a2b206f19aa)
---
v2v/nbdkit_sources.ml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/v2v/nbdkit_sources.ml b/v2v/nbdkit_sources.ml
index f5e91911..7c177e35 100644
--- a/v2v/nbdkit_sources.ml
+++ b/v2v/nbdkit_sources.ml
@@ -99,12 +99,12 @@ let common_create ?bandwidth ?extra_debug ?extra_env password
(* Adding the readahead filter is always a win for our access
* patterns. If it doesn't exist don't worry. However it
- * breaks VMware servers (RHBZ#1832805).
+ * breaks VMware servers (RHBZ#1832805, RHBZ#1848862).
*)
let cmd =
- if plugin_name <> "vddk" then
- Nbdkit.add_filter_if_available cmd "readahead"
- else cmd in
+ match plugin_name with
+ | "vddk" | "curl" -> cmd
+ | _ -> Nbdkit.add_filter_if_available cmd "readahead" in
(* Caching extents speeds up qemu-img, especially its consecutive
* block_status requests with req_one=1.

View File

@ -0,0 +1,34 @@
From c0c4fa145da8a1d7b423c6f54bdf94d270c633de Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 3 Dec 2020 10:06:29 +0000
Subject: [PATCH] docs: Document how to remove "Out of HTTP sessions" limit.
Thanks: Tamir
(cherry picked from commit 00649e98be43b4b05a28c5c8c858a54ec4fe3e7a)
---
docs/virt-v2v-input-vmware.pod | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/docs/virt-v2v-input-vmware.pod b/docs/virt-v2v-input-vmware.pod
index e4df920e..ae8964dd 100644
--- a/docs/virt-v2v-input-vmware.pod
+++ b/docs/virt-v2v-input-vmware.pod
@@ -579,6 +579,18 @@ a stable IP address. After that log in to the vCenter servers admin
console at C<https://vcenter:5480/>. Under the C<Admin> tab, select
C<Certificate regeneration enabled> and then reboot it.
+=head2 vCenter: "Out of HTTP sessions: Limited to ..."
+
+VMware vCenter appears to limit HTTP sessions and in some
+circumstances virt-v2v may exceed this number. You can adjust or
+remove the limit by editing F</etc/vmware-vpx/vpxd.cfg> on the vCenter
+server. Increase the C<E<lt>maxSessionCountE<gt>> field, or set it to
+C<0> which makes it unlimited:
+
+ <soap>
+ <maxSessionCount>0</maxSessionCount>
+ </soap>
+
=head1 SEE ALSO
L<virt-v2v(1)>.

View File

@ -0,0 +1,128 @@
From 90e0e0cfe7d90bb9b8cc4a8eb9225266b1622453 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 15 Apr 2021 16:52:36 +0100
Subject: [PATCH] v2v: Increase required free space in Windows to 100 MB
With an increasing number of drivers being installed in Windows the
existing limit (20 MB) was far too low. In fact we found that a guest
with 63 MB of free space would sometimes run out of space.
This commit increases the required space to 100 MB for Windows.
There are also a couple of smaller fixes:
- We now properly distinguish between / as a Linux boot drive,
and Windows.
- The error message has been improved to display MBs instead of bytes.
Reported-by: Ming Xie
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1949147
(cherry picked from commit dfcf60c916a986a352938b432231a36558a3bc05)
---
docs/virt-v2v.pod | 8 +++++++-
v2v/v2v.ml | 46 +++++++++++++++++++++++++---------------------
2 files changed, 32 insertions(+), 22 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 50b0bc8e..4016c724 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -1288,7 +1288,7 @@ to perform the conversion. Currently it checks:
=over 4
-=item Linux root filesystem or Windows C<C:> drive
+=item Linux root filesystem
Minimum free space: 20 MB
@@ -1299,6 +1299,12 @@ Minimum free space: 50 MB
This is because we need to build a new initramfs for some Enterprise
Linux conversions.
+=item Windows C<C:> drive
+
+Minimum free space: 100 MB
+
+We may have to copy in many virtio drivers and guest agents.
+
=item Any other mountable filesystem
Minimum free space: 10 MB
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index 1f8d0138..bde51885 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -108,7 +108,7 @@ let rec main () =
let inspect = Inspect_source.inspect_source cmdline.root_choice g in
let mpstats = get_mpstats g in
- check_guest_free_space mpstats;
+ check_guest_free_space inspect mpstats;
(* Estimate space required on target for each disk. Note this is a max. *)
(match conversion_mode with
@@ -377,27 +377,28 @@ and print_mpstat chan { mp_dev = dev; mp_path = path;
*
* Also make sure filesystems have available inodes. (RHBZ#1764569)
*)
-and check_guest_free_space mpstats =
+and check_guest_free_space inspect mpstats =
message (f_"Checking for sufficient free disk space in the guest");
(* Check whether /boot has its own mount point. *)
let has_boot = List.exists (fun { mp_path } -> mp_path = "/boot") mpstats in
+ let is_windows = inspect.i_distro = "windows" in
- let needed_bytes_for_mp = function
- | "/boot"
- | "/" when not has_boot ->
- (* We usually regenerate the initramfs, which has a
- * typical size of 20-30MB. Hence:
- *)
- 50_000_000L
- | "/" ->
- (* We may install some packages, and they would usually go
- * on the root filesystem.
- *)
- 20_000_000L
- | _ ->
- (* For everything else, just make sure there is some free space. *)
- 10_000_000L
+ let needed_megabytes_for_mp = function
+ (* We usually regenerate the initramfs, which has a
+ * typical size of 20-30MB. Hence:
+ *)
+ | "/boot" | "/" when not has_boot && not is_windows -> 50
+ (* We may install some packages, and they would usually go
+ * on the root filesystem.
+ *)
+ | "/" when not is_windows -> 20
+ (* Windows requires copying in many device drivers and possibly
+ * guest agents, so we need more space. (RHBZ#1949147).
+ *)
+ | "/" (* when is_windows *) -> 100
+ (* For everything else, just make sure there is some free space. *)
+ | _ -> 10
in
(* Reasonable headroom for conversion operations. *)
@@ -407,10 +408,13 @@ and check_guest_free_space mpstats =
fun { mp_path; mp_statvfs = { G.bfree; bsize; files; ffree } } ->
(* bfree = free blocks for root user *)
let free_bytes = bfree *^ bsize in
- let needed_bytes = needed_bytes_for_mp mp_path in
- if free_bytes < needed_bytes then
- error (f_"not enough free space for conversion on filesystem %s. %Ld bytes free < %Ld bytes needed")
- mp_path free_bytes needed_bytes;
+ let needed_megabytes = needed_megabytes_for_mp mp_path in
+ let needed_bytes = Int64.of_int needed_megabytes *^ 1024L *^ 1024L in
+ if free_bytes < needed_bytes then (
+ let mb i = Int64.to_float i /. 1024. /. 1024. in
+ error (f_"not enough free space for conversion on filesystem %s. %.1f MB free < %d MB needed")
+ mp_path (mb free_bytes) needed_megabytes
+ );
(* Not all the filesystems have inode counts. *)
if files > 0L && ffree < needed_inodes then
error (f_"not enough available inodes for conversion on filesystem %s. %Ld inodes available < %Ld inodes needed")

View File

@ -0,0 +1,27 @@
From 575cb719ceb56d5f1812b6580f3a181bd95f5030 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 27 Apr 2021 17:29:42 +0100
Subject: [PATCH] v2v: windows: Allow qxldod.inf as synonym for qxl.inf
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1926102
Thanks: Xiaodai Wang, Ming Xie
(cherry picked from commit 11d1f3cd6878ae7713e589194f97526f744dc090)
---
v2v/windows_virtio.ml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml
index 4e00cd61..b8256bad 100644
--- a/v2v/windows_virtio.ml
+++ b/v2v/windows_virtio.ml
@@ -155,7 +155,9 @@ let rec install_drivers ((g, _) as reg) inspect rcaps =
(* Can we install the QXL driver? *)
let video : guestcaps_video_type =
- let has_qxl = g#exists (driverdir // "qxl.inf") in
+ let has_qxl =
+ g#exists (driverdir // "qxl.inf") ||
+ g#exists (driverdir // "qxldod.inf") in
match rcaps.rcaps_video, has_qxl with
| Some QXL, false ->
error (f_"there is no QXL driver for this version of Windows (%d.%d %s). virt-v2v looks for this driver in %s")

View File

@ -0,0 +1,25 @@
From e8d3beabfba4b309296569e84b275724e3cd9709 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 30 Jun 2021 16:18:20 +0100
Subject: [PATCH] RHEL 8: docs: Fix version of virt-v2v which added UEFI for
OpenStack
Reported-by: Tingting Zheng
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1872100#c7
---
docs/virt-v2v-support.pod | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/virt-v2v-support.pod b/docs/virt-v2v-support.pod
index 1ffc0f9d..a9bfffab 100644
--- a/docs/virt-v2v-support.pod
+++ b/docs/virt-v2v-support.pod
@@ -38,7 +38,7 @@ hypervisor, else you will have to adjust paths in the metadata.
=item UEFI on OpenStack
-Supported since virt-v2v E<ge> 1.43.2.
+Supported since virt-v2v E<ge> 1.42.0-7.
=item UEFI on oVirt or RHV

View File

@ -0,0 +1,57 @@
From 906e087d6c57d4c1f24ecb60f98a6c98f75881a7 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 20 May 2021 09:10:20 +0100
Subject: [PATCH] v2v: Increase Linux minimum root filesystem to 100 MB
Ming Xie created a RHEL 8.3 guest which required around 70 MB free in
order to recreate the initramfs (temporary space used by the pigz
step). Increase the minimum space required to 100 MB, the same as for
Windows.
Seealso commit dfcf60c916a986a352938b432231a36558a3bc05.
Reported-by: Ming Xie
Fixes: https://bugzilla.redhat.com/1764569#c16
(cherry picked from commit e82ff27c3bea5ce2cc3b7d1ce8d775989fc7e5a5)
---
docs/virt-v2v.pod | 2 +-
v2v/v2v.ml | 12 +++++-------
2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 4016c724..4ecce369 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -1290,7 +1290,7 @@ to perform the conversion. Currently it checks:
=item Linux root filesystem
-Minimum free space: 20 MB
+Minimum free space: 100 MB
=item Linux F</boot>
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index bde51885..8af86687 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -389,14 +389,12 @@ and check_guest_free_space inspect mpstats =
* typical size of 20-30MB. Hence:
*)
| "/boot" | "/" when not has_boot && not is_windows -> 50
- (* We may install some packages, and they would usually go
- * on the root filesystem.
+ (* Both Linux and Windows require installation of files,
+ * device drivers and guest agents.
+ * https://bugzilla.redhat.com/1949147
+ * https://bugzilla.redhat.com/1764569#c16
*)
- | "/" when not is_windows -> 20
- (* Windows requires copying in many device drivers and possibly
- * guest agents, so we need more space. (RHBZ#1949147).
- *)
- | "/" (* when is_windows *) -> 100
+ | "/" -> 100
(* For everything else, just make sure there is some free space. *)
| _ -> 10
in

View File

@ -0,0 +1,176 @@
From 419aa23f0c6338b01b644094c3af2c024470e9b2 Mon Sep 17 00:00:00 2001
From: Nir Soffer <nsoffer@redhat.com>
Date: Sat, 10 Jul 2021 02:35:27 +0300
Subject: [PATCH] v2v: rhv-upload-plugin: Fix waiting for finalize
Waiting for image transfer finalize is complex. In the past we tried to
simplify the process by waiting on the disk status, but turns out that
due to the way oVirt lock the disk, this is not reliable.
These is finalize success flow:
1. User asks to finalize the transfer
2. oVirt sets transfer phase to FINALIZING_SUCCESS
3. oVirt finalizes the transfer
4. oVirt sets disk status to OK
5. oVirt unlocks the disk and changes transfer phase to FINISHED_SUCCESS
6. oVirt removes the transfer
In oVirt logs we can see that disk status changes to OK about 3 seconds
before the disk is actually unlocked. This is a very old problem that is
unlikely to be fixed.
The only way to wait for transfer completion is to poll the transfer
phase, but oVirt makes this hard by removing the transfer shortly after
it completes, so we may not be able to get the FINISHED_SUCCESS phase.
If the transfer was removed before we got one of the final phases, we
need to check the disk status to understand the result of transfer.
oVirt 4.4.7 made polling transfer phase easier by keeping the transfer
after completion, but we need to support older versions so we must have
generic code that work with any version.
To make debugging easier, we log the transfer phase during polling. Here
is a typical transfer log when finalizing transfer:
finalizing transfer 59e545f3-db1f-4a6b-90b1-80ac66572faa
transfer 59e545f3-db1f-4a6b-90b1-80ac66572faa is finalizing_success
transfer 59e545f3-db1f-4a6b-90b1-80ac66572faa is finalizing_success
transfer 59e545f3-db1f-4a6b-90b1-80ac66572faa is finalizing_success
transfer 59e545f3-db1f-4a6b-90b1-80ac66572faa is finalizing_success
transfer 59e545f3-db1f-4a6b-90b1-80ac66572faa is finished_success
transfer 59e545f3-db1f-4a6b-90b1-80ac66572faa finalized in 5.153 seconds
Signed-off-by: Nir Soffer <nsoffer@redhat.com>
Fixes: https://bugzilla.redhat.com/1976024
(cherry picked from commit 79702b28329d15a7485801ed7e915d486fcc0cf4)
---
v2v/rhv-upload-plugin.py | 98 ++++++++++++++++++++++++++++------------
1 file changed, 69 insertions(+), 29 deletions(-)
diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py
index 7cd6dea6..61ade1a8 100644
--- a/v2v/rhv-upload-plugin.py
+++ b/v2v/rhv-upload-plugin.py
@@ -601,17 +601,29 @@ def finalize_transfer(connection, transfer, disk_id):
"""
Finalize a transfer, making the transfer disk available.
- If finalizing succeeds, transfer's phase will change to FINISHED_SUCCESS
- and the transer's disk status will change to OK. On errors, the transfer's
- phase will change to FINISHED_FAILURE and the disk status will change to
- ILLEGAL and it will be removed. In both cases the transfer entity will be
- removed shortly after.
+ If finalizing succeeds, the transfer's disk status will change to OK
+ and transfer's phase will change to FINISHED_SUCCESS. Unfortunately,
+ the disk status is modified before the transfer finishes, and oVirt
+ may still hold a lock on the disk at this point.
- If oVirt fails to finalize the transfer, transfer's phase will change to
- PAUSED_SYSTEM. In this case the disk's status will change to ILLEGAL and it
- will not be removed.
+ The only way to make sure that the disk is unlocked, is to wait
+ until the transfer phase switches FINISHED_SUCCESS. Unfortunately
+ oVirt makes this hard to use because the transfer is removed shortly
+ after switching the phase to the final phase. However if the
+ transfer was removed, we can be sure that the disk is not locked,
+ since oVirt releases the locks before removing the transfer.
- For simplicity, we track only disk's status changes.
+ On errors, the transfer's phase will change to FINISHED_FAILURE and
+ the disk status will change to ILLEGAL and it will be removed. Again
+ the transfer will be removed shortly after that.
+
+ If oVirt fails to finalize the transfer, transfer's phase will
+ change to PAUSED_SYSTEM. In this case the disk's status will change
+ to ILLEGAL and it will not be removed.
+
+ oVirt 4.4.7 made waiting for transfer easier by keeping transfers
+ after they complete, but we must support older versions so we have
+ generic code that work with any version.
For more info see:
- http://ovirt.github.io/ovirt-engine-api-model/4.4/#services/image_transfer
@@ -626,34 +638,62 @@ def finalize_transfer(connection, transfer, disk_id):
transfer_service.finalize()
- disk_service = (connection.system_service()
- .disks_service()
- .disk_service(disk_id))
-
while True:
time.sleep(1)
try:
- disk = disk_service.get()
+ transfer = transfer_service.get()
except sdk.NotFoundError:
- # Disk verification failed and the system removed the disk.
- raise RuntimeError(
- "transfer %s failed: disk %s was removed"
- % (transfer.id, disk_id))
+ # Transfer was removed (ovirt < 4.4.7). We need to check the
+ # disk status to understand if the transfer was successful.
+ # Due to the way oVirt does locking, we know that the disk
+ # is unlocked at this point so we can check only once.
- if disk.status == types.DiskStatus.ILLEGAL:
- # Disk verification failed or transfer was paused by the system.
- raise RuntimeError(
- "transfer %s failed: disk is ILLEGAL" % transfer.id)
+ debug("transfer %s was removed, checking disk %s status"
+ % (transfer.id, disk_id))
+
+ disk_service = (connection.system_service()
+ .disks_service()
+ .disk_service(disk_id))
- if disk.status == types.DiskStatus.OK:
- debug("transfer %s finalized in %.3f seconds"
- % (transfer.id, time.time() - start))
- break
+ try:
+ disk = disk_service.get()
+ except sdk.NotFoundError:
+ raise RuntimeError(
+ "transfer %s failed: disk %s was removed"
+ % (transfer.id, disk_id))
+
+ debug("disk %s is %s" % (disk_id, disk.status))
+
+ if disk.status == types.DiskStatus.OK:
+ break
- if time.time() > start + timeout:
raise RuntimeError(
- "timed out waiting for transfer %s to finalize"
- % transfer.id)
+ "transfer %s failed: disk is %s" % (transfer.id, disk.status))
+ else:
+ # Transfer exists, check if it reached one of the final
+ # phases, or we timed out.
+
+ debug("transfer %s is %s" % (transfer.id, transfer.phase))
+
+ if transfer.phase == types.ImageTransferPhase.FINISHED_SUCCESS:
+ break
+
+ if transfer.phase == types.ImageTransferPhase.FINISHED_FAILURE:
+ raise RuntimeError(
+ "transfer %s has failed" % (transfer.id,))
+
+ if transfer.phase == types.ImageTransferPhase.PAUSED_SYSTEM:
+ raise RuntimeError(
+ "transfer %s was paused by system" % (transfer.id,))
+
+ if time.time() > start + timeout:
+ raise RuntimeError(
+ "timed out waiting for transfer %s to finalize, "
+ "transfer is %s"
+ % (transfer.id, transfer.phase))
+
+ debug("transfer %s finalized in %.3f seconds"
+ % (transfer.id, time.time() - start))
def transfer_supports_format():

View File

@ -0,0 +1,77 @@
From 72f50e52515369ef8decda9493422d6235f5b365 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 18 Aug 2021 11:00:12 +0100
Subject: [PATCH] v2v: windows: Do not fix NTFS heads in Windows Vista and
later
Setting/adjusting the number of drive heads in the NTFS header is only
necessary for ancient versions of Windows. Modern versions ignore
this. In addition this operation broke when we added BitLocker
support. Only do this for ancient Windows 2000/XP and skip it for
everything else.
Reported-by: Ming Xie
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1994984
(cherry picked from commit 0a394c5c2f802098c9e481b4bacee7821e5dd0ae)
---
v2v/convert_windows.ml | 44 ++++++++++++++++++++++--------------------
1 file changed, 23 insertions(+), 21 deletions(-)
diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index 33fbd410..13de10cb 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -730,30 +730,32 @@ if errorlevel 3010 exit /b 0
however, as this is specific to Windows 2003 it lists location
0x1A as unused.
*)
- let rootpart = inspect.i_root in
+ if inspect.i_major_version < 6 (* is Windows 2000/XP *) then (
+ let rootpart = inspect.i_root in
- (* Ignore if the rootpart is something like /dev/sda. RHBZ#1276540. *)
- if not (g#is_whole_device rootpart) then (
- (* Check that the root device contains NTFS magic. *)
- let magic = g#pread_device rootpart 8 3L in
- if magic = "NTFS " then (
- (* Get the size of the whole disk containing the root partition. *)
- let rootdev = g#part_to_dev rootpart in (* eg. /dev/sda *)
- let size = g#blockdev_getsize64 rootdev in
+ (* Ignore if the rootpart is something like /dev/sda. RHBZ#1276540. *)
+ if not (g#is_whole_device rootpart) then (
+ (* Check that the root device contains NTFS magic. *)
+ let magic = g#pread_device rootpart 8 3L in
+ if magic = "NTFS " then (
+ (* Get the size of the whole disk containing the root partition. *)
+ let rootdev = g#part_to_dev rootpart in (* eg. /dev/sda *)
+ let size = g#blockdev_getsize64 rootdev in
- let heads = (* refer to the table above *)
- if size < 2114445312L then 0x40
- else if size < 4228374780L then 0x80
- else 0xff in
+ let heads = (* refer to the table above *)
+ if size < 2114445312L then 0x40
+ else if size < 4228374780L then 0x80
+ else 0xff in
- (* Update NTFS's idea of the number of heads. This is an
- * unsigned 16 bit little-endian integer, offset 0x1a from the
- * beginning of the partition.
- *)
- let b = Bytes.create 2 in
- Bytes.unsafe_set b 0 (Char.chr heads);
- Bytes.unsafe_set b 1 '\000';
- ignore (g#pwrite_device rootpart (Bytes.to_string b) 0x1a_L)
+ (* Update NTFS's idea of the number of heads. This is an
+ * unsigned 16 bit little-endian integer, offset 0x1a from the
+ * beginning of the partition.
+ *)
+ let b = Bytes.create 2 in
+ Bytes.unsafe_set b 0 (Char.chr heads);
+ Bytes.unsafe_set b 1 '\000';
+ ignore (g#pwrite_device rootpart (Bytes.to_string b) 0x1a_L)
+ )
)
)

View File

@ -0,0 +1,272 @@
From cc9a507e2372b5b6408964f9c31a3bd526aabf7c Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 23 Sep 2020 09:56:27 +0100
Subject: [PATCH] v2v: vcenter: Implement cookie scripts.
For conversions[*] which take longer than 30 minutes it can happen
that the HTTPS authorization cookie that we fetched from VMware when
we first connect expires. This can especially happen when there are
multiple disks, because we may not "touch" (therefore autorenew) the
second disk while we are doing the long conversion. This can lead to
failures, some of which are silent: again if there are multiple disks,
fstrim of the non-system disks can fail silently resulting in the copy
step taking a very long time.
The solution to this is to use the new nbdkit-curl-plugin
cookie-script feature which allows nbdkit to automatically renew the
cookie as required.
During the conversion or copying steps you may see the cookie being
autorenewed:
nbdkit: curl[3]: debug: curl: running cookie-script
nbdkit: curl[3]: debug: cookie-script returned cookies
This removes the ?user and ?password parameters from Nbdkit_sources.-
create_curl because they are no longer needed after this change.
Note for future: if we need to add them back, we must prevent both
user and cookie_script parameters from being used at the same time,
because simply having the user parameter will try basic
authentication, overriding the cookie, which will either fail (no
password) or run very slowly.
This change requires nbdkit >= 1.22 which is checked at runtime only
if this feature is used.
[*] Note here I mean conversions not the total runtime of virt-v2v.
When doing the copy the cookie does not expire because it is
continuously auto-renewed by VMware as we continuously access the disk
(this works differently from systems like Docker where the cookie is
only valid from the absolute time when it is first created). This
change also implements the cookie-script logic for copying.
(cherry picked from commit 2b9a11743b74ef3716b66a7e395108a26382e331)
Notes for cherry pick to RHEL 8.6:
We no longer need the session_cookie field inside virt-v2v since it is
replaced by the cookie script. However it is still needed by
virt-v2v-copy-to-local. (This utility is removed upstream and in RHEL
9, but we need to keep it around at least for appearances in RHEL 8.)
So when cherry picking I had to retain the get_session_cookie function
which required also keeping fetch_headers_and_url as it was (not
dropping headers).
---
v2v/nbdkit_sources.ml | 34 ++++++++++++-----
v2v/nbdkit_sources.mli | 5 +--
v2v/parse_libvirt_xml.ml | 3 +-
v2v/vCenter.ml | 80 +++++++++++++++++++++++++++++++---------
4 files changed, 90 insertions(+), 32 deletions(-)
diff --git a/v2v/nbdkit_sources.ml b/v2v/nbdkit_sources.ml
index 7c177e35..16af5f5c 100644
--- a/v2v/nbdkit_sources.ml
+++ b/v2v/nbdkit_sources.ml
@@ -26,7 +26,6 @@ open Types
open Utils
let nbdkit_min_version = (1, 12, 0)
-let nbdkit_min_version_string = "1.12.0"
type password =
| NoPassword (* no password option at all *)
@@ -38,11 +37,16 @@ let error_unless_nbdkit_working () =
if not (Nbdkit.is_installed ()) then
error (f_"nbdkit is not installed or not working")
-let error_unless_nbdkit_min_version config =
+let error_unless_nbdkit_version_ge config min_version =
let version = Nbdkit.version config in
- if version < nbdkit_min_version then
- error (f_"nbdkit is too old. nbdkit >= %s is required.")
- nbdkit_min_version_string
+ if version < min_version then (
+ let min_major, min_minor, min_release = min_version in
+ error (f_"nbdkit is too old. nbdkit >= %d.%d.%d is required.")
+ min_major min_minor min_release
+ )
+
+let error_unless_nbdkit_min_version config =
+ error_unless_nbdkit_version_ge config nbdkit_min_version
let error_unless_nbdkit_plugin_exists plugin =
if not (Nbdkit.probe_plugin plugin) then
@@ -297,23 +301,35 @@ let create_ssh ?bandwidth ~password ?port ~server ?user path =
common_create ?bandwidth password "ssh" (get_args ())
(* Create an nbdkit module specialized for reading from Curl sources. *)
-let create_curl ?bandwidth ?cookie ~password ?(sslverify=true) ?user url =
+let create_curl ?bandwidth ?cookie_script ?cookie_script_renew
+ ?(sslverify=true) url =
error_unless_nbdkit_plugin_exists "curl";
+ (* The cookie* parameters require nbdkit 1.22, so check that early. *)
+ if cookie_script <> None || cookie_script_renew <> None then (
+ let config = Nbdkit.config () in
+ error_unless_nbdkit_version_ge config (1, 22, 0)
+ );
+
let add_arg, get_args =
let args = ref [] in
let add_arg (k, v) = List.push_front (k, v) args in
let get_args () = List.rev !args in
add_arg, get_args in
- Option.may (fun s -> add_arg ("user", s)) user;
(* https://bugzilla.redhat.com/show_bug.cgi?id=1146007#c10 *)
add_arg ("timeout", "2000");
- Option.may (fun s -> add_arg ("cookie", s)) cookie;
+ Option.may (fun s -> add_arg ("cookie-script", s)) cookie_script;
+ Option.may (fun i -> add_arg ("cookie-script-renew", string_of_int i))
+ cookie_script_renew;
if not sslverify then add_arg ("sslverify", "false");
add_arg ("url", url);
- common_create ?bandwidth password "curl" (get_args ())
+ (* For lots of extra debugging, uncomment one or both lines. *)
+ (*add_arg ("--debug", "curl.verbose=1");*)
+ (*add_arg ("--debug", "curl.scripts=1");*)
+
+ common_create ?bandwidth NoPassword "curl" (get_args ())
let run cmd =
let sock, _ = Nbdkit.run_unix cmd in
diff --git a/v2v/nbdkit_sources.mli b/v2v/nbdkit_sources.mli
index 94810ea6..922642df 100644
--- a/v2v/nbdkit_sources.mli
+++ b/v2v/nbdkit_sources.mli
@@ -60,10 +60,9 @@ val create_ssh : ?bandwidth:Types.bandwidth ->
Note this doesn't run nbdkit yet, it just creates the object. *)
val create_curl : ?bandwidth:Types.bandwidth ->
- ?cookie:string ->
- password:password ->
+ ?cookie_script:string ->
+ ?cookie_script_renew:int ->
?sslverify:bool ->
- ?user:string ->
string -> Nbdkit.cmd
(** Create a nbdkit object using the Curl plugin. The required
string parameter is the URL.
diff --git a/v2v/parse_libvirt_xml.ml b/v2v/parse_libvirt_xml.ml
index 0b136839..fffc5a24 100644
--- a/v2v/parse_libvirt_xml.ml
+++ b/v2v/parse_libvirt_xml.ml
@@ -319,8 +319,7 @@ let parse_libvirt_xml ?bandwidth ?conn xml =
| _, Some port ->
invalid_arg "invalid port number in libvirt XML" in
sprintf "%s://%s%s%s" driver host port (uri_quote path) in
- let nbdkit = Nbdkit_sources.create_curl ?bandwidth ~password:NoPassword
- url in
+ let nbdkit = Nbdkit_sources.create_curl ?bandwidth url in
let qemu_uri = Nbdkit_sources.run nbdkit in
add_disk qemu_uri format controller P_dont_rewrite
| Some protocol, _, _ ->
diff --git a/v2v/vCenter.ml b/v2v/vCenter.ml
index 4c128b0c..ead03364 100644
--- a/v2v/vCenter.ml
+++ b/v2v/vCenter.ml
@@ -46,11 +46,12 @@ let rec map_source ?bandwidth ?password_file dcPath uri server path =
(* XXX only works if the query string is not URI-quoted *)
String.find query "no_verify=1" = -1 in
+ (* Check the URL exists and authentication info is correct. *)
let https_url =
let https_url = get_https_url dcPath uri server path in
- (* Check the URL exists. *)
- let status, _, _ =
+ let status, _, dump_response =
fetch_headers_from_url password_file uri sslverify https_url in
+
(* If a disk is actually a snapshot image it will have '-00000n'
* appended to its name, e.g.:
* [yellow:storage1] RHEL4-X/RHEL4-X-000003.vmdk
@@ -58,28 +59,71 @@ let rec map_source ?bandwidth ?password_file dcPath uri server path =
* a 404 and the vmdk name looks like it might be a snapshot, try
* again without the snapshot suffix.
*)
- if status = "404" && PCRE.matches snapshot_re path then (
- let path = PCRE.sub 1 ^ PCRE.sub 2 in
- get_https_url dcPath uri server path
- )
- else
- (* Note that other non-200 status errors will be handled
- * in get_session_cookie below, so we don't have to worry
- * about them here.
- *)
- https_url in
+ let https_url, status, dump_response =
+ if status = "404" && PCRE.matches snapshot_re path then (
+ let path = PCRE.sub 1 ^ PCRE.sub 2 in
+ let https_url = get_https_url dcPath uri server path in
+ let status, _, dump_response =
+ fetch_headers_from_url password_file uri sslverify https_url in
+ https_url, status, dump_response
+ )
+ else (https_url, status, dump_response) in
+
+ if status = "401" then (
+ dump_response stderr;
+ if uri.uri_user <> None then
+ error (f_"vcenter: incorrect username or password")
+ else
+ error (f_"vcenter: incorrect username or password. You might need to specify the username in the URI like this: [vpx|esx|..]://USERNAME@[etc]")
+ );
+
+ if status = "404" then (
+ dump_response stderr;
+ error (f_"vcenter: URL not found: %s") https_url
+ );
+
+ if status <> "200" then (
+ dump_response stderr;
+ error (f_"vcenter: invalid response from server: %s") status
+ );
+
+ https_url in
let session_cookie =
get_session_cookie password_file uri sslverify https_url in
- let password =
- match password_file with
- | None -> Nbdkit_sources.NoPassword
- | Some password_file -> Nbdkit_sources.PasswordFile password_file in
+ (* Write a cookie script to retrieve the session cookie.
+ * See nbdkit-curl-plugin(1) "Example: VMware ESXi cookies"
+ *)
+ let cookie_script, chan =
+ Filename.open_temp_file ~perms:0o700 "v2vcs" ".sh" in
+ unlink_on_exit cookie_script;
+ let fpf fs = fprintf chan fs in
+ fpf "#!/bin/sh -\n";
+ fpf "\n";
+ fpf "curl --head -s";
+ if not sslverify then fpf " --insecure";
+ (match uri.uri_user, password_file with
+ | None, None -> ()
+ | Some user, None -> fpf " -u %s" (quote user)
+ | None, Some password_file ->
+ fpf " -u \"$LOGNAME\":\"$(cat %s)\"" (quote password_file)
+ | Some user, Some password_file ->
+ fpf " -u %s:\"$(cat %s)\"" (quote user) (quote password_file)
+ );
+ fpf " %s" (quote https_url);
+ fpf " |\n";
+ fpf "\tsed -ne %s\n" (quote "{ s/^Set-Cookie: \\([^;]*\\);.*/\\1/ip }");
+ close_out chan;
+
+ (* VMware authentication expires after 30 minutes so we must renew
+ * after < 30 minutes.
+ *)
+ let cookie_script_renew = 25*60 in
let nbdkit =
- Nbdkit_sources.create_curl ?bandwidth ?cookie:session_cookie ~password ~sslverify
- ?user:uri.uri_user https_url in
+ Nbdkit_sources.create_curl ?bandwidth ~cookie_script ~cookie_script_renew
+ ~sslverify https_url in
let qemu_uri = Nbdkit_sources.run nbdkit in
(* Return the struct. *)

View File

@ -0,0 +1,41 @@
From 84cb43440a2ad143eb7474a028b1b1549cb8c0f1 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 12 Nov 2021 08:47:55 +0000
Subject: [PATCH] convert/convert_windows.ml: Handle date formats with dots
instead of /
If the ShortDatePattern is yy.M.d (as can happen for US locale) we may
not always reformat the date for schtasks.exe correctly. For
explanation and testing see:
https://bugzilla.redhat.com/show_bug.cgi?id=1895323#c46 (- #c50)
Thanks: Xiaodai Wang for suggesting the fix and testing it
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1895323
(cherry picked from commit d9dc6c42ae64ba92993dbd9477f003ba73fcfa2f)
---
v2v/convert_windows.ml | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index 13de10cb..6c7440aa 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -422,12 +422,15 @@ popd
and configure_qemu_ga files =
List.iter (
fun msi_path ->
- (* Windows is a trashfire. https://stackoverflow.com/a/18730884 *)
+ (* Windows is a trashfire.
+ * https://stackoverflow.com/a/18730884
+ * https://bugzilla.redhat.com/show_bug.cgi?id=1895323
+ *)
let fb_script = sprintf "\
echo Removing any previously scheduled qemu-ga installation
schtasks.exe /Delete /TN Firstboot-qemu-ga /F
echo Scheduling delayed installation of qemu-ga from %s
-powershell.exe -command \"$d = (get-date).AddSeconds(120); $FormatHack = ($([System.Globalization.DateTimeFormatInfo]::CurrentInfo.ShortDatePattern) -replace 'M+/', 'MM/') -replace 'd+/', 'dd/'; schtasks.exe /Create /SC ONCE /ST $d.ToString('HH:mm') /SD $d.ToString($FormatHack) /RU SYSTEM /TN Firstboot-qemu-ga /TR \\\"C:\\%s /forcerestart /qn /l+*vx C:\\%s.log\\\"\"
+powershell.exe -command \"$d = (get-date).AddSeconds(120); $FormatHack = (($([System.Globalization.DateTimeFormatInfo]::CurrentInfo.ShortDatePattern) -replace 'y+', 'yyyy') -replace 'M+', 'MM') -replace 'd+', 'dd'; schtasks.exe /Create /SC ONCE /ST $d.ToString('HH:mm') /SD $d.ToString($FormatHack) /RU SYSTEM /TN Firstboot-qemu-ga /TR \\\"C:\\%s /forcerestart /qn /l+*vx C:\\%s.log\\\"\"
"
msi_path msi_path msi_path in
Firstboot.add_firstboot_script g inspect.i_root

View File

@ -0,0 +1,208 @@
From 350baba10cbef38f7e2829927c2768c7f913e82f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 23 Nov 2021 09:58:50 +0000
Subject: [PATCH] v2v: Force format of input to be specified
qemu 6.1 unnecessarily insists on the backing format of files being
set. Change the type of the input disk so the format is no longer an
option, but must be set by the input mode.
This change is only required on the 1.44 branch, since modular
virt-v2v uses the qemu-nbd -s (snapshot) option to do the equivalent
which seems to handle the backing format automatically.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2025769
Reported-by: Vera Wu
(cherry picked from commit 40cfe6da0861ca6360f670e254c71ed923a0402f)
---
v2v/input_disk.ml | 2 +-
v2v/input_libvirt_vcenter_https.ml | 2 +-
v2v/input_libvirt_vddk.ml | 2 +-
v2v/input_vmx.ml | 2 +-
v2v/parse_libvirt_xml.ml | 13 +++++++++----
v2v/parse_ovf_from_ova.ml | 2 +-
v2v/types.ml | 9 +++------
v2v/types.mli | 2 +-
v2v/v2v.ml | 19 +++++++------------
9 files changed, 25 insertions(+), 28 deletions(-)
diff --git a/v2v/input_disk.ml b/v2v/input_disk.ml
index 4e403003..beaa9a4d 100644
--- a/v2v/input_disk.ml
+++ b/v2v/input_disk.ml
@@ -64,7 +64,7 @@ class input_disk input_format disk = object
let disk = {
s_disk_id = 0;
s_qemu_uri = disk_absolute;
- s_format = Some format;
+ s_format = format;
s_controller = None;
} in
diff --git a/v2v/input_libvirt_vcenter_https.ml b/v2v/input_libvirt_vcenter_https.ml
index ed2e5eed..f3c55b79 100644
--- a/v2v/input_libvirt_vcenter_https.ml
+++ b/v2v/input_libvirt_vcenter_https.ml
@@ -84,7 +84,7 @@ object (self)
(* The libvirt ESX driver doesn't normally specify a format, but
* the format of the -flat file is *always* raw, so force it here.
*)
- { disk with s_qemu_uri = qemu_uri; s_format = Some "raw" }
+ { disk with s_qemu_uri = qemu_uri; s_format = "raw" }
) disks in
source, disks
diff --git a/v2v/input_libvirt_vddk.ml b/v2v/input_libvirt_vddk.ml
index 75fd146e..9463f6ba 100644
--- a/v2v/input_libvirt_vddk.ml
+++ b/v2v/input_libvirt_vddk.ml
@@ -187,7 +187,7 @@ object (self)
(* nbdkit always presents us with the raw disk blocks from
* the guest, so force the format to raw here.
*)
- { disk with s_qemu_uri = qemu_uri; s_format = Some "raw" }
+ { disk with s_qemu_uri = qemu_uri; s_format = "raw" }
) disks in
source, disks
diff --git a/v2v/input_vmx.ml b/v2v/input_vmx.ml
index 7a7647e5..a4ed999a 100644
--- a/v2v/input_vmx.ml
+++ b/v2v/input_vmx.ml
@@ -190,7 +190,7 @@ and find_hdds ?bandwidth input_password vmx vmx_source
let uri, format = qemu_uri_of_filename ?bandwidth input_password
vmx_source filename in
let s = { s_disk_id = (-1);
- s_qemu_uri = uri; s_format = Some format;
+ s_qemu_uri = uri; s_format = format;
s_controller = Some controller } in
Some (c, t, s)
| _ -> None
diff --git a/v2v/parse_libvirt_xml.ml b/v2v/parse_libvirt_xml.ml
index fffc5a24..27e08135 100644
--- a/v2v/parse_libvirt_xml.ml
+++ b/v2v/parse_libvirt_xml.ml
@@ -270,9 +270,10 @@ let parse_libvirt_xml ?bandwidth ?conn xml =
let format =
match xpath_string "driver/@type" with
- | Some "aio" -> Some "raw" (* Xen wierdness *)
- | None -> None
- | Some format -> Some format in
+ | Some "aio" -> "raw" (* Xen wierdness *)
+ | Some format -> format
+ | None ->
+ error (f_"<disk><driver type=\"format\"> attribute is missing from the libvirt XML") in
(* The <disk type='...'> attribute may be 'block', 'file',
* 'network' or 'volume'. We ignore any other types.
@@ -339,7 +340,11 @@ let parse_libvirt_xml ?bandwidth ?conn xml =
let xpath_string = Xpath_helpers.xpath_string xpathctx in
(* Use the format specified in the volume itself. *)
- let format = xpath_string "/volume/target/format/@type" in
+ let format =
+ match xpath_string "/volume/target/format/@type" with
+ | Some format -> format
+ | None ->
+ error (f_"<volume><target>.<format type=\"format\"> attribute is missing from the libvirt XML of volume %s") vol in
(match xpath_string "/volume/@type" with
| None | Some "file" ->
diff --git a/v2v/parse_ovf_from_ova.ml b/v2v/parse_ovf_from_ova.ml
index 758718a2..bc795166 100644
--- a/v2v/parse_ovf_from_ova.ml
+++ b/v2v/parse_ovf_from_ova.ml
@@ -157,7 +157,7 @@ and parse_disks xpathctx =
source_disk = {
s_disk_id = i;
s_qemu_uri = "";
- s_format = Some "vmdk";
+ s_format = "vmdk";
s_controller = controller;
};
href = href;
diff --git a/v2v/types.ml b/v2v/types.ml
index 53daefed..e04bfacf 100644
--- a/v2v/types.ml
+++ b/v2v/types.ml
@@ -56,7 +56,7 @@ and source_firmware =
and source_disk = {
s_disk_id : int;
s_qemu_uri : string;
- s_format : string option;
+ s_format : string;
s_controller : s_controller option;
}
and s_controller = Source_IDE | Source_SATA | Source_SCSI |
@@ -197,11 +197,8 @@ and string_of_source_firmware = function
and string_of_source_disk { s_qemu_uri = qemu_uri; s_format = format;
s_controller = controller } =
- sprintf "\t%s%s%s"
- qemu_uri
- (match format with
- | None -> ""
- | Some format -> " (" ^ format ^ ")")
+ sprintf "\t%s (%s)%s"
+ qemu_uri format
(match controller with
| None -> ""
| Some controller -> " [" ^ string_of_controller controller ^ "]")
diff --git a/v2v/types.mli b/v2v/types.mli
index a9b0a70e..61a19eea 100644
--- a/v2v/types.mli
+++ b/v2v/types.mli
@@ -103,7 +103,7 @@ and source_firmware =
and source_disk = {
s_disk_id : int; (** A unique ID for each source disk. *)
s_qemu_uri : string; (** QEMU URI of source disk. *)
- s_format : string option; (** Format. *)
+ s_format : string; (** Format of source disk. *)
s_controller : s_controller option; (** Controller, eg. IDE, SCSI. *)
}
(** A source disk. *)
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index 8af86687..203b93f1 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -293,12 +293,11 @@ and create_overlays source_disks =
* should allow us to fstrim/blkdiscard and avoid copying
* significant parts of the data over the wire.
*)
- let options =
- "compat=1.1" ^
- (match format with None -> ""
- | Some fmt -> ",backing_fmt=" ^ fmt) in
- let cmd = [ "qemu-img"; "create"; "-q"; "-f"; "qcow2"; "-b"; qemu_uri;
- "-o"; options; overlay_file ] in
+ let cmd = [ "qemu-img"; "create"; "-q";
+ "-o"; "compat=1.1";
+ "-b"; qemu_uri; "-F"; format;
+ "-f"; "qcow2";
+ overlay_file ] in
if run_command cmd <> 0 then
error (f_"qemu-img command failed, see earlier errors");
@@ -344,7 +343,7 @@ and populate_overlays g overlays =
and populate_disks g source_disks =
List.iter (
fun ({s_qemu_uri = qemu_uri; s_format = format}) ->
- g#add_drive_opts qemu_uri ?format ~cachemode:"unsafe"
+ g#add_drive_opts qemu_uri ~format ~cachemode:"unsafe"
~discard:"besteffort"
) source_disks
@@ -604,11 +603,7 @@ and get_target_formats cmdline output overlays =
| None ->
match cmdline.output_format with
| Some format -> format
- | None ->
- match ov.ov_source.s_format with
- | Some format -> format
- | None ->
- error (f_"disk %s (%s) has no defined format.\n\nThe input metadata did not define the disk format (eg. raw/qcow2/etc) of this disk, and so virt-v2v will try to autodetect the format when reading it.\n\nHowever because the input format was not defined, we do not know what output format you want to use. You have two choices: either define the original format in the source metadata, or use the -of option to force the output format.") ov.ov_sd ov.ov_source.s_qemu_uri in
+ | None -> ov.ov_source.s_format in
(* What really happens here is that the call to #disk_create
* below fails if the format is not raw or qcow2. We would

View File

@ -0,0 +1,41 @@
From 992af0707ad54d39ec707da6daa6c4ca7c3fc69a Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 24 Nov 2021 11:23:38 +0000
Subject: [PATCH] v2v: Cope with libvirt vpx/esx driver which does not set
format
See discussion in this bug:
https://bugzilla.redhat.com/show_bug.cgi?id=2026199
Fixes: commit 40cfe6da0861ca6360f670e254c71ed923a0402f
(cherry picked from commit 59dc3293a9b4fdf11da8571c50e3e5badbb511c2)
---
v2v/parse_libvirt_xml.ml | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/v2v/parse_libvirt_xml.ml b/v2v/parse_libvirt_xml.ml
index 27e08135..e65fbf4a 100644
--- a/v2v/parse_libvirt_xml.ml
+++ b/v2v/parse_libvirt_xml.ml
@@ -273,7 +273,11 @@ let parse_libvirt_xml ?bandwidth ?conn xml =
| Some "aio" -> "raw" (* Xen wierdness *)
| Some format -> format
| None ->
- error (f_"<disk><driver type=\"format\"> attribute is missing from the libvirt XML") in
+ (* Some libvirt drivers don't set the format. Typically
+ * this is the vpx/esx driver (see RHBZ#2026199). We
+ * can assume "raw", as it will be overwritten later.
+ *)
+ "raw" in
(* The <disk type='...'> attribute may be 'block', 'file',
* 'network' or 'volume'. We ignore any other types.
@@ -344,7 +348,7 @@ let parse_libvirt_xml ?bandwidth ?conn xml =
match xpath_string "/volume/target/format/@type" with
| Some format -> format
| None ->
- error (f_"<volume><target>.<format type=\"format\"> attribute is missing from the libvirt XML of volume %s") vol in
+ error (f_"<volume><target><format type=\"format\"> attribute is missing from the libvirt XML of volume %s") vol in
(match xpath_string "/volume/@type" with
| None | Some "file" ->

View File

@ -0,0 +1,179 @@
From 8036ab4bc8f37030fcaceda14678cb14dbbed547 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= <tgolembi@redhat.com>
Date: Wed, 20 Apr 2022 17:14:26 +0200
Subject: [PATCH] -o rhv-upload: wait for VM creation task
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
oVirt API call for VM creation finishes before the VM is actually
created. Entities may be still locked after virt-v2v terminates and if
user tries to perform (scripted) actions after virt-v2v those operations
may fail. To prevent this it is useful to monitor the task and wait for
the completion. This will also help to prevent some corner case
scenarios (that would be difficult to debug) when the VM creation job
fails after virt-v2v already termintates with success.
Thanks: Nir Soffer
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1985827
Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
Reviewed-by: Arik Hadas <ahadas@redhat.com>
Reviewed-by: Nir Soffer <nsoffer@redhat.com>
(cherry picked from commit 291edb363e841e1c555954a070def671a651cfab)
---
.../ovirtsdk4/__init__.py | 10 +++-
.../ovirtsdk4/types.py | 19 +++++++
v2v/rhv-upload-createvm.py | 57 ++++++++++++++++++-
3 files changed, 84 insertions(+), 2 deletions(-)
diff --git a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
index abb7050c..ba0649cb 100644
--- a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
+++ b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py
@@ -63,6 +63,9 @@ class SystemService(object):
def disks_service(self):
return DisksService()
+ def jobs_service(self):
+ return JobsService()
+
def image_transfers_service(self):
return ImageTransfersService()
@@ -108,6 +111,11 @@ class DisksService(object):
return DiskService(disk_id)
+class JobsService(object):
+ def list(self, search=None):
+ return [types.Job()]
+
+
class ImageTransferService(object):
def __init__(self):
self._finalized = False
@@ -139,7 +147,7 @@ class StorageDomainsService(object):
class VmsService(object):
- def add(self, vm):
+ def add(self, vm, query=None):
return vm
def list(self, search=None):
diff --git a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
index 732887aa..8e734756 100644
--- a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
+++ b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
@@ -138,6 +138,25 @@ class Initialization(object):
pass
+class JobStatus(Enum):
+ ABORTED = "aborted"
+ FAILED = "failed"
+ FINISHED = "finished"
+ STARTED = "started"
+ UNKNOWN = "unknown"
+
+ def __init__(self, image):
+ self._image = image
+
+ def __str__(self):
+ return self._image
+
+
+class Job(object):
+ description = "Fake job"
+ status = JobStatus.FINISHED
+
+
class StorageDomain(object):
def __init__(self, name=None):
pass
diff --git a/v2v/rhv-upload-createvm.py b/v2v/rhv-upload-createvm.py
index 50bb7e34..8887c52b 100644
--- a/v2v/rhv-upload-createvm.py
+++ b/v2v/rhv-upload-createvm.py
@@ -19,12 +19,54 @@
import json
import logging
import sys
+import time
+import uuid
from urllib.parse import urlparse
import ovirtsdk4 as sdk
import ovirtsdk4.types as types
+
+def debug(s):
+ if params['verbose']:
+ print(s, file=sys.stderr)
+ sys.stderr.flush()
+
+
+def jobs_completed(system_service, correlation_id):
+ jobs_service = system_service.jobs_service()
+
+ try:
+ jobs = jobs_service.list(
+ search="correlation_id=%s" % correlation_id)
+ except sdk.Error as e:
+ debug(
+ "Error searching for jobs with correlation id %s: %s" %
+ (correlation_id, e))
+ # We don't know, assume that jobs did not complete yet.
+ return False
+
+ # STARTED is the only "in progress" status, anything else means the job
+ # has already terminated.
+ if all(job.status != types.JobStatus.STARTED for job in jobs):
+ failed_jobs = [(job.description, str(job.status))
+ for job in jobs
+ if job.status != types.JobStatus.FINISHED]
+ if failed_jobs:
+ raise RuntimeError(
+ "Failed to create a VM! Failed jobs: %r" % failed_jobs)
+ return True
+ else:
+ running_jobs = [(job.description, str(job.status)) for job in jobs]
+ debug("Some jobs with correlation id %s are running: %s" %
+ (correlation_id, running_jobs))
+ return False
+
+
+# Seconds to wait for the VM import job to complete in oVirt.
+timeout = 3 * 60
+
# Parameters are passed in via a JSON doc from the OCaml code.
# Because this Python code ships embedded inside virt-v2v there
# is no formal API here.
@@ -67,6 +109,7 @@ system_service = connection.system_service()
cluster = system_service.clusters_service().cluster_service(params['rhv_cluster_uuid'])
cluster = cluster.get()
+correlation_id = str(uuid.uuid4())
vms_service = system_service.vms_service()
vm = vms_service.add(
types.Vm(
@@ -77,5 +120,17 @@ vm = vms_service.add(
data=ovf,
)
)
- )
+ ),
+ query={'correlation_id': correlation_id},
)
+
+# Wait for the import job to finish.
+endt = time.monotonic() + timeout
+while True:
+ time.sleep(10)
+ if jobs_completed(system_service, correlation_id):
+ break
+ if time.monotonic() > endt:
+ raise RuntimeError(
+ "Timed out waiting for VM creation!"
+ " Jobs still running for correlation id %s" % correlation_id)

View File

@ -0,0 +1,93 @@
From 7748be2af952898c9c38d02e9a539c71cbfbb56b Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 25 May 2021 10:13:00 +0100
Subject: [PATCH] tests: Add test of -i ova from a directory.
This was not tested previously.
(cherry picked from commit a00ce662cb33c33706a013ff98ff89244cd14667)
---
tests/Makefile.am | 2 ++
tests/test-v2v-i-ova-directory.sh | 53 +++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+)
create mode 100755 tests/test-v2v-i-ova-directory.sh
diff --git a/tests/Makefile.am b/tests/Makefile.am
index eee4e1af..e4b907fe 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -58,6 +58,7 @@ TESTS = \
test-v2v-copy-to-local.sh \
test-v2v-i-ova-bad-sha1.sh \
test-v2v-i-ova-bad-sha256.sh \
+ test-v2v-i-ova-directory.sh \
test-v2v-i-ova-formats.sh \
test-v2v-i-ova-good-checksums.sh \
test-v2v-i-ova-gz.sh \
@@ -185,6 +186,7 @@ EXTRA_DIST += \
test-v2v-i-ova-bad-sha1.sh \
test-v2v-i-ova-bad-sha256.sh \
test-v2v-i-ova-checksums.ovf \
+ test-v2v-i-ova-directory.sh \
test-v2v-i-ova-formats.expected \
test-v2v-i-ova-formats.ovf \
test-v2v-i-ova-formats.sh \
diff --git a/tests/test-v2v-i-ova-directory.sh b/tests/test-v2v-i-ova-directory.sh
new file mode 100755
index 00000000..7c593139
--- /dev/null
+++ b/tests/test-v2v-i-ova-directory.sh
@@ -0,0 +1,53 @@
+#!/bin/bash -
+# libguestfs virt-v2v test script
+# Copyright (C) 2014-2021 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# Test -i ova option with a directory.
+
+set -e
+
+$TEST_FUNCTIONS
+skip_if_skipped
+skip_if_backend uml
+skip_unless_phony_guest windows.img
+
+skip_unless_libvirt_minimum_version 3 1 0
+
+export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools"
+export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win"
+
+d=test-v2v-i-ova-directory.d
+rm -rf $d
+mkdir $d
+
+vmdk=test-ova.vmdk
+ovf=test-v2v-i-ova.ovf
+mf=test-ova.mf
+
+qemu-img convert $top_builddir/test-data/phony-guests/windows.img \
+ -O vmdk $d/$vmdk
+cp "$srcdir/$ovf" $d/$ovf
+sha1=`do_sha1 $d/$ovf`
+echo "SHA1($ovf)= $sha1" > $d/$mf
+sha256=`do_sha256 $d/$vmdk`
+echo "SHA256($vmdk)= $sha256" >> $d/$mf
+
+$VG virt-v2v --debug-gc \
+ -i ova $d \
+ -o null
+
+rm -rf $d

View File

@ -0,0 +1,63 @@
From 9e52e90cf8d570516d4098584c263c9d8b76c447 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 25 May 2021 10:27:53 +0100
Subject: [PATCH] v2v: -i ova: Fix parsing if OVA directory name has a trailing
"/"
If you use an OVA directory with a trailing "/" in the name, virt-v2v
would fail with:
virt-v2v: error: internal error: assertion failed at parse_ova.ml, line 273, char 15
The fix for this is to knock off the trailing "/" if present.
Reported-by: Xiaodai Wang
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1964324
(cherry picked from commit f8428f5eaaff6dedc54a40138f760298a7a3a965)
---
v2v/parse_ova.ml | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/v2v/parse_ova.ml b/v2v/parse_ova.ml
index 568ac5fa..fc413d2a 100644
--- a/v2v/parse_ova.ml
+++ b/v2v/parse_ova.ml
@@ -57,6 +57,13 @@ and ova_type =
*)
| TarOptimized of string (* tarball *)
+let string_of_t { orig_ova; top_dir; ova_type } =
+ sprintf "orig_ova = %s, top_dir = %s, ova_type = %s"
+ orig_ova top_dir
+ (match ova_type with
+ | Directory -> "Directory"
+ | TarOptimized tarball -> "TarOptimized " ^ tarball)
+
type file_ref =
| LocalFile of string
| TarFile of string * string
@@ -122,6 +129,13 @@ let rec parse_ova ova =
(* Exploded path must be absolute (RHBZ#1155121). *)
let top_dir = absolute_path top_dir in
+ (* top_dir must not end with / except if it == "/" (which is
+ * likely not what you want). (RHBZ#1964324)
+ *)
+ let top_dir =
+ if top_dir = "/" || not (String.is_suffix top_dir "/") then top_dir
+ else String.sub top_dir 0 (String.length top_dir - 1) in
+
(* If virt-v2v is running as root, and the backend is libvirt, then
* we have to chmod the directory to 0755 and files to 0644
* so it is readable by qemu.qemu. This is libvirt bug RHBZ#890291.
@@ -136,7 +150,9 @@ let rec parse_ova ova =
ignore (run_command cmd)
);
- { orig_ova = ova; top_dir; ova_type }
+ let ova = { orig_ova = ova; top_dir; ova_type } in
+ debug "ova: %s" (string_of_t ova);
+ ova
(* Return true if [libvirt] supports ["json:"] pseudo-URLs and accepts the
* ["raw"] driver. Function also returns true if [libvirt] backend is not

View File

@ -0,0 +1,95 @@
From 87e5404d20ec54d16d22a7bb8f06ea91076c91f7 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 25 May 2022 16:47:04 +0100
Subject: [PATCH] convert: If listing RPM applications fails, rebuild DB and
retry
In libguestfs before commit 488245ed6c ("daemon: rpm: Check return
values from librpm calls") we didn't bother to check the return values
from any librpm calls. In some cases where the RPM database is
faulty, this caused us to return a zero-length array of applications
(but no error indication). Libguestfs has subsequently been fixed so
now it returns an error if the RPM database is corrupt.
This commit changes virt-v2v behaviour so that if either
guestfs_inspect_list_applications2 returns a zero-length list (ie. old
libguestfs) or it throws an error (new libguestfs) then we attempt to
rebuild the RPM database and retry the operation. Rebuilding the
database can recover from some but not all RPM DB corruption.
See-also: https://bugzilla.redhat.com/show_bug.cgi?id=2089623#c12
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2089623
Reported-by: Xiaodai Wang
Reported-by: Ming Xie
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
(cherry picked from commit 31bf5db25bcfd8a9f5a48cc0523abae28861de9a)
---
v2v/inspect_source.ml | 34 ++++++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
diff --git a/v2v/inspect_source.ml b/v2v/inspect_source.ml
index b8a3c8ad..554fde1d 100644
--- a/v2v/inspect_source.ml
+++ b/v2v/inspect_source.ml
@@ -34,6 +34,7 @@ let rec inspect_source root_choice g =
reject_if_not_installed_image g root;
let typ = g#inspect_get_type root in
+ let package_format = g#inspect_get_package_format root in
(* Mount up the filesystems. *)
let mps = g#inspect_get_mountpoints root in
@@ -71,7 +72,7 @@ let rec inspect_source root_choice g =
) mps;
(* Get list of applications/packages installed. *)
- let apps = g#inspect_list_applications2 root in
+ let apps = list_applications g root package_format in
let apps = Array.to_list apps in
(* A map of app2_name -> application2, for easier lookups. Note
@@ -106,7 +107,7 @@ let rec inspect_source root_choice g =
i_arch = g#inspect_get_arch root;
i_major_version = g#inspect_get_major_version root;
i_minor_version = g#inspect_get_minor_version root;
- i_package_format = g#inspect_get_package_format root;
+ i_package_format = package_format;
i_package_management = g#inspect_get_package_management root;
i_product_name = g#inspect_get_product_name root;
i_product_variant = g#inspect_get_product_variant root;
@@ -186,6 +187,35 @@ and reject_if_not_installed_image g root =
if fmt <> "installed" then
error (f_"libguestfs thinks this is not an installed operating system (it might be, for example, an installer disk or live CD). If this is wrong, it is probably a bug in libguestfs. root=%s fmt=%s") root fmt
+(* Wrapper around g#inspect_list_applications2 which, for RPM
+ * guests, on failure tries to rebuild the RPM database before
+ * repeating the operation.
+ *)
+and list_applications g root = function
+ | "rpm" ->
+ (* RPM guest.
+ *
+ * In libguestfs before commit 488245ed6c ("daemon: rpm: Check
+ * return values from librpm calls"), a corrupt RPM database
+ * would return an empty array here with no exception. Hence
+ * the check below which turns empty array => exception. In
+ * libguestfs after that commit, inspect_list_applications2
+ * will raise an exception if it detects a corrupt RPM database.
+ *)
+ (try
+ let apps = g#inspect_list_applications2 root in
+ if apps = [||] then raise (G.Error "no applications returned");
+ apps
+ with G.Error msg ->
+ debug "%s" msg;
+ debug "rebuilding RPM database and retrying ...";
+ ignore (g#sh "rpmdb --rebuilddb");
+ g#inspect_list_applications2 root
+ )
+ | _ ->
+ (* Non-RPM guest, just do it. *)
+ g#inspect_list_applications2 root
+
(* See if this guest could use UEFI to boot. It should use GPT and
* it should have an EFI System Partition (ESP).
*

View File

@ -0,0 +1,50 @@
From 5852b85eaa174dfb87ce7a03b9f70e2bffac4ca4 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Wed, 29 Jun 2022 15:44:27 +0200
Subject: [PATCH] update common submodule for CVE-2022-2211 fix
$ git shortlog 9e990f3e4530..35467027f657
Laszlo Ersek (1):
options: fix buffer overflow in get_keys() [CVE-2022-2211]
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
(cherry picked from commit 795d5dfcef77fc54fec4d237bda28571454a6d4e)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common be09523d..1174b443:
diff --git a/common/options/keys.c b/common/options/keys.c
index 798315c2..d27a7123 100644
--- a/common/options/keys.c
+++ b/common/options/keys.c
@@ -128,17 +128,23 @@ read_first_line_from_file (const char *filename)
char **
get_keys (struct key_store *ks, const char *device, const char *uuid)
{
- size_t i, j, len;
+ size_t i, j, nmemb;
char **r;
char *s;
/* We know the returned list must have at least one element and not
* more than ks->nr_keys.
*/
- len = 1;
- if (ks)
- len = MIN (1, ks->nr_keys);
- r = calloc (len+1, sizeof (char *));
+ nmemb = 1;
+ if (ks && ks->nr_keys > nmemb)
+ nmemb = ks->nr_keys;
+
+ /* make room for the terminating NULL */
+ if (nmemb == (size_t)-1)
+ error (EXIT_FAILURE, 0, _("size_t overflow"));
+ nmemb++;
+
+ r = calloc (nmemb, sizeof (char *));
if (r == NULL)
error (EXIT_FAILURE, errno, "calloc");

View File

@ -0,0 +1,32 @@
From 217a74ad09bad781ee9efd5599f4323bdf9e3cff Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 3 Apr 2023 09:41:37 +0100
Subject: [PATCH] RHEL 8: If setfiles fails fall back to autorelabel
SFDC case 03473932, RHEL 8 only.
See discussion in private email thread "Customer case requiring our
assistance" in 2023.
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 1174b443..c4841a70:
diff --git a/common/mlcustomize/SELinux_relabel.ml b/common/mlcustomize/SELinux_relabel.ml
index 5ecf7bd7..f0630db1 100644
--- a/common/mlcustomize/SELinux_relabel.ml
+++ b/common/mlcustomize/SELinux_relabel.ml
@@ -35,11 +35,12 @@ let rec relabel (g : G.guestfs) =
use_setfiles g;
(* That worked, so we don't need to autorelabel. *)
g#rm_f "/.autorelabel"
- with Failure _ ->
+ with Failure _
(* This is the fallback in case something in the setfiles
* method didn't work. That includes the case where a non-SELinux
* host is processing an SELinux guest, and other things.
*)
+ | Guestfs.Error _ -> (* this is for SFDC case 03473932 in RHEL 8 only *)
g#touch "/.autorelabel"
)

18
SOURCES/SOURCES Normal file
View File

@ -0,0 +1,18 @@
Source Offer
A complete machine-readable copy of the source code corresponding to
portions of the accompanying package is available upon request. This
offer is valid to anyone in receipt of this information and shall
expire three years following the date of the final distribution of
this package by Red Hat, Inc.
To obtain such source code, send a check or money order in the amount
of US$10.00 to:
General Counsel
Red Hat, Inc.
100 East Davie Street
Raleigh, NC 27601 USA
Please specify the name, version and release of the package for which
you are requesting corresponding source code.

View File

@ -6,29 +6,24 @@ set -e
# directory. Use it like this:
# ./copy-patches.sh
project=virt-v2v
rhel_version=9.0.0
rhel_version=8.8.0
# Check we're in the right directory.
if [ ! -f $project.spec ]; then
echo "$0: run this from the directory containing '$project.spec'"
if [ ! -f virt-v2v.spec ]; then
echo "$0: run this from the directory containing 'virt-v2v.spec'"
exit 1
fi
case `id -un` in
rjones) git_checkout=$HOME/d/$project-rhel-$rhel_version ;;
lacos) git_checkout=$HOME/src/v2v/$project ;;
*) git_checkout=$HOME/d/$project-rhel-$rhel_version ;;
esac
git_checkout=$HOME/d/virt-v2v-rhel-$rhel_version
if [ ! -d $git_checkout ]; then
echo "$0: $git_checkout does not exist"
echo "This script is only for use by the maintainer when preparing a"
echo "$project release on RHEL."
echo "virt-v2v release on RHEL."
exit 1
fi
# Get the base version of the project.
version=`grep '^Version:' $project.spec | awk '{print $2}'`
# Get the base version of virt-v2v.
version=`grep '^Version:' virt-v2v.spec | awk '{print $2}'`
tag="v$version"
# Remove any existing patches.
@ -36,7 +31,28 @@ git rm -f [0-9]*.patch ||:
rm -f [0-9]*.patch
# Get the patches.
(cd $git_checkout; rm -f [0-9]*.patch; git -c core.abbrev=8 format-patch -O/dev/null --subject-prefix=PATCH -N --submodule=diff $tag)
(
cd $git_checkout
rm -f [0-9]*.patch
# Ignore some directories in common/ which are not in the virt-v2v tarball.
ignoredirs="edit mlvisit parallel progress structs visit windows"
rm -f common/.gitattributes
for i in $ignoredirs; do
echo "$i/* -diff" >> common/.gitattributes
done
git -c core.abbrev=8 format-patch -O/dev/null --subject-prefix=PATCH -N \
--submodule=diff --no-signature --patience $tag
# However the .gitattributes doesn't completely ignore them but produces
# Binary files a/... and b/... differ
# which prevents the patches from being applied so we must remove that too.
for i in $ignoredirs; do
sed -i "/^diff --git a\/common\/$i/,/^Binary files a\/common\/$i/{d;}" [0-9]*.patch
done
rm common/.gitattributes
)
mv $git_checkout/[0-9]*.patch .
# Remove any not to be applied.
@ -47,7 +63,7 @@ git add [0-9]*.patch
# Print out the patch lines.
echo
echo "--- Copy the following text into $project.spec file"
echo "--- Copy the following text into virt-v2v.spec file"
echo
echo "# Patches."

View File

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
iQJFBAABCAAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAl6YQ9QRHHJpY2hAYW5u
ZXhpYS5vcmcACgkQkXOPc+G3aKAgTBAAiT/ojN14i0NRzpuGSb7I9oupzclVqic8
c5NIXH8TGYLY9tVMYSsr+uyWu8Qk2lsqV6knXeqbBKot/682v2AlYn6ZpG+cl8tm
ZKjVSwMwLVdAvV5zTaggEO/Xs8WbtSkmTk184s62804qlc+mv0ngFTGZomKjH4o1
tHgJnegeR/lppeBnIuhAC/hWo6SyhPul8UnDg3rnByWOX7Qs3p4lY9y5hHv2pQfK
ezXLDYBBAtQ3oe3p8jh3SCe7GLxxX8oxDCn6l8K7AK4czRMLJ/iykS/iE+E1bazM
V7rUItPfK3MhrWThlekn4u5tOclCDKbK75Hgkb2qjeK9Ctad80boXnNEnIv0UWFr
SaqCKmJrOtohn2oR/aUmTXm2u09jy+nQTRhvqy/2TNTdExCa1A6n7r0EcEJQMQPX
DK34+cbn3J+/+BA9kyH2a2/pTwJBaCk4PCXyrxWAkHyLUt9HZwmtPXUeBhq/iMIf
QZSo/LgXTTNEpsFx5K3xuvy6Ps/IaImeI8xdU2wl252/HN4wY3roZOBNflbTCF2m
aXFXf6bReZmO9HJg5674zCYkB0N8nSPMaHmv7EWyK7sEMKCUuYnWMiEBHtIZA+dW
Qp3IdoODkjciwVzJL2E7RhA2GNvwnkay4WYqb0mjAPVktVTnhla7S1hSD8SM6Fs7
sVAPrKAFidk=
=l3OH
-----END PGP SIGNATURE-----

View File

@ -1,17 +0,0 @@
-----BEGIN PGP SIGNATURE-----
iQJFBAABCAAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAmIL8EkRHHJpY2hAYW5u
ZXhpYS5vcmcACgkQkXOPc+G3aKCSExAAiEWAd+WvG8cf33xrDzAERh3Hg/E89iTv
P0Ue9HEWFb4yLEKckW7WjagDxrdBdf7VBkBY2wgkkUVq0o4bWhQVWEKPfgWXdiJC
5sE4wO4trCQDCyZLB/iSiH85oQVf839Jbk04qHWUU7DXsE6apL1LMi2xRUlMPRTf
6hZVe9WIjlKonzuteQslqVHKVhTZmqkr1NTkYq0OhCHFzMpb1xi0JQni9vKXIaSN
4vvaDXBzBZW+00iux1PE/Age9QC3AkSESF95Uqx6nYSF98aBEG+3ErcUkMXxL8+i
c6RYwqFC2oINEPHg46dZtZyAiJNVY4H7hAM1DDe47tFWvmLEIEgyS5XkPfdfReoX
vVheS+cn6uRbSGeG1iF2ru8ehb+uscatwFc9eWsvoQ10Mt477R7VoG6gTYfIAwP8
hy5gCgyhlT9t1KKp/39UK4WIwSbIOl6vXH2Kpzam0wKb8xynHYU4cyvk4TGZk+ks
+a63+98ZYeL3hBHAIe2u1wDmgdbVSfvIcK7TEzFTPesAm2WqhkC08CPfinS9vCUI
VogUpze9+zHZaSBWHCPhfUBpUNF6tGvLRlH0B/ml/6E8csSQ+kT8CWl0ZGvJuNfB
es8QiAT5XXXTrNgAw782xZOP6aieNrnoNY0J7rFaAbL1OaIXC21lGWAPSZeCOOo/
PRaJqt5iaDA=
=okD+
-----END PGP SIGNATURE-----

View File

@ -2,20 +2,15 @@
%global verify_tarball_signature 1
# If there are patches which touch autotools files, set this to 1.
%if !0%{?rhel}
%global patches_touch_autotools %{nil}
%else
# On RHEL the downstream patches always touch autotools files.
%global patches_touch_autotools 1
%endif
# The source directory.
%global source_directory 1.45-development
%global source_directory 1.42-stable
Name: virt-v2v
Epoch: 1
Version: 1.45.99
Release: 2%{?dist}
Version: 1.42.0
Release: 22%{?dist}
Summary: Convert a virtual machine to run on KVM
License: GPLv2+
@ -28,80 +23,115 @@ Source1: http://download.libguestfs.org/virt-v2v/%{source_directory}/%{nam
Source2: libguestfs.keyring
%endif
# Maintainer script which helps with handling patches.
Source3: copy-patches.sh
%if !0%{?rhel}
# libguestfs hasn't been built on i686 for a while since there is no
# kernel built for this architecture any longer and libguestfs rather
# fundamentally depends on the kernel. Therefore we must exclude this
# arch. Note there is no bug filed for this because we do not ever
# expect that libguestfs or virt-v2v will be available on i686 so
# there is nothing that needs fixing.
ExcludeArch: %{ix86}
%else
# Architectures where virt-v2v is shipped on RHEL:
# Architectures where virt-v2v is shipped.
#
# not on aarch64 because it is not useful there
# not on %%{power64} because of RHBZ#1287826
# not on s390x because it is not useful there
ExclusiveArch: x86_64
%endif
# Downstream (RHEL-only) patches.
%if 0%{?rhel}
# RHEL 8 git repository is:
# https://github.com/libguestfs/virt-v2v/tree/rhel-8.6.0
# Use 'copy-patches.sh' to copy the patches from the git repo
# to the current directory.
# Patches.
Patch0001: 0001-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch
Patch0002: 0002-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch
Patch0003: 0003-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch
Patch0004: 0004-RHEL-Fixes-for-libguestfs-winsupport.patch
Patch0005: 0005-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch
Patch0006: 0006-RHEL-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-1430203.patch
Patch0007: 0007-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch
Patch0008: 0008-RHEL-Disable-o-glance.patch
Patch0009: 0009-RHEL-Remove-the-in-place-option.patch
Patch0010: 0010-lib-Remove-Utils.metaversion.patch
Patch0011: 0011-lib-v2v-Move-common-code-for-creating-v2v-directory-.patch
Patch0012: 0012-v2v-Move-creation-of-v2v-directory-until-after-optio.patch
Patch0013: 0013-lib-nbdkit.ml-Correct-copy-paste-error-in-comment.patch
Patch0014: 0014-lib-Improve-security-of-in-out-sockets-when-running-.patch
Patch0015: 0015-nbdkit-qemuNBD-run_unix-formally-require-externally-.patch
%endif
Patch0001: 0001-libvirt-make-use-of-libvirt-s-default-auth-handler-R.patch
Patch0002: 0002-i-libvirt-print-URI-without-connecting-RHBZ-1839917.patch
Patch0003: 0003-vCenter-fix-parsing-of-HTTP-status-string-RHBZ-18373.patch
Patch0004: 0004-v2v-o-libvirt-Remove-cache-none-RHBZ-1837453.patch
Patch0005: 0005-v2v-Remove-extraneous-when-setting-bandwidth-RHBZ-18.patch
Patch0006: 0006-v2v-it-vddk-Don-t-use-nbdkit-readahead-filter-with-V.patch
Patch0007: 0007-v2v-nbdkit-Handle-password-parameter-in-common_creat.patch
Patch0008: 0008-v2v-nbdkit-Don-t-use-password-parameter-RHBZ-1842440.patch
Patch0009: 0009-libosinfo-declare-autocleanup-funcs-with-libosinfo-1.patch
Patch0010: 0010-v2v-Use-common-documentation-for-keys-from-stdin.patch
Patch0011: 0011-docs-Multiple-keys-must-be-supplied-one-per-line-RHB.patch
Patch0012: 0012-v2v-Check-that-mac-ip-parameters-are-sensible-RHBZ-1.patch
Patch0013: 0013-libvirt-read-password-file-outside-libvirt-auth-call.patch
Patch0014: 0014-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch
Patch0015: 0015-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch
Patch0016: 0016-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch
Patch0017: 0017-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch
Patch0018: 0018-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch
Patch0019: 0019-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch
Patch0020: 0020-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch
Patch0021: 0021-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch
Patch0022: 0022-RHEL-8-use-platform-python.patch
Patch0023: 0023-RHEL-8-point-to-KB-for-supported-v2v-hypervisors-gue.patch
Patch0024: 0024-v2v-Allow-large-temporary-directory-to-be-set-on-a-g.patch
Patch0025: 0025-v2v-o-openstack-Allow-guests-to-be-converted-to-UEFI.patch
Patch0026: 0026-v2v-Fix-spelling-mistake-in-uninstall-function-name.patch
Patch0027: 0027-v2v-windows-Refactor-uninstallation_commands-functio.patch
Patch0028: 0028-v2v-Replace-broken-VMware-Tools-uninstall-command-ms.patch
Patch0029: 0029-Update-common-submodule-to-latest-upstream.patch
Patch0030: 0030-v2v-rhv-upload-plugin-Defer-imageio-connection.patch
Patch0031: 0031-v2v-windows-Fix-schtasks-SD-parameter.patch
Patch0032: 0032-v2v-Turn-pnp_wait.exe-warning-into-a-debug-message.patch
Patch0033: 0033-docs-UEFI-guest-conversion-to-o-openstack-is-support.patch
Patch0034: 0034-docs-o-openstack-Clarify-name-of-file-containing-Ope.patch
Patch0035: 0035-v2v-Allow-output-to-block-devices-RHBZ-1868690.patch
Patch0036: 0036-v2v-Disable-readahead-for-VMware-curl-sources-too-RH.patch
Patch0037: 0037-docs-Document-how-to-remove-Out-of-HTTP-sessions-lim.patch
Patch0038: 0038-v2v-Increase-required-free-space-in-Windows-to-100-M.patch
Patch0039: 0039-v2v-windows-Allow-qxldod.inf-as-synonym-for-qxl.inf.patch
Patch0040: 0040-RHEL-8-docs-Fix-version-of-virt-v2v-which-added-UEFI.patch
Patch0041: 0041-v2v-Increase-Linux-minimum-root-filesystem-to-100-MB.patch
Patch0042: 0042-v2v-rhv-upload-plugin-Fix-waiting-for-finalize.patch
Patch0043: 0043-v2v-windows-Do-not-fix-NTFS-heads-in-Windows-Vista-a.patch
Patch0044: 0044-v2v-vcenter-Implement-cookie-scripts.patch
Patch0045: 0045-convert-convert_windows.ml-Handle-date-formats-with-.patch
Patch0046: 0046-v2v-Force-format-of-input-to-be-specified.patch
Patch0047: 0047-v2v-Cope-with-libvirt-vpx-esx-driver-which-does-not-.patch
Patch0048: 0048-o-rhv-upload-wait-for-VM-creation-task.patch
Patch0049: 0049-tests-Add-test-of-i-ova-from-a-directory.patch
Patch0050: 0050-v2v-i-ova-Fix-parsing-if-OVA-directory-name-has-a-tr.patch
Patch0051: 0051-convert-If-listing-RPM-applications-fails-rebuild-DB.patch
Patch0052: 0052-update-common-submodule-for-CVE-2022-2211-fix.patch
Patch0053: 0053-RHEL-8-If-setfiles-fails-fall-back-to-autorelabel.patch
# Use git for patch management.
BuildRequires: git
%if 0%{patches_touch_autotools}
BuildRequires: autoconf, automake, libtool
%endif
BuildRequires: make
# RHSRVANY and RHEV-APT, used for Windows virt-v2v conversions.
# RHSRVANY is built from source under Fedora from
# mingw32-srvany-1.0-15.20150115gitfd659e77.fc23.noarch
# RHEV-APT is taken from the RHEV Tools CD
# See https://bugzilla.redhat.com/show_bug.cgi?id=1186850
Source94: rhsrvany-fd659e77cdd9da484fdc9dcbe0605c62ec26fa30.tar.gz
Source95: SOURCES
Source96: rhsrvany.exe
Source97: RHEV-Application-Provisioning-Tool.exe_4.43-5
Source99: copy-patches.sh
BuildRequires: /usr/bin/pod2man
BuildRequires: gcc
BuildRequires: ocaml >= 4.01
BuildRequires: libguestfs-devel >= 1:1.42
BuildRequires: augeas-devel
BuildRequires: bash-completion
BuildRequires: file-devel
BuildRequires: gettext-devel
BuildRequires: jansson-devel
BuildRequires: libnbd-devel >= 1.10.3
BuildRequires: libosinfo-devel
BuildRequires: libvirt-daemon-kvm
BuildRequires: libvirt-devel
BuildRequires: libvirt-daemon-kvm
BuildRequires: libxml2-devel
BuildRequires: pcre-devel
BuildRequires: perl(Sys::Guestfs)
BuildRequires: po4a
BuildRequires: /usr/bin/virsh
BuildRequires: xorriso
BuildRequires: ocaml-findlib-devel
BuildRequires: ocaml-libguestfs-devel
BuildRequires: ocaml-libnbd-devel
BuildRequires: ocaml-fileutils-devel
BuildRequires: ocaml-gettext-devel
%if !0%{?rhel}
BuildRequires: ocaml-ounit-devel
%endif
BuildRequires: nbdkit-python-plugin
@ -110,22 +140,15 @@ BuildRequires: gnupg2
%endif
Requires: libguestfs%{?_isa} >= 1:1.42
Requires: guestfs-tools >= 1.42
Requires: libguestfs-tools-c >= 1:1.42
# XFS is the default filesystem in Fedora and RHEL.
Requires: libguestfs-xfs
%if 0%{?rhel}
# For Windows conversions on RHEL.
# For Windows conversions.
Requires: libguestfs-winsupport >= 7.2
%endif
Requires: gawk
Requires: gzip
Requires: unzip
Requires: curl
Requires: openssh-clients >= 8.7p1
Requires: %{_bindir}/virsh
# Ensure the UEFI firmware is available, to properly convert
# EFI guests (RHBZ#1429643).
@ -136,36 +159,13 @@ Requires: edk2-ovmf
Requires: edk2-aarch64
%endif
Requires: platform-python
Requires: libnbd >= 1.8.2-2.el9
Requires: %{_bindir}/qemu-nbd
Requires: %{_bindir}/nbdcopy
Requires: %{_bindir}/nbdinfo
Requires: nbdkit-server >= 1.28.3-2.el9
# Needed for -it vddk, and -o rhv-upload.
Requires: nbdkit
Requires: nbdkit-curl-plugin
Requires: nbdkit-file-plugin
Requires: nbdkit-nbd-plugin
Requires: nbdkit-null-plugin
Requires: nbdkit-python-plugin
Requires: nbdkit-ssh-plugin
%ifarch x86_64
Requires: nbdkit-vddk-plugin
%endif
Requires: nbdkit-blocksize-filter
Requires: nbdkit-cacheextents-filter
Requires: nbdkit-cow-filter >= 1.26.5-1.el9
Requires: nbdkit-rate-filter
Requires: nbdkit-readahead-filter
Requires: nbdkit-retry-filter
# For rhsrvany.exe, used to install firstboot scripts in Windows guests.
Requires: mingw32-srvany >= 1.0-13
# On RHEL, virtio-win should be used to install virtio drivers
# and qemu-ga in converted guests. (RHBZ#1972644)
%if 0%{?rhel}
Recommends: virtio-win
%endif
Requires: platform-python
%description
@ -183,6 +183,9 @@ BuildArch: noarch
Requires: bash-completion >= 2.0
Requires: %{name} = %{epoch}:%{version}-%{release}
# The bash completion for virt-v2v were shipped with the others of libguestfs:
Obsoletes: libguestfs-bash-completion < 1:1.42.0
%description bash-completion
Install this package if you want intelligent bash tab-completion
@ -194,6 +197,9 @@ Summary: Japanese (ja) man pages for %{name}
BuildArch: noarch
Requires: %{name} = %{epoch}:%{version}-%{release}
# The man pages for virt-v2v were shipped with the others of libguestfs:
Obsoletes: libguestfs-man-pages-ja < 1:1.42.0
%description man-pages-ja
%{name}-man-pages-ja contains Japanese (ja) man pages
for %{name}.
@ -204,6 +210,9 @@ Summary: Ukrainian (uk) man pages for %{name}
BuildArch: noarch
Requires: %{name} = %{epoch}:%{version}-%{release}
# The man pages for virt-v2v were shipped with the others of libguestfs:
Obsoletes: libguestfs-man-pages-uk < 1:1.42.0
%description man-pages-uk
%{name}-man-pages-uk contains Ukrainian (uk) man pages
for %{name}.
@ -211,22 +220,28 @@ for %{name}.
%prep
%if 0%{verify_tarball_signature}
%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
tmphome="$(mktemp -d)"
gpgv2 --homedir "$tmphome" --keyring %{SOURCE2} %{SOURCE1} %{SOURCE0}
%endif
%autosetup -p1
%setup -q
# Use git to manage patches.
# http://rwmj.wordpress.com/2011/08/09/nice-rpm-git-patch-management-trick/
git init
git config user.email "libguestfs@redhat.com"
git config user.name "libguestfs"
git add .
git commit -a -q -m "%{version} baseline"
git am %{patches}
%if 0%{patches_touch_autotools}
autoreconf -i
autoreconf -fi
%endif
%build
%configure \
%if !0%{?rhel}
--with-extra="fedora=%{fedora},release=%{release}" \
%else
--with-extra="rhel=%{rhel},release=%{release}" \
%endif
--with-extra="rhel=%{rhel},release=%{release}"
make V=1 %{?_smp_mflags}
@ -234,15 +249,15 @@ make V=1 %{?_smp_mflags}
%install
%make_install
# Delete libtool crap.
find $RPM_BUILD_ROOT -name '*.la' -delete
# Virt-tools data directory. This contains a symlink to rhsrvany.exe
# which is satisfied by the dependency on mingw32-srvany.
# Virt-tools data directory.
mkdir -p $RPM_BUILD_ROOT%{_datadir}/virt-tools
pushd $RPM_BUILD_ROOT%{_datadir}/virt-tools
ln -sf /usr/i686-w64-mingw32/sys-root/mingw/bin/rhsrvany.exe
popd
cp %{SOURCE96} $RPM_BUILD_ROOT%{_datadir}/virt-tools/rhsrvany.exe
cp %{SOURCE97} $RPM_BUILD_ROOT%{_datadir}/virt-tools/rhev-apt.exe
# Delete the v2v test harness.
rm -r $RPM_BUILD_ROOT%{_libdir}/ocaml/v2v_test_harness
rm -r $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs/dllv2v_test_harness*
rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-test-harness.1*
# Find locale files.
%find_lang %{name}
@ -277,10 +292,11 @@ popd
%files -f %{name}.lang
%license COPYING
%doc README
%doc COPYING README
%{_bindir}/virt-v2v
%{_bindir}/virt-v2v-copy-to-local
%{_mandir}/man1/virt-v2v.1*
%{_mandir}/man1/virt-v2v-copy-to-local.1*
%{_mandir}/man1/virt-v2v-hacking.1*
%{_mandir}/man1/virt-v2v-input-vmware.1*
%{_mandir}/man1/virt-v2v-input-xen.1*
@ -293,178 +309,140 @@ popd
%files bash-completion
%license COPYING
%doc COPYING
%{_datadir}/bash-completion/completions/virt-v2v
%{_datadir}/bash-completion/completions/virt-v2v-copy-to-local
%files man-pages-ja
%license COPYING
%doc COPYING
%lang(ja) %{_mandir}/ja/man1/*.1*
%files man-pages-uk
%license COPYING
%doc COPYING
%lang(uk) %{_mandir}/uk/man1/*.1*
%changelog
* Wed Mar 23 2022 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.99-2
- Fix security issue when running virt-v2v as root
resolves: rhbz#2066775
* Mon Apr 03 2023 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-22
- RHEL 8: If setfiles fails fall back to autorelabel
resolves: rhbz#XXX
- Reapply patches since we are using git format-patch --submodule=diff
* Tue Feb 15 2022 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.99-1
- Rebase to upstream 1.45.99.
- Add check for sufficient free space in the host
resolves: rhbz#2051394
- Update documentation of -ip for conversions from VMware over HTTPS
related: rhbz#1960087
- -o rhv-upload: Keep connections alive
resolves: rhbz#2032324
- -o rhv-upload: Improve conversion performance
resolves: rhbz#2039255
- -o rhv-upload: Replace -oo rhv-direct with -oo rhv-proxy
resolves: rhbz#2033096
- Fix log line wrapping making log parsing difficult (1820221)
* Tue Jul 05 2022 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-21
- Fix assertion failure when parsing OVA dir with trailing slash
resolves: rhbz#2028823
- For -o rhv-upload wait for VM creation task
resolves: rhbz#1985827
- If listing RPM applications fails, rebuild DB and retry (2089623)
- Fix CVE-2022-2211 Denial of Service in --key parameter
resolves: rhbz#2102720
* Wed Feb 2 2022 Laszlo Ersek <lersek@redhat.com> - 1:1.45.97-4
- v2v import from vCenter fails when using interactive password because
cookie-script tries to be interactive
(pick commit 8abc07a8589a)
resolves: rhbz#1960087
- model='virtio-transitional' is wrongly added when converting windows
guest to local by rhel9 v2v
(pick commit range commit range 8abc07a8589a..cacedec64072)
resolves: rhbz#2043333
* Wed Nov 24 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-18
- Additional fix for backing file specified without backing format
related: rhbz#2025769
* Wed Jan 26 2022 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.97-3
- Rebase to upstream 1.45.97.
resolves: rhbz#2011713
- Add virtio-transitional for older guests when converting to q35
resolves: rhbz#1942325
- Fix -o rhv mode
resolves: rhbz#2027598
- input: xen: Fix assertion error when importing from remote block device
resolves: rhbz#2041852
- output: -o json: Allow -oo (output options) to work
resolves: rhbz#2041850
- Fix virt-v2v hang when given incorrect vpx:// URL
resolves: rhbz#2041886
- Fix hang when converting with virt-p2v
resolves: rhbz#2044911
- Send nbdinfo debugging information to stderr
resolves: rhbz#2044922
- Explicitly require platform-python
resolves: rhbz#2046178
* Tue Nov 23 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-17
- Correct regexps used to fix schtasks command
- Fix backing file specified without backing format
resolves: rhbz#2023279, rhbz#2025769
* 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
resolves: rhbz#2034240
* Fri Oct 29 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-16
- Implement cookie scripts for more reliable vCenter/HTTPS transfers
resolves: rhbz#2018173
* Sat Dec 18 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.95-2
- Rebase to upstream 1.45.95.
- Change video type to VGA (instead of QXL).
- Remove --in-place support properly.
- Remove -o glance support properly.
- Fix quoting with openssh >= 8.7 (RHEL) / 8.8
- Fix q35 error "IDE controllers are unsupported"
- Add virt-v2v and libvirt version in debug output
- Fix -o rhv output mode showing no guests listed
resolves: rhbz#2011713, rhbz#1961107, rhbz#2027673,
rhbz#1637857, rhbz#2032112, rhbz#2027598
* Wed Aug 18 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-15
- v2v: windows: Do not fix NTFS heads in Windows Vista and later
resolves: rhbz#1995000
* Wed Aug 18 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.3-3
- Fix conversion of Windows BitLocker guests
resolves: rhbz#1994984
* Fri Jul 16 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-14
- v2v: rhv-upload-plugin: Fix waiting for finalize
resolves: rhbz#1976024
* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 1:1.45.3-2
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Wed Jun 30 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-13
- docs: Fix version of virt-v2v which added UEFI for OpenStack
related: rhbz#1872100
- v2v: Increase Linux minimum root filesystem to 100 MB
resolves: rhbz#1764569
* Fri Aug 06 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.3-1
- New upstream development version 1.45.3.
- Rebase RHEL patches.
resolves: rhbz#1950634
* Tue May 11 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-12
- v2v: Fix conversion of BitLocker guests
resolves: rhbz#1959051
* Wed Jun 30 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.2-1
- New upstream development version 1.45.2.
- Remove --debug-overlays and --print-estimate options.
- Remove -o glance option on RHEL 9 (RHBZ#1977539).
- Remove support for RHEV-APT (RHBZ#1945549).
* Tue Apr 27 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-11
- v2v: windows: Allow qxldod.inf as synonym for qxl.inf
resolves: rhbz#1926102
- v2v: Increase required free space in Windows to 100 MB
resolves: rhbz#1949147
- docs: Document how to remove "Out of HTTP sessions" limit
- v2v: Disable readahead for VMware curl sources too
resolves: rhbz#1848862
- v2v: Allow output to block devices
resolves: rhbz#1868690
- docs: -o openstack: Clarify name of file containing OpenStack auth
resolves: rhbz#1871754
- docs: UEFI guest conversion to -o openstack is supported
resolves: rhbz#1872100
- v2v: Turn pnp_wait.exe warning into a debug message
resolves: rhbz#1903960
- v2v: windows: Fix schtasks /SD parameter
resolves: rhbz#1895323
* Wed Jun 16 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.45.1-1.el9.1
- New upstream development version 1.45.1.
- Require virtio-win on RHEL (RHBZ#1972644).
- v2v-test-harness, virt-v2v-copy-to-local have been removed upstream.
* Thu Jan 21 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-9
- v2v: rhv-upload-plugin: Defer imageio connection
resolves: rhbz#1911568
* Thu Jun 10 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.44.0-2
- nbdkit-vddk-plugin dep only exists on x86-64.
* Tue Jan 19 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-8
- Replace broken VMware Tools uninstall command msiexec /i with /x.
resolves: rhbz#1917760
* Mon May 10 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.44.0-1.el9.1
- Rebuild in RHEL 9 against libguestfs 1.45.5
resolves: rhbz#1959042
* Tue Jan 12 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.42.0-7
- Tell virt-v2v where overlay files must be placed
- Allow conversion to UEFI openstack
resolves: rhbz#1820282 rhbz#1872094
* Fri Apr 30 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.44.0-1
- New upstream stable branch version 1.44.0.
* Tue Sep 01 2020 Pino Toscano <ptoscano@redhat.com> - 1:1.42.0-6
- Improve the documentation of --keys-from-stdin
resolves: rhbz#1858765
- Check that --mac :ip: parameters are sensible
resolves: rhbz#1858775
- -i libvirt: read password file outside libvirt auth callback
resolves: rhbz#1869454
* Wed Apr 14 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.5-1
- New upstream version 1.43.5.
* Wed Jun 24 2020 Pino Toscano <ptoscano@redhat.com> - 1:1.42.0-5
- Ship a newer version of rhev-apt.exe
resolves: rhbz#1850000
- Ship the rhsrvany sources with a note for them, as requested by
Red Hat Legal.
- -i libvirt: ask for the password ourselves instead of letting nbdkit
ask for it (and potentially time out)
related: rhbz#1838425
- Fix build with libosinfo >= 1.8.0
resolves: rhbz#1850423
* Thu Apr 01 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.4-5
- Add upstream patch to depend on xorriso.
- Change libguestfs-tools-c -> guestfs-tools.
* Thu May 28 2020 Pino Toscano <ptoscano@redhat.com> - 1:1.42.0-4
- -i libvirt: ask again for the password when -ip is not specified
resolves: rhbz#1838425
- -i libvirt: print URI without connecting
resolves: rhbz#1839917
- Handle HTTP/2 replies from vCenter
resolves: rhbz#1840126
- -o libvirt: remove cache=none from disks
resolves: rhbz#1837453
- Fix parameters for the nbdkit rate filter
resolves: rhbz#1841096
- -it vddk: do not use the nbdkit readahead filter with VDDK
resolves: rhbz#1832805
* Tue Mar 30 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.4-3
- Add downstream (RHEL-only) patches (RHBZ#1931724).
* Wed May 06 2020 Pino Toscano <ptoscano@redhat.com> - 1:1.42.0-3
- Actually fix epoch dependencies.
- Fix virt-v2v-man-pages-uk migration from libguestfs-man-pages-uk.
* Mon Mar 8 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.4-2
- Bump and rebuild for ocaml-gettext update.
* Wed Mar 3 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.4-1
- New upstream version 1.43.4.
* Tue Mar 2 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.3-4
- OCaml 4.12.0 build
* Tue Mar 2 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.3-3
- Add fix for OCaml 4.12.
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:1.43.3-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Tue Jan 05 2021 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.3-1
- New upstream version 1.43.3.
* Thu Dec 03 2020 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.2-3
- Drop obsolete virt-v2v-copy-to-local tool for Fedora 34 and RHEL 9.
* Wed Dec 02 2020 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.2-2
- Unify Fedora and RHEL spec files.
* Tue Dec 01 2020 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.2-1
- New upstream version 1.43.2.
* Tue Sep 01 2020 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.1-5
- OCaml 4.11.1 rebuild
* Fri Aug 21 2020 Richard W.M. Jones <rjones@redhat.com> - 1:1.43.1-4
- OCaml 4.11.0 rebuild
* Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:1.43.1-3
- Second attempt - Rebuilt for
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:1.43.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Mon Jul 06 2020 Richard W.M. Jones <rjones@redhat.com> - 1.43.1-1
- New development branch 1.43.
* Wed May 06 2020 Richard W.M. Jones <rjones@redhat.com> - 1.42.0-4
- Re-add Epoch. Forgotten when we split this package from libguestfs.
* Tue May 05 2020 Richard W.M. Jones <rjones@redhat.com> - 1.42.0-2
- OCaml 4.11.0+dev2-2020-04-22 rebuild
* Wed May 06 2020 Pino Toscano <ptoscano@redhat.com> - 1:1.42.0-2
- Bump the libguestfs requirement to 1.42.0.
- Bump the epoch to 1 to match the version virt-v2v had when built from
the libguestfs source.
* Thu Apr 16 2020 Richard W.M. Jones <rjones@redhat.com> - 1.42.0-1
- New upstream stable version 1.42.0.