Rebase to virt-v2v 2.11.5

Synchronize spec file with Fedora
resolves: RHEL-153361

Fixes incorrect driver location for Windows 2008 SP2
resolves: RHEL-159888

Create sentinel file after all firstboot scripts have finished running
resolves: RHEL-152939

Obey cgroups when computing SMP
resolves: RHEL-152766

Fix encrypted Ubuntu guest fail to boot after conversion
resolves: RHEL-137121
This commit is contained in:
Richard W.M. Jones 2026-04-13 15:48:21 +01:00
parent 8380dd5902
commit 6097cf95c4
34 changed files with 89 additions and 5787 deletions

View File

@ -0,0 +1,37 @@
From ad61f699fe3e730d47069007a2e6e3a838cf3f31 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 26 Jan 2026 16:26:27 +0000
Subject: [PATCH] RHEL: Update v2v: Enhance inspection with filesystems
information
For RHEL 10:
This is an update for commit 6bd4ab3a5da9bf3bb3b22585d2226d6e338f23ba.
Adjust minimum version of libguestfs since we will backport the new
API to libguestfs 1.58.1-2.el10.
Original commit message:
Add the list of filesystems found by inspection to the internal
inspection struct. This is not actually used by virt-v2v itself (it
is used by virt-v2v-inspector), so this change should have no effect.
---
m4/guestfs-libraries.m4 | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4
index a7a279e8..11c9974c 100644
--- a/m4/guestfs-libraries.m4
+++ b/m4/guestfs-libraries.m4
@@ -19,8 +19,8 @@ dnl Any C libraries required by virt-v2v.
dnl Of course we need libguestfs.
dnl
-dnl We need libguestfs 1.59.2 for guestfs_xfs_info2.
-PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.59.2])
+dnl We need libguestfs >= 1.58.1-2.el10 for guestfs_xfs_info2.
+PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.58.1])
printf "libguestfs version is "; $PKG_CONFIG --modversion libguestfs
dnl And libnbd.

View File

@ -1,46 +0,0 @@
From 859c43b1eb81cfdcb5f481b571e2c387860f8a27 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 13 Jan 2026 12:33:11 +0000
Subject: [PATCH] docs/virt-v2v.pod: Document Windows vTPM and BitLocker
Recovery
Reported-by: Ming Xie
Fixes: https://issues.redhat.com/browse/RHEL-103915
---
docs/virt-v2v.pod | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index a3cacb82..f751f4e7 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -1600,6 +1600,29 @@ L<https://issues.redhat.com/browse/RHEL-70840>
and
L<https://windowstechpro.com/how-to-enable-bitlocker-on-windows-11/>
+=head2 Windows: "Enter the recovery key for this drive"
+
+After conversion, you may be presented with a Windows boot screen showing:
+
+ BitLocker recovery
+ Enter the recovery key for this drive
+ [|___________________]
+
+(See screenshot on L<https://issues.redhat.com/browse/RHEL-103915>)
+
+This happens when the Windows BitLocker disk encryption key is
+contained in the VMware Virtual Trusted Platform Module (vTPM). The
+vTPM is working I<exactly as designed>. It is preventing the
+encrypted disk from being moved from one machine to another by storing
+the encryption key in trusted storage on the source. By design, we
+cannot access or move this key to the target.
+
+To start the VM you will need to enter the BitLocker recovery key.
+This will also register the disk against the new vTPM on the target,
+so it should only be necessary to do this once.
+
+For help finding the recovery key: L<https://aka.ms/recoverykeyfaq>
+
=head2 Networks and bridges
Guests are usually connected to one or more networks, and when

View File

@ -1,4 +1,4 @@
From 5bb9b83c288b0c4bdac081e123f2fa54c840a6ca Mon Sep 17 00:00:00 2001
From efba4ab8bad8980598834d43e13e3af44afc5dce 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.
@ -19,10 +19,10 @@ https://bugzilla.redhat.com/show_bug.cgi?id=2187961#c1
7 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/convert/convert.ml b/convert/convert.ml
index e3fd41b8..eb51e9b9 100644
index f077e1f6..2150abb7 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -55,6 +55,7 @@ let rec convert input_disks options source =
@@ -56,6 +56,7 @@ let rec convert input_disks options source =
message (f_"Opening the source");
let g = open_guestfs ~identifier:"v2v" () in

View File

@ -1,24 +0,0 @@
From b6d5f9dc47fa57836215a698a1ed9df20f90dabc Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 13 Jan 2026 14:11:49 +0000
Subject: [PATCH] input/ssh.ml: Add debugging around remote_file_exists
function
It's hard to tell when this function was called and if it returned
success or failure, so add some debugging.
---
input/ssh.ml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/input/ssh.ml b/input/ssh.ml
index 9b93df7b..51276156 100644
--- a/input/ssh.ml
+++ b/input/ssh.ml
@@ -60,4 +60,6 @@ let remote_file_exists ~server ?port ?user ?password path =
* prove the remote file exists.
*)
let cmd = [ Config.nbdinfo; "--can"; "connect"; uri ] in
- run_command cmd = 0
+ let r = run_command cmd = 0 in
+ debug "ssh: remote_file_exists: testing %s -> %b" path r;
+ r

View File

@ -1,4 +1,4 @@
From 38516e4b16f2148db9d16c352e4bec6c9235e52a Mon Sep 17 00:00:00 2001
From 84f190814e0277647adc42946bfeb0ed3881c16e 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

View File

@ -1,47 +0,0 @@
From 986edd3e609cc33e0004e41447b74b93572bd61e Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 13 Jan 2026 14:20:18 +0000
Subject: [PATCH] input/ssh.ml: Fix Ssh.remote_file_exists
This function was inadvertently broken in commit 970d7123c2
("input/ssh: Use nbdinfo --can connect (instead of --size)"), since
'nbdinfo --can connect' just says that nbdinfo managed to connect at
all, even if the connection failed to fully negotiate the NBD
handshake. (This is possibly a bug in nbdinfo.)
Using --size means we must have negotiated the NBD handshake.
However this leaves the problem that commit 970d7123c2 was originally
intended to fix, that 'nbdinfo --size' prints the size on stdout. To
fix this, replace use of run_command with shell_command so we can
redirect stdout.
Reported-by: Ming Xie
Thanks: Ming Xie
Updates: commit fb72e059863a60503b6011b8590c25c3a010a58f
Reverts: commit 970d7123c2025bc148870f4bc6fa75fa9e95905f
---
input/ssh.ml | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/input/ssh.ml b/input/ssh.ml
index 51276156..2393965c 100644
--- a/input/ssh.ml
+++ b/input/ssh.ml
@@ -56,10 +56,13 @@ let download_file ~server ?port ?user ?password path output =
let remote_file_exists ~server ?port ?user ?password path =
let uri = start_nbdkit ~server ?port ?user ?password path in
- (* Testing that we can connect to the nbdkit server is enough to
+ (* Testing that the nbdkit server can get the size is enough to
* prove the remote file exists.
*)
- let cmd = [ Config.nbdinfo; "--can"; "connect"; uri ] in
- let r = run_command cmd = 0 in
+ let cmd = sprintf "%s --size %s >/dev/null %s"
+ Config.nbdinfo (quote uri)
+ (* If verbose then allow stderr to go to the log, else hide it *)
+ (if verbose () then "" else "2>&1") in
+ let r = shell_command cmd = 0 in
debug "ssh: remote_file_exists: testing %s -> %b" path r;
r

View File

@ -1,4 +1,4 @@
From b00922090f704e97388dbc96f6f710fd5e22af92 Mon Sep 17 00:00:00 2001
From cc667070c19d8ff55ebdeaa50263911d220d9c11 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
@ -43,10 +43,10 @@ index 49f00754..bdf12c5d 100644
=item B<-o null>
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 04764832..eb550da0 100644
index 432611e5..fa0c674a 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -169,11 +169,6 @@ Since F<guest-domain.xml> contains the path(s) to the guest disk
@@ -170,11 +170,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.
@ -58,7 +58,7 @@ index 04764832..eb550da0 100644
=head1 OPTIONS
=over 4
@@ -578,9 +573,6 @@ This is similar to I<-o local>, except that a shell script is written
@@ -587,9 +582,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>.
@ -66,9 +66,9 @@ index 04764832..eb550da0 100644
-option which boots the guest under qemu immediately.
-
ifelse(ENABLE_OVIRT, yes, `
=item B<-o> B<vdsm>
@@ -653,11 +645,6 @@ For I<-o openstack> (L<virt-v2v-output-openstack(1)>) only, set a guest ID
=item B<-o> B<vdsm>
@@ -663,11 +655,6 @@ For I<-o openstack> (L<virt-v2v-output-openstack(1)>) only, set a guest ID
which is saved on each Cinder volume in the C<virt_v2v_guest_id>
volume property.

View File

@ -1,120 +0,0 @@
From aec2e0a6e6861a2b895d27001e009650f6227dfe Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 26 Jan 2026 16:20:50 +0000
Subject: [PATCH] Update common submodule
This pulls in the following commits:
Richard W.M. Jones (4):
mlcustomize/firstboot.ml: Print %USERNAME% and %USERDOMAIN%
mlcustomize/firstboot.ml: Fix %-encoding in previous commit
mlpcre: Add optional PCRE_ANCHORED flag when compiling expressions
mlstdutils: Export List.assoc_opt
(cherry picked from commit e3e5cbcf45a0c9a523b8389b2fd8835d5ab684ee)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common b54ba203..1005f4a6:
diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml
index 360c33d6..f29884c8 100644
--- a/common/mlcustomize/firstboot.ml
+++ b/common/mlcustomize/firstboot.ml
@@ -295,6 +295,7 @@ exit /b
:main
echo starting firstboot service
+echo effective user: %%USERNAME%% domain: %%USERDOMAIN%%
if not exist "%%scripts_done%%" (
mkdir "%%scripts_done%%"
diff --git a/common/mlpcre/PCRE.ml b/common/mlpcre/PCRE.ml
index 077290ef..33074af1 100644
--- a/common/mlpcre/PCRE.ml
+++ b/common/mlpcre/PCRE.ml
@@ -22,7 +22,7 @@ exception Error of string * int
type regexp
-external compile : ?caseless:bool -> ?dotall:bool -> ?extended:bool -> ?multiline:bool -> string -> regexp = "guestfs_int_pcre_compile"
+external compile : ?anchored:bool -> ?caseless:bool -> ?dotall:bool -> ?extended:bool -> ?multiline:bool -> string -> regexp = "guestfs_int_pcre_compile_byte" "guestfs_int_pcre_compile"
external matches : ?offset:int -> regexp -> string -> bool = "guestfs_int_pcre_matches"
external sub : int -> string = "guestfs_int_pcre_sub"
external subi : int -> int * int = "guestfs_int_pcre_subi"
diff --git a/common/mlpcre/PCRE.mli b/common/mlpcre/PCRE.mli
index b69a56ba..0fdc2bd5 100644
--- a/common/mlpcre/PCRE.mli
+++ b/common/mlpcre/PCRE.mli
@@ -52,11 +52,12 @@ exception Error of string * int
type regexp
(** The type of a compiled regular expression. *)
-val compile : ?caseless:bool -> ?dotall:bool -> ?extended:bool -> ?multiline:bool -> string -> regexp
+val compile : ?anchored:bool -> ?caseless:bool -> ?dotall:bool ->
+ ?extended:bool -> ?multiline:bool -> string -> regexp
(** Compile a regular expression. This can raise {!Error}.
- The flags [?caseless], [?dotall], [?extended], [?multiline]
- correspond to the [pcre_compile] flags [PCRE_CASELESS] etc.
+ The flags [?anchored], [?caseless], [?dotall], [?extended], [?multiline]
+ correspond to the [pcre_compile] flags [PCRE_ANCHORED] etc.
See pcre2api(3) for details of what they do.
All flags default to false. *)
diff --git a/common/mlpcre/pcre-c.c b/common/mlpcre/pcre-c.c
index 3959fd56..11be1577 100644
--- a/common/mlpcre/pcre-c.c
+++ b/common/mlpcre/pcre-c.c
@@ -154,11 +154,12 @@ Optint_val (value intv, int defval)
}
value
-guestfs_int_pcre_compile (value caselessv, value dotallv,
- value extendedv, value multilinev,
+guestfs_int_pcre_compile (value anchoredv, value caselessv,
+ value dotallv, value extendedv,
+ value multilinev,
value pattv)
{
- CAMLparam4 (caselessv, dotallv, extendedv, multilinev);
+ CAMLparam5 (anchoredv, caselessv, dotallv, extendedv, multilinev);
CAMLxparam1 (pattv);
const char *patt;
int options = 0;
@@ -167,6 +168,8 @@ guestfs_int_pcre_compile (value caselessv, value dotallv,
PCRE2_SIZE errnum;
/* Flag parameters are all bool option, defaulting to false. */
+ if (is_Some_true (anchoredv))
+ options |= PCRE2_ANCHORED;
if (is_Some_true (caselessv))
options |= PCRE2_CASELESS;
if (is_Some_true (dotallv))
@@ -186,6 +189,14 @@ guestfs_int_pcre_compile (value caselessv, value dotallv,
CAMLreturn (Val_regexp (re));
}
+value
+guestfs_int_pcre_compile_byte (value *argv, int argn)
+{
+ assert (argn == 6);
+ return guestfs_int_pcre_compile (argv[0], argv[1], argv[2],
+ argv[3], argv[4], argv[5]);
+}
+
value
guestfs_int_pcre_matches (value offsetv, value rev, value strv)
{
diff --git a/common/mlstdutils/std_utils.mli b/common/mlstdutils/std_utils.mli
index 6c1911da..77cf107e 100644
--- a/common/mlstdutils/std_utils.mli
+++ b/common/mlstdutils/std_utils.mli
@@ -51,6 +51,7 @@ module List : sig
val find_all : ('a -> bool) -> 'a list -> 'a list
val partition : ('a -> bool) -> 'a list -> 'a list * 'a list
val assoc : 'a -> ('a * 'b) list -> 'b
+ val assoc_opt : 'a -> ('a * 'b) list -> 'b option
val assq : 'a -> ('a * 'b) list -> 'b
val mem_assoc : 'a -> ('a * 'b) list -> bool
val mem_assq : 'a -> ('a * 'b) list -> bool

View File

@ -1,4 +1,4 @@
From f19e71394757c9f44ed3367addbe694140f34fea Mon Sep 17 00:00:00 2001
From 6b45fe15284f0660554c1d1f38b69453e08e2c4d 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
@ -9,7 +9,7 @@ Subject: [PATCH] RHEL: Fix list of supported sound cards to match RHEL qemu
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/lib/utils.ml b/lib/utils.ml
index 15af5b1a..f5afa58f 100644
index 7eb4ec38..8a06bbd4 100644
--- a/lib/utils.ml
+++ b/lib/utils.ml
@@ -83,13 +83,14 @@ let kvm_arch = function

View File

@ -1,177 +0,0 @@
From 3e60eef83ed072b605a3c34f3bf3acbc89a876bb Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 26 Jan 2026 16:26:27 +0000
Subject: [PATCH] v2v: Enhance inspection with filesystems information
Add the list of filesystems found by inspection to the internal
inspection struct. This is not actually used by virt-v2v itself (it
is used by virt-v2v-inspector), so this change should have no effect.
(cherry picked from commit 6bd4ab3a5da9bf3bb3b22585d2226d6e338f23ba)
For RHEL 10: Adjust minimum version of libguestfs since we will
backport the new API to libguestfs 1.58.1-2.el10.
---
convert/mount_filesystems.ml | 49 ++++++++++++++++++++++++++++++++++++
lib/types.ml | 9 +++++++
lib/types.mli | 9 +++++++
m4/guestfs-libraries.m4 | 5 ++--
v2v/v2v_unit_tests.ml | 1 +
5 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/convert/mount_filesystems.ml b/convert/mount_filesystems.ml
index e7974359..aa117e51 100644
--- a/convert/mount_filesystems.ml
+++ b/convert/mount_filesystems.ml
@@ -30,6 +30,42 @@ let rec mount_filesystems g root =
reject_if_not_installed_image g root;
reject_if_unknown_fields g root;
+ (* Get the list of filesystems. This is not actually used by
+ * virt-v2v (only used by virt-v2v-inspector) so try hard not
+ * to fail here.
+ *)
+ let fses = g#inspect_get_filesystems root in
+ let fses = Array.to_list fses in
+ let fses = List.sort compare fses in
+ let fses =
+ List.map (
+ fun dev ->
+ let dev = g#canonical_device_name dev
+ and fs_type = ref None
+ and fs_version = ref None
+ and fs_label = ref None
+ and fs_uuid = ref None in
+
+ (try
+ let v = g#vfs_type dev in
+ if v <> "" then (
+ fs_type := Some v;
+ fs_version := get_filesystem_version g dev v;
+ )
+ with G.Error msg -> debug "vfs_type: %s: %s (ignored)" dev msg);
+ (try
+ let v = g#vfs_label dev in
+ if v <> "" then fs_label := Some v
+ with G.Error msg -> debug "vfs_label: %s: %s (ignored)" dev msg);
+ (try
+ let v = g#vfs_uuid dev in
+ if v <> "" then fs_uuid := Some v
+ with G.Error msg -> debug "vfs_uuid: %s: %s (ignored)" dev msg);
+
+ { fs_dev = dev; fs_type = !fs_type; fs_version = !fs_version;
+ fs_label = !fs_label; fs_uuid = !fs_uuid }
+ ) fses in
+
(* Mount up the filesystems. *)
let mps = g#inspect_get_mountpoints root in
let cmp (a,_) (b,_) = compare (String.length a) (String.length b) in
@@ -121,6 +157,7 @@ let rec mount_filesystems g root =
i_product_name = g#inspect_get_product_name root;
i_product_variant = g#inspect_get_product_variant root;
i_mountpoints = mps;
+ i_filesystems = fses;
i_apps = apps;
i_apps_map = apps_map;
i_windows_systemroot = systemroot;
@@ -164,6 +201,18 @@ and error_if_unknown fieldname value =
Inspection field %s was unknown.")
fieldname
+(* See equivalent function in guestfs-tools.git:inspector/inspector.c *)
+and get_filesystem_version g dev = function
+ | "xfs" ->
+ let hash = g#xfs_info2 dev in
+ (match List.assoc_opt "meta-data.crc" hash with
+ | None -> None
+ | Some "0" -> (* XFS version *) Some "4"
+ | Some "1" -> (* XFS version *) Some "5"
+ | Some _ -> None
+ )
+ | _ -> None
+
(* Wrapper around g#inspect_list_applications2 which, for RPM
* guests, on failure tries to rebuild the RPM database before
* repeating the operation.
diff --git a/lib/types.ml b/lib/types.ml
index 9ba580e4..d727af89 100644
--- a/lib/types.ml
+++ b/lib/types.ml
@@ -300,6 +300,7 @@ type inspect = {
i_product_name : string;
i_product_variant : string;
i_mountpoints : (string * string) list;
+ i_filesystems : filesystem list;
i_apps : Guestfs.application2 list;
i_apps_map : Guestfs.application2 list StringMap.t;
i_windows_systemroot : string;
@@ -310,6 +311,14 @@ type inspect = {
i_drive_mappings : (string * string) list;
}
+and filesystem = {
+ fs_dev : string;
+ fs_type : string option;
+ fs_version : string option;
+ fs_label : string option;
+ fs_uuid : string option;
+}
+
let string_of_inspect inspect =
sprintf "\
i_root = %s
diff --git a/lib/types.mli b/lib/types.mli
index 4c705a73..64b6336f 100644
--- a/lib/types.mli
+++ b/lib/types.mli
@@ -207,6 +207,7 @@ type inspect = {
i_product_name : string;
i_product_variant : string;
i_mountpoints : (string * string) list;
+ i_filesystems : filesystem list;
i_apps : Guestfs.application2 list; (** List of packages installed. *)
i_apps_map : Guestfs.application2 list StringMap.t;
(** This is a map from the app name to the application object.
@@ -220,6 +221,14 @@ type inspect = {
i_drive_mappings : (string * string) list;
}
+and filesystem = {
+ fs_dev : string;
+ fs_type : string option;
+ fs_version : string option;
+ fs_label : string option;
+ fs_uuid : string option;
+}
+
val string_of_inspect : inspect -> string
(** {2 Disk stats} *)
diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4
index db11cff6..c4237438 100644
--- a/m4/guestfs-libraries.m4
+++ b/m4/guestfs-libraries.m4
@@ -19,9 +19,8 @@ dnl Any C libraries required by virt-v2v.
dnl Of course we need libguestfs.
dnl
-dnl We need libguestfs 1.57.3 for guestfs_ntfs_chmod.
-dnl We need libguestfs 1.57.6 for guestfs_inspect_get_windows_group_policy.
-PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.57.6])
+dnl We need libguestfs >= 1.58.1-2.el10 for guestfs_xfs_info2.
+PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.58.1])
printf "libguestfs version is "; $PKG_CONFIG --modversion libguestfs
dnl And libnbd.
diff --git a/v2v/v2v_unit_tests.ml b/v2v/v2v_unit_tests.ml
index 892bf190..efbadc80 100644
--- a/v2v/v2v_unit_tests.ml
+++ b/v2v/v2v_unit_tests.ml
@@ -38,6 +38,7 @@ let inspect_defaults = {
i_major_version = 0; i_minor_version = 0;
i_root = ""; i_package_format = ""; i_package_management = "";
i_product_name = ""; i_product_variant = ""; i_mountpoints = [];
+ i_filesystems = [];
i_apps = []; i_apps_map = StringMap.empty;
i_windows_systemroot = "";
i_windows_software_hive = ""; i_windows_system_hive = "";

View File

@ -1,4 +1,4 @@
From 2e69a53b203968d77eb0a0447bdb347bd34481c6 Mon Sep 17 00:00:00 2001
From 3f52a3f1d7874759f27f914e8ce2dae10ce44dff 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)

View File

@ -1,131 +0,0 @@
From 3eef674a08ca904baff2e4d6a0f871e303d08e6e Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 26 Jan 2026 16:27:42 +0000
Subject: [PATCH] inspector: Enhance virt-v2v-inspector output with filesystems
information
RHEL 7.0, 7.1 and (possibly*) 7.2 used XFS version 4. New versions of
RHEL use XFS v5.
Support even for opening version 4 filesystems was removed in RHEL 10
(and will be removed altogether from the Linux kernel in 2030). This
prevents virt-v2v conversions.
Therefore it's a good idea to be able to tell the XFS filesystem
version and print that in virt-inspector output, so that management
tools can warn about it.
Since we didn't have the virt-inspector <filesystems/> section at all
before, we have to add that whole section, sticking as close as
possible to the virt-inspector output.
Example output for a RHEL 7.0 guest:
<?xml version='1.0' encoding='utf-8'?>
<v2v-inspection>
<!-- generated by virt-v2v-inspector 2.10.0local,libvirt -->
<program>virt-v2v-inspector</program>
...
<operatingsystem>
<name>linux</name>
...
<mountpoints>
<mountpoint dev='/dev/sda3'>/</mountpoint>
<mountpoint dev='/dev/sda1'>/boot</mountpoint>
</mountpoints>
<filesystems>
<filesystem dev='/dev/sda1'>
<type>ext4</type>
<uuid>15e8838c-136e-4a1f-ac01-97b4fa6b0fe4</uuid>
</filesystem>
<filesystem dev='/dev/sda2'>
<type>swap</type>
<uuid>8e966377-86f1-45a1-bdff-28724530818d</uuid>
</filesystem>
<filesystem dev='/dev/sda3'>
<type version='4'>xfs</type>
<uuid>67ae8aeb-a9f4-4639-a201-c02b7dbb5d98</uuid>
</filesystem>
</filesystems>
</operatingsystem>
</v2v-inspection>
Example output for a RHEL 7.3 guest:
<?xml version='1.0' encoding='utf-8'?>
<v2v-inspection>
<!-- generated by virt-v2v-inspector 2.10.0local,libvirt -->
<program>virt-v2v-inspector</program>
...
<operatingsystem>
<name>linux</name>
...
<mountpoints>
<mountpoint dev='/dev/sda3'>/</mountpoint>
<mountpoint dev='/dev/sda1'>/boot</mountpoint>
</mountpoints>
<filesystems>
<filesystem dev='/dev/sda1'>
<type>ext4</type>
<uuid>e0467228-8727-482d-bd7a-6741885fe7ed</uuid>
</filesystem>
<filesystem dev='/dev/sda2'>
<type>swap</type>
<uuid>9c2e6658-c600-4fbd-8731-864ff987553c</uuid>
</filesystem>
<filesystem dev='/dev/sda3'>
<type version='5'>xfs</type>
<uuid>9692610c-0025-4a8c-b806-8a78de2ec2eb</uuid>
</filesystem>
</filesystems>
</operatingsystem>
</v2v-inspection>
To work this requires libguestfs >= 1.59.2 (with guestfs_xfs_info2).
The version field may be missing, for non-XFS filesystems, but also if
we cannot tell the XFS version for some reason.
* = The virt-builder rhel-7.2 image definitely uses XFS v4, but it may
have been built from an early (pre-)release of 7.2. Later RHEL 7.2
seems to use XFS v5.
Fixes: https://issues.redhat.com/browse/RHEL-144075
(cherry picked from commit d6b2e643b174fff7d3442865da047bf3d3f9aac9)
---
inspector/create_inspector_xml.ml | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/inspector/create_inspector_xml.ml b/inspector/create_inspector_xml.ml
index fb434227..a531cecc 100644
--- a/inspector/create_inspector_xml.ml
+++ b/inspector/create_inspector_xml.ml
@@ -126,6 +126,28 @@ let rec create_inspector_xml input_disks inspect target_meta =
) inspect.i_mountpoints;
List.push_back os (e "mountpoints" [] !mps);
+ let fses = ref [] in
+ List.iter (
+ fun { fs_dev; fs_type; fs_version; fs_label; fs_uuid } ->
+ let fs = ref [] in
+ (match fs_type, fs_version with
+ | None, _ -> ()
+ | Some typ, None -> List.push_back fs (e "type" [] [PCData typ])
+ | Some typ, Some ver ->
+ List.push_back fs (e "type" [ "version", ver] [PCData typ])
+ );
+ (match fs_label with
+ | None -> ()
+ | Some label -> List.push_back fs (e "label" [] [PCData label])
+ );
+ (match fs_uuid with
+ | None -> ()
+ | Some uuid -> List.push_back fs (e "uuid" [] [PCData uuid])
+ );
+ List.push_back fses (e "filesystem" [ "dev", fs_dev] !fs)
+ ) inspect.i_filesystems;
+ List.push_back os (e "filesystems" [] !fses);
+
List.push_back body (e "operatingsystem" [] !os);
(* Construct the final document. *)

View File

@ -1,4 +1,4 @@
From 19cd953d2b43f1d385845ed86c1802d4343093e7 Mon Sep 17 00:00:00 2001
From 76e5a264a578f40917e4afb96069de97e8141c23 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

View File

@ -1,57 +0,0 @@
From 3ef1078cd3cf5a56dc8023ed113838533d9cea09 Mon Sep 17 00:00:00 2001
From: Martin Necas <mnecas@redhat.com>
Date: Tue, 27 Jan 2026 21:56:41 +0900
Subject: [PATCH] convert/convert_linux.ml: Add debian 12 UEFI
When migrating Debian 12 VM with UEFI the VM fails to boot as we don't
preserve the UEFI configuration. Debian has similar mechanism as ubuntu
so we can reuse it.
Fixes: https://issues.redhat.com/browse/RHEL-144467
Signed-off-by: Martin Necas <mnecas@redhat.com>
(cherry picked from commit 161679267f2100e3604dca3f5bfa0827e9a5de30)
---
convert/convert_linux.ml | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index 6c021efb..ce02b04a 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -1324,13 +1324,15 @@ fi
g inspect.i_root "fix uefi boot" fix_script)
else
cant_fix_uefi ()
- | "ubuntu", 14 ->
+ | ("ubuntu", 14) | ("debian", 12)->
(* to make a bootable uefi ubuntu 14 we need to
* copy shim<arch>.efi to UEFI fallback path
* and rename it to BOOT<arch>.efi, also we copy
* grub.efi and grub.cfg to UEFI fallback path without renaming *)
let arch_suffix = String.lowercase_ascii suffix in
+ let distro = inspect.i_distro in
+
let shim =
String.concat "" [grub_path; "/shim"; arch_suffix; ".efi"] in
let uefi_grub_name =
@@ -1346,14 +1348,14 @@ fi
* if not, then just don't clean up and leave the temp loader
* at UEFI fallback path for simplicity
*)
- if String.find shim "/boot/efi/EFI/ubuntu/shim" >= 0 then
+ if String.find shim (sprintf "/boot/efi/EFI/%s/shim" distro) >= 0 then
let fix_script =
sprintf
"#!/bin/bash\n\
- sudo efibootmgr -c -L ubuntu \
- -l \\\\EFI\\\\ubuntu\\\\shim%s.efi\n\
+ sudo efibootmgr -c -L %s \
+ -l \\\\EFI\\\\%s\\\\shim%s.efi\n\
rm -rf %s"
- arch_suffix uefi_fallback_path in
+ distro distro arch_suffix uefi_fallback_path in
Firstboot.add_firstboot_script
g inspect.i_root "fix uefi boot" fix_script
else

View File

@ -1,4 +1,4 @@
From 57a29e5f33a5035917ef0bfffaa61326148c7afa Mon Sep 17 00:00:00 2001
From 679424f25440deafed4be23c4bd6e4752e897cf0 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 5 Jul 2022 11:58:09 +0100
Subject: [PATCH] RHEL: tests: Remove btrfs test
@ -9,7 +9,7 @@ RHEL does not have btrfs so this test always fails.
1 file changed, 1 deletion(-)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 54cfd124..8e142b09 100644
index 19bdbe51..be6e1cd5 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -64,7 +64,6 @@ TESTS = \

View File

@ -1,45 +0,0 @@
From c532b2c1d14b22b540cced337ad26473aa5b6648 Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Tue, 27 Jan 2026 09:14:29 -0500
Subject: [PATCH] input: vcenter: double uri_encode `dcPath` and `dsName`
Special characters like `+` in vmware datastore names aren't accessible
by expected URLs:
https://knowledge.broadcom.com/external/article/386368/vcenter-inventory-object-name-with-speci.html
Turns out they need to passed through URI encoding twice.
Libvirt fixed this here:
https://gitlab.com/libvirt/libvirt/-/commit/6c9d2591c668732eb05cf17d27c9102ef3d40b39
But we need a similar fix for non-vddk vCenter conversions
Fixes: https://issues.redhat.com/browse/RHEL-133729
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit f13e85f9ce3bb51f65c0afbaae009b5a3e6af9c7)
---
input/vCenter.ml | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/input/vCenter.ml b/input/vCenter.ml
index f9b6ab07..fef113cd 100644
--- a/input/vCenter.ml
+++ b/input/vCenter.ml
@@ -137,9 +137,14 @@ and get_https_url dcPath uri server path =
(* XXX Need to handle templates. The file is called "-delta.vmdk" in
* place of "-flat.vmdk".
*)
+ (* dcPath and dsName need to be double quoted:
+ * https://gitlab.com/libvirt/libvirt/-/commit/6c9d2591c6
+ *)
sprintf "https://%s%s/folder/%s-flat.vmdk?dcPath=%s&dsName=%s"
server port
- (uri_quote path) (uri_quote dcPath) (uri_quote datastore)
+ (uri_quote path)
+ (uri_quote (uri_quote dcPath))
+ (uri_quote (uri_quote datastore))
)
(* Fetch the status from a URL. *)

View File

@ -1,4 +1,4 @@
From 61eac56a5cb787d591b9338324513b94f0f51b74 Mon Sep 17 00:00:00 2001
From 2683e8b2544180fec8ce0ebde667132031647704 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 9 Jul 2024 11:30:09 +0100
Subject: [PATCH] RHEL: Add warning about virt-v2v-in-place not being supported
@ -10,10 +10,10 @@ Fixes: https://issues.redhat.com/browse/RHEL-40903
2 files changed, 7 insertions(+)
diff --git a/in-place/in_place.ml b/in-place/in_place.ml
index 7e490867..6c2790af 100644
index e84266ab..a96d55d9 100644
--- a/in-place/in_place.ml
+++ b/in-place/in_place.ml
@@ -229,6 +229,9 @@ read the man page virt-v2v-in-place(1).
@@ -232,6 +232,9 @@ read the man page virt-v2v-in-place(1).
let opthandle = create_standard_options argspec ~anon_fun ~key_opts:true ~machine_readable:true usage_msg in
Getopt.parse opthandle.getopt;
@ -24,7 +24,7 @@ index 7e490867..6c2790af 100644
debug "info: %s: %s %s (%s)"
prog Config.package_name Config.package_version_full
diff --git a/in-place/virt-v2v-in-place.pod b/in-place/virt-v2v-in-place.pod
index 69d2092e..7c0a4d90 100644
index 540635d2..24e32afb 100644
--- a/in-place/virt-v2v-in-place.pod
+++ b/in-place/virt-v2v-in-place.pod
@@ -16,6 +16,10 @@ virt-v2v-in-place - Convert a guest to use KVM in-place

View File

@ -1,112 +0,0 @@
From 3b6f7752ab8c8879426518c7ab290db79e4f6571 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 27 Jan 2026 08:56:11 +0000
Subject: [PATCH] lib: Replace nbdkit file cache=none with
reduce-memory-pressure=on
nbdkit 1.46 replaced the cache=none option with the
same option renamed as 'reduce-memory-pressure', taking a boolean
value, see:
https://gitlab.com/nbdkit/nbdkit/-/commit/98a5ddc835ba520c949b31328aef7b7987462faa
The old option caused customer confusion. cache=none still works, but
to reduce confusion we should also prefer reduce-memory-pressure=on
when that option is available.
(cherry picked from commit 7aab8a85f2f1a6d01d5e62dabe1839483abd0401)
---
input/input_disk.ml | 2 +-
input/input_libvirt.ml | 2 +-
lib/nbdkit.ml | 9 +++++++++
lib/nbdkit.mli | 8 ++++++++
output/output.ml | 4 ++--
5 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/input/input_disk.ml b/input/input_disk.ml
index 8a71a3d9..a5291031 100644
--- a/input/input_disk.ml
+++ b/input/input_disk.ml
@@ -110,7 +110,7 @@ module Disk = struct
if options.read_only then
Nbdkit.add_filter cmd "cow";
Nbdkit.add_arg cmd "file" disk;
- Nbdkit.add_arg cmd "cache" "none";
+ Nbdkit.reduce_memory_pressure cmd;
let _, pid = Nbdkit.run_unix socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
diff --git a/input/input_libvirt.ml b/input/input_libvirt.ml
index f566ff5c..4c1a6eef 100644
--- a/input/input_libvirt.ml
+++ b/input/input_libvirt.ml
@@ -129,7 +129,7 @@ and setup_servers options dir disks =
if options.read_only then
Nbdkit.add_filter cmd "cow";
Nbdkit.add_arg cmd "file" filename;
- Nbdkit.add_arg cmd "cache" "none";
+ Nbdkit.reduce_memory_pressure cmd;
let _, pid = Nbdkit.run_unix socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
diff --git a/lib/nbdkit.ml b/lib/nbdkit.ml
index 9e42b607..e975bddf 100644
--- a/lib/nbdkit.ml
+++ b/lib/nbdkit.ml
@@ -134,6 +134,15 @@ 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 reduce_memory_pressure cmd =
+ assert (cmd.plugin = "file");
+ if probe_plugin_parameter cmd.plugin "reduce-memory-pressure=" then
+ add_arg cmd "reduce-memory-pressure" "on"
+ else if probe_plugin_parameter cmd.plugin "cache=" then
+ add_arg cmd "cache" "none"
+ else
+ assert false
+
let run_unix socket cmd =
(* Create a temporary directory where we place the PID file. *)
let piddir = Mkdtemp.temp_dir "v2vnbdkit." in
diff --git a/lib/nbdkit.mli b/lib/nbdkit.mli
index ea40b612..eaf65f05 100644
--- a/lib/nbdkit.mli
+++ b/lib/nbdkit.mli
@@ -109,6 +109,14 @@ val add_args : cmd -> (string * string) list -> unit
The arguments are added left to right. *)
+val reduce_memory_pressure : cmd -> unit
+(** This is short-hand for detecting if the file plugin supports the
+ [reduce-memory-pressure=on] option, and adding it to the nbdkit
+ command line. Otherwise it adds the old, confusing [cache=none]
+ option instead.
+
+ Only use this with the file plugin. *)
+
val add_env : cmd -> string -> string -> unit
(** Add name=value environment variable. *)
diff --git a/output/output.ml b/output/output.ml
index 3067b920..7e096278 100644
--- a/output/output.ml
+++ b/output/output.ml
@@ -102,7 +102,7 @@ let output_to_local_file ?name
| "raw" ->
let cmd = Nbdkit.create ?name "file" in
Nbdkit.add_arg cmd "file" filename;
- Nbdkit.add_arg cmd "cache" "none";
+ Nbdkit.reduce_memory_pressure cmd;
if verbose () then Nbdkit.add_filter_if_available cmd "count";
let _, pid = Nbdkit.run_unix socket cmd in
pid
@@ -205,7 +205,7 @@ let create_local_output_disks dir
(* Create the single nbdkit-file-plugin instance. *)
let cmd = Nbdkit.create ~name:"out" "file" in
Nbdkit.add_arg cmd "dir" output_storage;
- Nbdkit.add_arg cmd "cache" "none";
+ Nbdkit.reduce_memory_pressure cmd;
if verbose () then Nbdkit.add_filter_if_available cmd "count";
let _, pid = Nbdkit.run_unix socket cmd in
On_exit.kill pid;

View File

@ -1,4 +1,4 @@
From 9e9546aa983337e197407ce25ef3d3cd0a3cf173 Mon Sep 17 00:00:00 2001
From 5009d5dec647b1081645c543b513020fdb225f19 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 12 Dec 2025 16:18:15 +0000
Subject: [PATCH] RHEL: output/output.ml: Remove reduce-memory-pressure=on

View File

@ -1,36 +0,0 @@
From e7922450fa61f3280fbd9c429379e95bbde47787 Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Fri, 6 Feb 2026 15:17:05 -0500
Subject: [PATCH] convert/convert_linux.ml: Condense device regex handling
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit cf8b872c3eb7009cb399bdd395f9894ac288b9db)
---
convert/convert_linux.ml | 14 +++-----------
1 file changed, 3 insertions(+), 11 deletions(-)
diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index ce02b04a..d93036f9 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -1194,17 +1194,9 @@ fi
device
in
- if PCRE.matches rex_device_cciss value then (
- let device = PCRE.sub 1
- and part = try PCRE.sub 2 with Not_found -> "" in
- "/dev/" ^ replace device ^ part
- )
- else if PCRE.matches rex_device_nvme value then (
- let device = PCRE.sub 1
- and part = try PCRE.sub 2 with Not_found -> "" in
- "/dev/" ^ replace device ^ part
- )
- else if PCRE.matches rex_device value then (
+ if PCRE.matches rex_device_cciss value ||
+ PCRE.matches rex_device_nvme value ||
+ PCRE.matches rex_device value then (
let device = PCRE.sub 1
and part = try PCRE.sub 2 with Not_found -> "" in
"/dev/" ^ replace device ^ part

View File

@ -1,75 +0,0 @@
From 29dc8ba93237d7d70f5c39c28d74ec9bae0f9c00 Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Sun, 26 Oct 2025 12:53:58 -0400
Subject: [PATCH] convert: linux: replace /etc/crypttab /dev/sdX with UUID=
sles12sp5 installer luks setup will put a /dev/sdX style path
in /etc/crypttab. Example:
$ cat /etc/crypttab
cr_sda2 /dev/sda2 none none
For v2v conversion, switching that path to eg. /dev/vda2 is not enough:
initrd rebuild does not work correctly with systemd-cryptsetup,
because that new path doesn't exist at v2v conversion time, and
the converted guest doesn't boot correctly.
What we really want is to replace the unstable path with
UUID=<luks UUID>, to make this unambiguous. Do that for /dev/sdX
paths, where the appliance disk ordering should match, so a
vfs_uuid call gives us the UUID we want.
Fixes: https://issues.redhat.com/browse/RHEL-93583
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit 25b36dd60ada5a924b0d40a13d92c5e693cbe1a8)
---
convert/convert_linux.ml | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index d93036f9..4462e6cf 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -1165,6 +1165,7 @@ fi
let paths = [
(* /etc/fstab *)
"/files/etc/fstab/*/spec";
+ "/files/etc/crypttab/*/device";
] in
(* Bootloader config *)
let paths = paths @ bootloader#augeas_device_patterns in
@@ -1199,7 +1200,32 @@ fi
PCRE.matches rex_device value then (
let device = PCRE.sub 1
and part = try PCRE.sub 2 with Not_found -> "" in
- "/dev/" ^ replace device ^ part
+ let adjusted_dev = "/dev/" ^ replace device ^ part in
+
+ (* On sles12sp5, the installer puts a non-stable path into
+ /etc/crypttab, like /dev/sda2. If we replace it with eg. /dev/vda2,
+ and then regenerate dracut initrd, systemd cryptab integration
+ doesn't happen correctly, because it all expects /dev/vda2 to
+ exist at initrd creation time..
+
+ We can avoid this by filling in a stable `UUID=<luks UUID>` value.
+ This depends on /dev/sdXX in the guest having the same /dev/sdXX
+ name in the appliance.
+ *)
+ if String.starts_with "/etc/crypttab" path &&
+ String.starts_with "/dev/sd" value then (
+ try
+ let uuid = g#vfs_uuid value in
+ "UUID=" ^ uuid
+ with ex ->
+ warning (f_"failed to translate encrypted device name %s to a UUID \
+ in /etc/crypttab. This may prevent the guest from booting \
+ after conversion. You may have to manually change the file and \
+ reconvert. The original error was: %s")
+ value (Printexc.to_string ex);
+ adjusted_dev
+ ) else
+ adjusted_dev
)
else (* doesn't look like a known device name *)
value

File diff suppressed because it is too large Load Diff

View File

@ -1,44 +0,0 @@
From c80d9e84d1c5c12fd6fb675f99afcf0679a8a585 Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Tue, 10 Feb 2026 08:22:10 -0500
Subject: [PATCH] docs: Drop references to virtio-win osinfo usage
Follow on from libguestfs-common commit that dropped this:
https://github.com/libguestfs/libguestfs-common/commit/22d586fe9
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit 2ddfe18ccd7df423a86790b0505623660fc1ffe3)
---
docs/virt-v2v.pod | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index f751f4e7..258fe937 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -1344,9 +1344,9 @@ below.
Windows Drivers are installed from the ISO or directory pointed
to by the "VIRTIO_WIN" environment variable if present.
If the "VIRTIO_WIN" environment variable is absent
- (which is the recommended setting), then libosinfo is
- consulted first, for driver files that are locally
- available on the conversion host.
+ (which is the recommended setting), then drivers are
+ searched for in /usr/share/virtio-win, as installed
+ by the virtio-win RPM.
=head2 RHEL 4: SELinux relabel appears to hang forever
@@ -1877,11 +1877,6 @@ succeeds first:
=over 4
-=item C<osinfo-db>
-
-Load osinfo data from the default paths, and attempt to find drivers via
-libosinfo lookup. This is the preferred method.
-
=item F</usr/share/virtio-win/virtio-win.iso>
The ISO containing virtio drivers for Windows.

View File

@ -1,30 +0,0 @@
From 61a9ba9a9140573ec2964a6338e76c57c84bbf0a Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Tue, 10 Feb 2026 08:26:41 -0500
Subject: [PATCH] docs: update virtio-win exploded tree docs
The directory in /usr/share/virtio-win is not out of date these
days and hasn't been for years. See:
https://github.com/libguestfs/libguestfs-common/commit/4be37c277
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit f10924cdf2f438d0e939efdc6081b8b644a2131a)
---
docs/virt-v2v.pod | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 258fe937..04764832 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -1883,8 +1883,7 @@ The ISO containing virtio drivers for Windows.
=item F</usr/share/virtio-win>
-The exploded tree of virtio drivers for Windows. This is
-usually incomplete, hence the least preferred method.
+The exploded tree of virtio drivers for Windows.
=back

View File

@ -1,54 +0,0 @@
From fbd10145df6d6b903f476895c4b205a0c261e454 Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Tue, 10 Feb 2026 11:42:34 -0500
Subject: [PATCH] ocaml-link.sh.in: pass explicit guestfs search path
Without this, if we use `libguestfs/run` while `ocaml-libguestfs-*`
host packages are installed, we get mismatched search path warnings
like these, and then linking fails:
findlib: [WARNING] Package guestfs has multiple definitions in /tmp/libguestfs.git/ocaml/guestfs/META, /usr/lib64/ocaml/guestfs/META
findlib: [WARNING] Interface guestfs.cmi occurs in several directories: /usr/lib64/ocaml/guestfs, /tmp/libguestfs.git/ocaml/guestfs
This change avoids the last warning. There's still lots of spew
about `multiple definitions` but it seems harmless.
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit 123c3211dfb4fb8949fbdc3967ec51e9eda34a6c)
---
ocaml-link.sh.in | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/ocaml-link.sh.in b/ocaml-link.sh.in
index 4148e8f9..d3c44d10 100755
--- a/ocaml-link.sh.in
+++ b/ocaml-link.sh.in
@@ -41,18 +41,26 @@ while true ; do
esac
done
+# Without this, if we use `libguestfs/run` while `ocaml-libguestfs-*`
+# host packages are installed, we get mismatched search path warnings
+# like these, and then linking fails:
+#
+# findlib: [WARNING] Package guestfs has multiple definitions in /tmp/libguestfs.git/ocaml/guestfs/META, /usr/lib64/ocaml/guestfs/META
+# findlib: [WARNING] Interface guestfs.cmi occurs in several directories: /usr/lib64/ocaml/guestfs, /tmp/libguestfs.git/ocaml/guestfs
+guestfs_path=$(@OCAMLFIND@ query guestfs 2>/dev/null)
+
# Integration with silent rules of automake: print the full command
# line option in verbose mode.
if [ x"${V:-@AM_DEFAULT_VERBOSITY@}" = x1 ]; then
echo "$@" \
@OCAML_RUNTIME_VARIANT_PIC_OPTION@ \
- -I +guestfs \
+ -I "$guestfs_path" \
-linkpkg \
-cclib "'@LDFLAGS@ $cclib'"
fi
# NB -cclib must come last.
exec "$@" \
@OCAML_RUNTIME_VARIANT_PIC_OPTION@ \
- -I +guestfs \
+ -I "$guestfs_path" \
-linkpkg \
-cclib "@LDFLAGS@ $cclib"

View File

@ -1,85 +0,0 @@
From 2723d30596546e92141f45bd302cf895d6233495 Mon Sep 17 00:00:00 2001
From: Susant Sahani <ssahani@redhat.com>
Date: Tue, 10 Feb 2026 15:15:21 +0530
Subject: [PATCH] output: introduce disk_name helper
Refactor the places where we create "name-sdX" names to use a common
helper function.
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
Signed-off-by: Susant Sahani <ssahani@redhat.com>
(cherry picked from commit a4b76ca9b5e01e807d39c0a2ba1fe515b854ef82)
---
output/output.ml | 7 +++++--
output/output.mli | 4 ++++
output/output_libvirt.ml | 2 +-
output/output_openstack.ml | 2 +-
4 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/output/output.ml b/output/output.ml
index 7e096278..919a48a4 100644
--- a/output/output.ml
+++ b/output/output.ml
@@ -150,8 +150,11 @@ let output_to_local_file ?name
ignore (waitpid [] pid)
)
+let disk_name name i =
+ sprintf "%s-sd%s" name (drive_name i)
+
let disk_path os name i =
- let outdisk = sprintf "%s/%s-sd%s" os name (drive_name i) in
+ let outdisk = sprintf "%s/%s" os (disk_name name i) in
absolute_path outdisk
let create_local_output_disks dir
@@ -214,7 +217,7 @@ let create_local_output_disks dir
let uris =
List.mapi (
fun i _ ->
- let export = sprintf "%s-sd%s" output_name (drive_name i) in
+ let export = disk_name output_name i in
NBD_URI.Unix (socket, Some export)
) input_disks in
diff --git a/output/output.mli b/output/output.mli
index fa79bfe1..d63a5d72 100644
--- a/output/output.mli
+++ b/output/output.mli
@@ -121,6 +121,10 @@ val output_to_local_file : ?name:string ->
(such as unmounting a host filesystem or removing a host device)
depends on the NBD server releasing resources. *)
+val disk_name : string -> int -> string
+(** Return the disk name for the i'th disk,
+ eg. 0 => name-sda. *)
+
val disk_path : string -> string -> int -> string
(** For [-o disk|qemu], return the output disk name of the i'th disk,
eg. 0 => /path/to/name-sda. *)
diff --git a/output/output_libvirt.ml b/output/output_libvirt.ml
index 9560d2d3..708de3e0 100644
--- a/output/output_libvirt.ml
+++ b/output/output_libvirt.ml
@@ -189,7 +189,7 @@ module Libvirt_ = struct
let doc =
create_libvirt_xml ~pool:pool_name source inspect target_meta
target_features domcaps_features
- (fun i -> output_name ^ "-sd" ^ (drive_name i))
+ (disk_name output_name)
output_format output_name in
let tmpfile, chan = Filename.open_temp_file "v2vlibvirt" ".xml" in
diff --git a/output/output_openstack.ml b/output/output_openstack.ml
index 88a39c68..dd04052e 100644
--- a/output/output_openstack.ml
+++ b/output/output_openstack.ml
@@ -322,7 +322,7 @@ The os-* parameters and environment variables are optional.
* something related to the guest name. Cinder volume
* names do not need to be unique.
*)
- let name = sprintf "%s-sd%s" output_name (drive_name i) in
+ let name = disk_name output_name i in
(* Create the cinder volume. *)
let id = create_cinder_volume name description size in

View File

@ -1,71 +0,0 @@
From 8edb5356b40b28f26e3c7f891cf47018e67d4903 Mon Sep 17 00:00:00 2001
From: Susant Sahani <ssahani@redhat.com>
Date: Tue, 10 Feb 2026 15:15:21 +0530
Subject: [PATCH] output: Replace '/' in VM names with '_'
Add Utils.sanitize_slash function which replaces '/' with '_' in VM
names, and use that in the new disk_name function.
For example, if the VM name is "foo/bar" then the new generated name
will be "foo_bar-sda". You can use -on option to choose an output
name instead of relying on this.
Fixes: https://issues.redhat.com/browse/RHEL-136479
Signed-off-by: Susant Sahani <ssahani@redhat.com>
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 25161d37484f6f3431446cae7eabef4054752c65)
---
lib/utils.ml | 3 +++
lib/utils.mli | 4 ++++
output/output.ml | 1 +
output/output.mli | 2 +-
4 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/lib/utils.ml b/lib/utils.ml
index 9da6737c..15af5b1a 100644
--- a/lib/utils.ml
+++ b/lib/utils.ml
@@ -289,3 +289,6 @@ let name_from_disk disk =
if name = "" then
error (f_"invalid input filename (%s)") disk;
name
+
+let sanitize_slash =
+ String.map (fun c -> if c = '/' then '_' else c)
diff --git a/lib/utils.mli b/lib/utils.mli
index c976a582..40bed0b9 100644
--- a/lib/utils.mli
+++ b/lib/utils.mli
@@ -108,3 +108,7 @@ val name_from_disk : string -> string
(** Take a disk name and derive from it a suitable source name.
Used in particular by [-i disk], [-i ova] and [-i vmx] modes. *)
+
+val sanitize_slash : string -> string
+(** Replace '/' with '_' in guest names for filesystem paths and
+ libvirt domain names. *)
diff --git a/output/output.ml b/output/output.ml
index 919a48a4..ff4b12b1 100644
--- a/output/output.ml
+++ b/output/output.ml
@@ -151,6 +151,7 @@ let output_to_local_file ?name
)
let disk_name name i =
+ let name = Utils.sanitize_slash name in
sprintf "%s-sd%s" name (drive_name i)
let disk_path os name i =
diff --git a/output/output.mli b/output/output.mli
index d63a5d72..3f953010 100644
--- a/output/output.mli
+++ b/output/output.mli
@@ -122,7 +122,7 @@ val output_to_local_file : ?name:string ->
depends on the NBD server releasing resources. *)
val disk_name : string -> int -> string
-(** Return the disk name for the i'th disk,
+(** Return the sanitized disk name for the i'th disk,
eg. 0 => name-sda. *)
val disk_path : string -> string -> int -> string

View File

@ -1,55 +0,0 @@
From b0e084027f528bbc42bd4c5a19c6ec441518044a Mon Sep 17 00:00:00 2001
From: Susant Sahani <ssahani@redhat.com>
Date: Tue, 10 Feb 2026 15:15:27 +0530
Subject: [PATCH] output: sanitize guest names in metadata file paths
Use sanitize_slash for metadata filenames to avoid '/' in paths.
Fixes: https://issues.redhat.com/browse/RHEL-136479
Signed-off-by: Susant Sahani <ssahani@redhat.com>
(cherry picked from commit e02563cfcb0022cdd3a044c6a8e459eeb2c5abf6)
---
output/output_disk.ml | 2 +-
output/output_kubevirt.ml | 2 +-
output/output_qemu.ml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/output/output_disk.ml b/output/output_disk.ml
index af0a3fac..dc43d637 100644
--- a/output/output_disk.ml
+++ b/output/output_disk.ml
@@ -105,7 +105,7 @@ module Disk = struct
(disk_path output_storage output_name)
output_format output_name in
- let file = output_storage // output_name ^ ".xml" in
+ let file = output_storage // (sanitize_slash output_name) ^ ".xml" in
with_open_out file (fun chan -> DOM.doc_to_chan chan doc);
if verbose () then (
diff --git a/output/output_kubevirt.ml b/output/output_kubevirt.ml
index 8a5ab56d..8b011436 100644
--- a/output/output_kubevirt.ml
+++ b/output/output_kubevirt.ml
@@ -146,7 +146,7 @@ module Kubevirt = struct
let doc = create_kubevirt_yaml source inspect target_meta disk_path
output_format output_name in
- let file = output_storage // output_name ^ ".yaml" in
+ let file = output_storage // (sanitize_slash output_name) ^ ".yaml" in
with_open_out file (fun chan -> YAML.doc_to_chan chan doc);
if verbose () then (
diff --git a/output/output_qemu.ml b/output/output_qemu.ml
index 63299423..b9090d86 100644
--- a/output/output_qemu.ml
+++ b/output/output_qemu.ml
@@ -111,7 +111,7 @@ module QEMU = struct
(* Start the shell script. Write it to a temporary file
* which we rename at the end.
*)
- let file = output_storage // output_name ^ ".sh" in
+ let file = output_storage // (sanitize_slash output_name) ^ ".sh" in
let tmpfile = file ^ ".tmp" in
On_exit.unlink tmpfile;

View File

@ -1,27 +0,0 @@
From 3f5a9ac841adc8996a74e32659aed4c3fc831c6c Mon Sep 17 00:00:00 2001
From: Susant Sahani <ssahani@redhat.com>
Date: Tue, 10 Feb 2026 15:15:31 +0530
Subject: [PATCH] output: sanitize VM names in libvirt XML
Prevent domain creation failures when VM names contain '/' characters.
Fixes: https://issues.redhat.com/browse/RHEL-136479
Signed-off-by: Susant Sahani <ssahani@redhat.com>
(cherry picked from commit 1e68923593a7121943f09e67a6b78b902bfeeceb)
---
output/create_libvirt_xml.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml
index e4199efe..7471ee5a 100644
--- a/output/create_libvirt_xml.ml
+++ b/output/create_libvirt_xml.ml
@@ -51,7 +51,7 @@ let create_libvirt_xml ?pool source inspect
List.push_back_list body [
Comment generated_by;
- e "name" [] [PCData output_name];
+ e "name" [] [PCData (Utils.sanitize_slash output_name)];
];
(match source.s_genid with

View File

@ -1,62 +0,0 @@
From 2666493010b1b82d5b8dbb517c9976727b05184f Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Wed, 11 Feb 2026 19:09:26 -0500
Subject: [PATCH] Update common submodule
Update to fix:
https://issues.redhat.com/browse/RHEL-148423
This pulls in the following commits:
Cole Robinson (1):
virtio-win: Install blnsvr.exe to C:\Windows\Drivers\VirtIO
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit b227d493ace2250bbc53a25ce7db42fcf220ba51)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 1005f4a6..22b583b9:
diff --git a/common/mlcustomize/inject_virtio_win.ml b/common/mlcustomize/inject_virtio_win.ml
index 114df064..a2938080 100644
--- a/common/mlcustomize/inject_virtio_win.ml
+++ b/common/mlcustomize/inject_virtio_win.ml
@@ -254,13 +254,10 @@ and inject_qemu_ga ({ g; root } as t) =
and inject_blnsvr ({ g; root } as t) =
(* Copy the files to the guest. *)
- let dir, dir_win = Firstboot.firstboot_dir g root in
- let dir_win = Option.value dir_win ~default:dir in
- let tempdir = sprintf "%s/Temp" dir in
- let tempdir_win = sprintf "%s\\Temp" dir_win in
- g#mkdir_p tempdir;
+ let driverdir = sprintf "%s/Drivers/VirtIO" t.i_windows_systemroot in
+ g#mkdir_p driverdir;
- let files = copy_blnsvr t tempdir in
+ let files = copy_blnsvr t driverdir in
match files with
| [] -> false (* Didn't find or install anything. *)
@@ -268,7 +265,7 @@ and inject_blnsvr ({ g; root } as t) =
* drivers/by-driver). Pick the first.
*)
| blnsvr :: _ ->
- configure_blnsvr t tempdir_win blnsvr;
+ configure_blnsvr t driverdir blnsvr;
true
and add_guestor_to_registry t ((g, root) as reg) drv_name drv_pciid =
@@ -570,9 +567,9 @@ and configure_qemu_ga t tempdir_win files =
Firstboot.add_firstboot_powershell t.g t.root "install-qemu-ga" !script
-and configure_blnsvr t tempdir_win blnsvr =
+and configure_blnsvr t driverdir blnsvr =
let cmd = sprintf "\
@echo off\n\
echo Installing %s\n\
- \"%s\\%s\" -i\n" blnsvr tempdir_win blnsvr in
+ \"%s\\%s\" -i\n" blnsvr driverdir blnsvr in
Firstboot.add_firstboot_script t.g t.root "install-blnsvr" cmd

View File

@ -1,30 +0,0 @@
From 4e06515083d7effdee91195dbf93082e544a6283 Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Mon, 16 Feb 2026 13:58:08 -0500
Subject: [PATCH] convert: linux: properly match /etc/crypttab
I broke b227d493ace2250bbc53a25ce7db42fcf220ba51 during review
and neglected to retest. We need to match an augeas style
path when using starts_with
Fixes: https://issues.redhat.com/browse/RHEL-93583
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit 109bc1ab3bd2f6b9d73616c546aeceb0631159be)
---
convert/convert_linux.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index 4462e6cf..484148ab 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -1212,7 +1212,7 @@ fi
This depends on /dev/sdXX in the guest having the same /dev/sdXX
name in the appliance.
*)
- if String.starts_with "/etc/crypttab" path &&
+ if String.starts_with "/files/etc/crypttab" path &&
String.starts_with "/dev/sd" value then (
try
let uuid = g#vfs_uuid value in

View File

@ -1,302 +0,0 @@
From f937f290a4c032c971ad78d1b07e8aefe15eab8a Mon Sep 17 00:00:00 2001
From: sarika <sarika@platform9.com>
Date: Tue, 9 Dec 2025 16:12:14 +0530
Subject: [PATCH] Add --no-fstrim option to disable fstrim during conversion
In particular, fstrim on NTFS is a serialized operation which can be
very slow on large partitions.
Closes: https://github.com/libguestfs/virt-v2v/pull/121
Fixes: https://redhat.atlassian.net/browse/RHEL-164271
RWMJ: Added documentation, a test, and larger commit message.
(cherry picked from commit 251639458907f06148ecdd5acbac5c43136e7662)
---
convert/convert.ml | 10 ++++++--
convert/convert.mli | 1 +
docs/virt-v2v.pod | 6 +++++
in-place/in_place.ml | 5 ++++
in-place/virt-v2v-in-place.pod | 4 +++
inspector/inspector.ml | 6 +++++
inspector/virt-v2v-inspector.pod | 2 ++
tests/Makefile.am | 2 ++
tests/test-no-fstrim.sh | 44 ++++++++++++++++++++++++++++++++
v2v/v2v.ml | 6 +++++
10 files changed, 84 insertions(+), 2 deletions(-)
create mode 100755 tests/test-no-fstrim.sh
diff --git a/convert/convert.ml b/convert/convert.ml
index eb51e9b9..1ff87e43 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -40,6 +40,7 @@ type options = {
smp : int option;
static_ips : static_ip list;
customize_ops : Customize_cmdline.ops;
+ no_fstrim : bool;
}
(* Mountpoint stats, used for free space estimation. *)
@@ -157,8 +158,13 @@ let rec convert input_disks options source =
* because unused blocks are marked in the overlay and thus do
* not have to be copied.
*)
- message (f_"Mapping filesystem data to avoid copying unused and blank areas");
- do_fstrim g inspect;
+ if not options.no_fstrim then (
+ message
+ (f_"Mapping filesystem data to avoid copying unused and blank areas");
+ do_fstrim g inspect
+ ) else (
+ message (f_"Skipping fstrim (--no-fstrim specified)")
+ );
(* Check (fsck) the filesystems after conversion. *)
g#umount_all ();
diff --git a/convert/convert.mli b/convert/convert.mli
index f2a8d662..faf671fc 100644
--- a/convert/convert.mli
+++ b/convert/convert.mli
@@ -26,6 +26,7 @@ type options = {
smp : int option; (** [--smp] option *)
static_ips : Types.static_ip list; (** [--mac :ip:] option *)
customize_ops : Customize_cmdline.ops; (** virt-customize options *)
+ no_fstrim : bool; (** [--no-fstrim] option *)
}
(** Command line options that get passed through to the conversion code. *)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index eb550da0..5c191889 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -468,6 +468,10 @@ are mapped to C<out>.
See L</Networks and bridges> below.
+=item B<--no-fstrim>
+
+Do not trim the filesystem. See L</Trimming> below.
+
=item B<-o> B<disk>
This is the same as I<-o local>.
@@ -1026,6 +1030,8 @@ fstrim support in the Linux kernel is improving gradually, so over
time some of these restrictions will be lifted and virt-v2v will work
faster.
+Use I<--no-fstrim> to disable trimming.
+
=head2 Free space for conversion
=head3 Free space in the guest
diff --git a/in-place/in_place.ml b/in-place/in_place.ml
index 6c2790af..a96d55d9 100644
--- a/in-place/in_place.ml
+++ b/in-place/in_place.ml
@@ -151,6 +151,7 @@ let rec main () =
let set_root_choice = Types.set_root_choice root_choice in
(* Other options that we handle here. *)
+ let no_fstrim = ref false in
let print_source = ref false in
let input_modes =
@@ -185,6 +186,8 @@ let rec main () =
s_"Map network in to out";
[ S 'O' ], Getopt.String ("output.xml", set_output_xml_option),
s_"Set the output filename";
+ [ L"no-fstrim" ], Getopt.Set no_fstrim,
+ s_"Don't trim filesystems before conversion";
[ L"print-source" ], Getopt.Set print_source,
s_"Print source and stop";
[ L"root" ], Getopt.String ("ask|... ", set_root_choice),
@@ -257,6 +260,7 @@ read the man page virt-v2v-in-place(1).
let customize_ops = get_customize_ops () in
let input_conn = !input_conn in
let input_mode = !input_mode in
+ let no_fstrim = !no_fstrim in
let memsize = !memsize in
let output_xml = !output_xml in
let print_source = !print_source in
@@ -329,6 +333,7 @@ read the man page virt-v2v-in-place(1).
smp;
static_ips;
customize_ops;
+ no_fstrim;
} in
(* Before starting the input module, check there is sufficient
diff --git a/in-place/virt-v2v-in-place.pod b/in-place/virt-v2v-in-place.pod
index 7c0a4d90..ac4142ae 100644
--- a/in-place/virt-v2v-in-place.pod
+++ b/in-place/virt-v2v-in-place.pod
@@ -239,6 +239,10 @@ are mapped to C<out>.
See L<virt-v2v(1)/Networks and bridges>.
+=item B<--no-fstrim>
+
+Do not trim the filesystem. See L<virt-v2v(1)/Trimming>.
+
=item B<-O> output.xml
=item B<-O ->
diff --git a/inspector/inspector.ml b/inspector/inspector.ml
index 752a5c1c..137d5f61 100644
--- a/inspector/inspector.ml
+++ b/inspector/inspector.ml
@@ -70,6 +70,8 @@ let rec main () =
let smp = ref None in
let set_smp arg = smp := Some arg in
+ let no_fstrim = ref false in
+
let network_map = Networks.create () in
let static_ips = ref [] in
let rec add_network str =
@@ -171,6 +173,8 @@ let rec main () =
s_"Map NIC to network or bridge or assign static IP";
[ S 'm'; L"memsize" ], Getopt.Int ("mb", set_memsize),
s_"Set memory size";
+ [ L"no-fstrim" ], Getopt.Set no_fstrim,
+ s_"Don't trim filesystems before conversion";
[ S 'n'; L"network" ], Getopt.String ("in:out", add_network),
s_"Map network in to out";
[ S 'O' ], Getopt.String ("output.xml", set_output_file_option),
@@ -233,6 +237,7 @@ read the man page virt-v2v-inspector(1).
| Some transport ->
error (f_"unknown input transport -it %s") transport in
let memsize = !memsize in
+ let no_fstrim = !no_fstrim in
let root_choice = !root_choice in
let smp = !smp in
let static_ips = !static_ips in
@@ -293,6 +298,7 @@ read the man page virt-v2v-inspector(1).
smp;
static_ips;
customize_ops;
+ no_fstrim;
} in
(* Before starting the input module, check there is sufficient
diff --git a/inspector/virt-v2v-inspector.pod b/inspector/virt-v2v-inspector.pod
index 26770459..65ce71ce 100644
--- a/inspector/virt-v2v-inspector.pod
+++ b/inspector/virt-v2v-inspector.pod
@@ -202,6 +202,8 @@ virt-v2v-inspector.
=item B<--network> ...
+=item B<--no-fstrim>
+
=item B<-q>
=item B<--quiet>
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8e142b09..7182f62b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -92,6 +92,7 @@ TESTS = \
test-mac.sh \
test-machine-readable.sh \
test-networks-and-bridges.sh \
+ test-no-fstrim.sh \
test-o-glance.sh \
test-o-kubevirt-fedora.sh \
test-o-kubevirt-oo-disk.sh \
@@ -291,6 +292,7 @@ EXTRA_DIST += \
test-machine-readable.sh \
test-networks-and-bridges-expected.xml \
test-networks-and-bridges.sh \
+ test-no-fstrim.sh \
test-o-glance.sh \
test-o-kubevirt-fedora.sh \
test-o-kubevirt-fedora.yaml.expected \
diff --git a/tests/test-no-fstrim.sh b/tests/test-no-fstrim.sh
new file mode 100755
index 00000000..ba84ad96
--- /dev/null
+++ b/tests/test-no-fstrim.sh
@@ -0,0 +1,44 @@
+#!/bin/bash -
+# libguestfs virt-v2v test script
+# Copyright (C) 2014-2026 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 --no-fstrim option.
+
+source ./functions.sh
+set -e
+set -x
+
+skip_if_skipped
+requires test -s ../test-data/phony-guests/windows.img
+
+export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools"
+
+d=test-no-fstrim.d
+rm -rf $d
+cleanup_fn rm -rf $d
+mkdir $d
+
+$VG virt-v2v --debug-gc \
+ -i disk ../test-data/phony-guests/windows.img \
+ --no-fstrim \
+ -o local -os $d
+
+# Test the libvirt XML metadata and a disk was created.
+test -f $d/windows.xml
+test -f $d/windows-sda
+
+cat $d/windows.xml
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index dd224b40..480fa81a 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -80,6 +80,8 @@ let rec main () =
let smp = ref None in
let set_smp arg = smp := Some arg in
+ let no_fstrim = ref false in
+
let network_map = Networks.create () in
let static_ips = ref [] in
let rec add_network str =
@@ -242,6 +244,8 @@ let rec main () =
s_"Use password from file to connect to output hypervisor";
[ M"os" ], Getopt.String ("storage", set_string_option_once "-os" output_storage),
s_"Set output storage location";
+ [ L"no-fstrim" ], Getopt.Set no_fstrim,
+ s_"Don't trim filesystems before conversion";
[ L"parallel" ], Getopt.Set_int ("N", parallel),
s_"Run up to N instances of nbdcopy in parallel";
[ L"print-source" ], Getopt.Set print_source,
@@ -324,6 +328,7 @@ read the man page virt-v2v(1).
| Some transport ->
error (f_"unknown input transport -it %s") transport in
let memsize = !memsize in
+ let no_fstrim = !no_fstrim in
let output_alloc =
match !output_alloc with
| `Not_set | `Sparse -> Types.Sparse
@@ -440,6 +445,7 @@ read the man page virt-v2v(1).
smp;
static_ips;
customize_ops;
+ no_fstrim;
} in
(* Before starting the input module, check there is sufficient

View File

@ -1,2 +1,2 @@
SHA512 (virt-v2v-2.10.0.tar.gz) = 035f2181c1cc5f482e96d3e21b513b95939ca224d71ac6ad938842d5af5d60ef07db1600d2ccb609dc2042b1c74088f6f39ffbe595cb51e80278ecb50c314515
SHA512 (virt-v2v-2.10.0.tar.gz.sig) = cb6301224ef00577a9cd0fc8fa504e583eb447341bd3849e6854f2d78ae72ca39bca68b70f30efd3d1d64480acf161c5e4bc9ba943595ef4dd2a654c3268aa66
SHA512 (virt-v2v-2.11.5.tar.gz) = f28cd95712e155536d0b3f04fd11cbbe10051bce354d76fd940f5e11b95467b26f11f0fb45d17c2ef1c0b74e82858a01d42621b6d954bfc5de3da328eb073b47
SHA512 (virt-v2v-2.11.5.tar.gz.sig) = e8c9fef0db34c34cf2429792f5f8a0a8403d61d33d211878d8145e649e0216b0ed2fc0ccc6f353fc2def94435515743f570dad2d5dd9ad56e4c8ac4b491bd979

View File

@ -2,7 +2,7 @@
%global verify_tarball_signature 1
# The source directory.
%global source_directory 2.10-stable
%global source_directory 2.11-development
%if !0%{?rhel}
# Optional features enabled in this build for Fedora.
@ -44,8 +44,8 @@ ExclusiveArch: x86_64
Name: virt-v2v
Epoch: 1
Version: 2.10.0
Release: 9%{?dist}
Version: 2.11.5
Release: 1%{?dist}
Summary: Convert a virtual machine to run on KVM
License: GPL-2.0-or-later AND LGPL-2.0-or-later
@ -62,40 +62,19 @@ Source2: libguestfs.keyring
Source3: copy-patches.sh
# Patches are maintained in the following repository:
# https://github.com/libguestfs/virt-v2v/commits/rhel-10.2
# https://github.com/libguestfs/virt-v2v/commits/rhel-10.3
# Patches.
Patch0001: 0001-docs-virt-v2v.pod-Document-Windows-vTPM-and-BitLocke.patch
Patch0002: 0002-input-ssh.ml-Add-debugging-around-remote_file_exists.patch
Patch0003: 0003-input-ssh.ml-Fix-Ssh.remote_file_exists.patch
Patch0004: 0004-Update-common-submodule.patch
Patch0005: 0005-v2v-Enhance-inspection-with-filesystems-information.patch
Patch0006: 0006-inspector-Enhance-virt-v2v-inspector-output-with-fil.patch
Patch0007: 0007-convert-convert_linux.ml-Add-debian-12-UEFI.patch
Patch0008: 0008-input-vcenter-double-uri_encode-dcPath-and-dsName.patch
Patch0009: 0009-lib-Replace-nbdkit-file-cache-none-with-reduce-memor.patch
Patch0010: 0010-convert-convert_linux.ml-Condense-device-regex-handl.patch
Patch0011: 0011-convert-linux-replace-etc-crypttab-dev-sdX-with-UUID.patch
Patch0012: 0012-build-replace-AM_GNU_GETTEXT-with-simpler-LIBINTL-ch.patch
Patch0013: 0013-docs-Drop-references-to-virtio-win-osinfo-usage.patch
Patch0014: 0014-docs-update-virtio-win-exploded-tree-docs.patch
Patch0015: 0015-ocaml-link.sh.in-pass-explicit-guestfs-search-path.patch
Patch0016: 0016-output-introduce-disk_name-helper.patch
Patch0017: 0017-output-Replace-in-VM-names-with-_.patch
Patch0018: 0018-output-sanitize-guest-names-in-metadata-file-paths.patch
Patch0019: 0019-output-sanitize-VM-names-in-libvirt-XML.patch
Patch0020: 0020-RHEL-Fixes-for-libguestfs-winsupport.patch
Patch0021: 0021-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch
Patch0022: 0022-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch
Patch0023: 0023-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch
Patch0024: 0024-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch
Patch0025: 0025-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch
Patch0026: 0026-RHEL-tests-Remove-btrfs-test.patch
Patch0027: 0027-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch
Patch0028: 0028-RHEL-output-output.ml-Remove-reduce-memory-pressure-.patch
Patch0029: 0029-Update-common-submodule.patch
Patch0030: 0030-convert-linux-properly-match-etc-crypttab.patch
Patch0031: 0031-Add-no-fstrim-option-to-disable-fstrim-during-conver.patch
Patch0001: 0001-RHEL-Update-v2v-Enhance-inspection-with-filesystems-.patch
Patch0002: 0002-RHEL-Fixes-for-libguestfs-winsupport.patch
Patch0003: 0003-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch
Patch0004: 0004-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch
Patch0005: 0005-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch
Patch0006: 0006-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch
Patch0007: 0007-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch
Patch0008: 0008-RHEL-tests-Remove-btrfs-test.patch
Patch0009: 0009-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch
Patch0010: 0010-RHEL-output-output.ml-Remove-reduce-memory-pressure-.patch
BuildRequires: autoconf, automake, libtool
BuildRequires: make
@ -106,6 +85,7 @@ BuildRequires: perl(IPC::Run3)
BuildRequires: gcc
BuildRequires: ocaml >= 4.08
# In Fedora this is: libguestfs-devel >= 1:1.59.2-1
BuildRequires: libguestfs-devel >= 1:1.58.1-2
BuildRequires: augeas-devel
BuildRequires: bash-completion
@ -152,6 +132,7 @@ BuildRequires: glibc-static
BuildRequires: gnupg2
%endif
# In Fedora this is: libguestfs%%{?_isa} >= 1:1.59.2-1
Requires: libguestfs%{?_isa} >= 1:1.58.1-2
Requires: guestfs-tools >= 1.54
@ -401,6 +382,19 @@ done
%changelog
* Mon Apr 13 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.11.5-1
- Rebase to virt-v2v 2.11.5
Synchronize spec file with Fedora
resolves: RHEL-153361
- Fixes incorrect driver location for Windows 2008 SP2
resolves: RHEL-159888
- Create sentinel file after all firstboot scripts have finished running
resolves: RHEL-152939
- Obey cgroups when computing SMP
resolves: RHEL-152766
- Fix encrypted Ubuntu guest fail to boot after conversion
resolves: RHEL-137121
* Fri Apr 03 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.10.0-9
- Add --no-fstrim option
resolves: RHEL-164271