import CS virt-v2v-2.10.0-7.el10

This commit is contained in:
Andrew Lukoshko 2026-06-08 12:45:15 +00:00
parent 591a3f3ea9
commit 1416614d19
73 changed files with 5589 additions and 8928 deletions

16
.gitignore vendored
View File

@ -1,2 +1,14 @@
libguestfs.keyring
virt-v2v-2.8.1.tar.gz
*~
# RPM target directories
/x86_64
# Version-dependent build artifacts
/.build-*.log
/virt-v2v-v*/
/virt-v2v-*.src.rpm
/results_virt-v2v/
# Source
/virt-v2v-*.tar.gz
/virt-v2v-*.tar.gz.sig

View File

@ -1,47 +0,0 @@
From 7566e3e433bd6ea44785b08164506fd013fe2b51 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 8 Jul 2025 11:11:48 +0100
Subject: [PATCH] docs: Move -oo verify-server-certificate docs to alphabetical
place
This option wasn't in alphabetical order.
(cherry picked from commit 378967fc4984af4f06c586886a1148aebede8cff)
---
docs/virt-v2v.pod | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 3cfb0948..3eefe404 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -611,14 +611,6 @@ volume property.
When using I<-o qemu> only, this boots the guest immediately after
virt-v2v finishes.
-=item B<-oo verify-server-certificate>
-
-=item B<-oo verify-server-certificate=>C<true|false>
-
-For I<-o openstack> (L<virt-v2v-output-openstack(1)>) only, this can
-be used to disable SSL certification validation when connecting to
-OpenStack by specifying I<-oo verify-server-certificate=false>.
-
=item B<-oo os->*B<=>*
For I<-o openstack> (L<virt-v2v-output-openstack(1)>) only, set optional
@@ -736,6 +728,14 @@ The OVF format understood by oVirt REST API.
For backward compatibility the default is I<ovirtexp>, but this may change in
the future.
+=item B<-oo verify-server-certificate>
+
+=item B<-oo verify-server-certificate=>C<true|false>
+
+For I<-o openstack> (L<virt-v2v-output-openstack(1)>) only, this can
+be used to disable SSL certification validation when connecting to
+OpenStack by specifying I<-oo verify-server-certificate=false>.
+
=item B<-op> file
Supply a file containing a password to be used when connecting to the

View File

@ -0,0 +1,46 @@
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,67 +0,0 @@
From c2c829eb22add09de338da065214c9b6aced42e2 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 10 Jul 2025 09:13:54 +0100
Subject: [PATCH] input/input_vddk.ml: Fix escaping of export=... parameter
Commit b49ee14368 ("input: vddk: Use single nbdkit-vddk-plugin
instance with exports") switched to using the new nbdkit-vddk-plugin
export feature, where we can run a single nbdkit instance and choose
which disk we want to see using the NBD protocol exportname feature.
As part of this, we are required to set an export parameter, which is
a wildcard that all exportnames must match. This is a safety feature
so that nbdkit will only serve a subset of the VMware files, instead
of allowing anyone who can attach to the nbdkit socket to read any
file on the server. (The socket is further protected by not being
readable to users other than the user running virt-v2v.)
We compute this by doing a longest common prefix of all the disk names
associated with a guest.
Ming Xie found a case where this failed. Given two names called:
"[datastore1 (3)] esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker/esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker.vmdk"
"[datastore1 (3)] esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker/esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker_1.vmdk"
we computed the wildcard:
"\[datastore1 (3)\] esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker/esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker\*.vmdk"
However the escaping is wrong. We correctly escape the '[' and ']'
characters, but incorrectly escape the '*' character (which is meant
to be a wildcard).
This caused failure to convert when a guest has multiple disks and
nbdkit >= 1.44 is installed.
Reported-by: Ming Xie
Fixes: commit 076727e55f4d4fed246097d3f89ebfe83e3de88f
Fixes: https://issues.redhat.com/browse/RHEL-102734
(cherry picked from commit 5461976e229873a203062848c0de30e70067b3fb)
---
input/input_vddk.ml | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/input/input_vddk.ml b/input/input_vddk.ml
index b70d76fb..39356129 100644
--- a/input/input_vddk.ml
+++ b/input/input_vddk.ml
@@ -446,7 +446,7 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
let wildcard =
match files with
| [] -> assert false (* can't happen, see assert above *)
- | [f] -> f
+ | [f] -> fnmatch_escape f
| files ->
(* Calculate the longest common prefix across all the files,
* then set the wildcard to this.
@@ -454,8 +454,7 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
* XXX Is every file we want to read called *.vmdk?
*)
let prefix = String.longest_common_prefix files in
- prefix ^ "*.vmdk" in
- let wildcard = fnmatch_escape wildcard in
+ fnmatch_escape prefix ^ "*.vmdk" in
let socket = sprintf "%s/in0" dir in
On_exit.unlink socket;

View File

@ -0,0 +1,24 @@
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,76 +0,0 @@
From 5fda965d292bd1b5b62e47d357ddf046dfa007b6 Mon Sep 17 00:00:00 2001
From: Vadim Rozenfeld <vrozenfe@redhat.com>
Date: Thu, 10 Jul 2025 10:12:56 +1000
Subject: [PATCH] Modify configure_pnputil_install script to check pending
reboot status and report PnPUtil execution status
This change adds checks for system reboot status and reports
the result of PnPUtil driver installation attempt.
Related: https://issues.redhat.com/browse/RHEL-100682
Signed-off-by: Vadim Rozenfeld <vrozenfe@redhat.com>
(cherry picked from commit 594b05d6940c8719167d10c0cdfaa253349060ab)
---
convert/convert_windows.ml | 48 +++++++++++++++++++++++++++++++++++---
1 file changed, 45 insertions(+), 3 deletions(-)
diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
index 71e867a5..8f0ff87b 100644
--- a/convert/convert_windows.ml
+++ b/convert/convert_windows.ml
@@ -396,9 +396,51 @@ let convert (g : G.guestfs) source inspect i_firmware
and configure_pnputil_install () =
let fb_script = "@echo off\n\
\n\
- echo Wait for VirtIO drivers to be installed\n\
- %systemroot%\\Sysnative\\PnPutil -i -a \
- %systemroot%\\Drivers\\Virtio\\*.inf" in
+ setlocal EnableDelayedExpansion\n\
+ set inf_dir=%systemroot%\\Drivers\\Virtio\\\n\
+ echo Installing drivers from %inf_dir%\n\
+ set REBOOT_PENDING=0\n\
+ \n\
+ timeout /t 10 /nobreak\n\
+ \n\
+ reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\RebootRequired\"\n\
+ if %errorlevel%==0 (\n\
+ echo Windows Update: Reboot required.\n\
+ set REBOOT_PENDING=1\n\
+ )\n\
+ \n\
+ reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\RebootPending\"\n\
+ if %errorlevel%==0 (\n\
+ echo CBS: Reboot required.\n\
+ set REBOOT_PENDING=1\n\
+ )\n\
+ \n\
+ reg query \"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\" /v PendingFileRenameOperations\n\
+ if %errorlevel%==0 (\n\
+ echo Session Manager: Reboot required.\n\
+ set REBOOT_PENDING=1\n\
+ )\n\
+ \n\
+ if \"%REBOOT_PENDING%\"==\"1\" (\n\
+ echo A reboot is pending.\n\
+ exit /b 249\n\
+ ) else (\n\
+ echo No pending reboot detected.\n\
+ )\n\
+ \n\
+ for %%f in (\"%inf_dir%*.inf\") do (\n\
+ echo Installing: %%~nxf.\n\
+ %systemroot%\\Sysnative\\PnPutil -i -a \"%%f\"\n\
+ if !errorlevel! NEQ 0 (\n\
+ echo Failed to install %%~nxf.\n\
+ exit /b 249\n\
+ ) else (\n\
+ echo Successfully installed %%~nxf.\n\
+ )\n\
+ )\n\
+ echo All drivers installed successfully.\n\
+ exit /b 0\n\
+ )" in
(* Set priority higher than that of "network-configure" firstboot script. *)
Firstboot.add_firstboot_script g inspect.i_root ~prio:2000

View File

@ -0,0 +1,47 @@
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

@ -0,0 +1,120 @@
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,50 +0,0 @@
From 1162c9c21497e24e3388689fd2c58e8dfa043bc4 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sun, 13 Jul 2025 12:29:28 +0100
Subject: [PATCH] Update the common submodule
Pick up this commit from the submodule:
commit b40e534fefb74af32bd496904e44ce9bca1a7b34
Author: Vadim Rozenfeld <vrozenfe@redhat.com>
Date: Thu Jul 10 10:48:04 2025 +1000
Modify the firstboot script to check the scripts
which is required for commit 594b05d694 ("Modify
configure_pnputil_install script to check pending reboot status and
report PnPUtil execution status") to work properly.
Updates: commit 594b05d6940c8719167d10c0cdfaa253349060ab
(cherry picked from commit 3e08788aaebf96d86452dc2c88d610dc0b72d02e)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 0e9caa17..10d2b626:
diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml
index 6aca4c34..5f2642b0 100644
--- a/common/mlcustomize/firstboot.ml
+++ b/common/mlcustomize/firstboot.ml
@@ -305,13 +305,19 @@ if not exist \"%%scripts_done%%\" (
:: Pick the next script to run.
for %%%%f in (\"%%scripts%%\"\\*.bat) do (
echo running \"%%%%f\"
- move \"%%%%f\" \"%%scripts_done%%\"
- pushd \"%%scripts_done%%\"
+ pushd \"%%scripts%%\"
call \"%%%%~nf\"
set elvl=!errorlevel!
echo .... exit code !elvl!
popd
+ if !elvl! NEQ 249 (
+ echo Script succeeded, moving to scripts-done
+ move \"%%%%f\" \"%%scripts_done%%\"
+ ) else (
+ echo Script failed, will retry on next boot
+ )
+
:: Reboot the computer. This is necessary to free any locked
:: files which may prevent later scripts from running.
shutdown /r /t 0 /y

View File

@ -1,27 +0,0 @@
From 90376739e05166de15a94637f64e6b2256f5d90a Mon Sep 17 00:00:00 2001
From: Vadim Rozenfeld <vrozenfe@redhat.com>
Date: Tue, 15 Jul 2025 18:35:16 +1000
Subject: [PATCH] Ignore ERROR_NO_MORE_ITEMS status from PnPUtil.
This status indicates the target device already has a
better or newer driver installed.
Signed-off-by: Vadim Rozenfeld <vrozenfe@redhat.com>
(cherry picked from commit 523aff28975532a4fe715193c28c2ede21741392)
---
convert/convert_windows.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
index 8f0ff87b..2ff9bcfa 100644
--- a/convert/convert_windows.ml
+++ b/convert/convert_windows.ml
@@ -431,7 +431,7 @@ let convert (g : G.guestfs) source inspect i_firmware
for %%f in (\"%inf_dir%*.inf\") do (\n\
echo Installing: %%~nxf.\n\
%systemroot%\\Sysnative\\PnPutil -i -a \"%%f\"\n\
- if !errorlevel! NEQ 0 (\n\
+ if !errorlevel! neq 0 if !errorlevel! neq 259 (\n\
echo Failed to install %%~nxf.\n\
exit /b 249\n\
) else (\n\

View File

@ -0,0 +1,177 @@
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

@ -0,0 +1,131 @@
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,50 +0,0 @@
From 4835c9c91cff55f1411a0413c1469e212124ba03 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Jul 2025 13:10:01 +0100
Subject: [PATCH] v2v: Print the version of libnbd / nbdcopy in debug output
We didn't previously log the version of libnbd or nbdcopy, and nbdcopy
itself won't tell us (because we don't use the nbdcopy --verbose
option). However this information can be useful to know. This commit
enhances the verbose output of virt-v2v to include this.
With current versions of nbdcopy it will look like this:
info: nbdcopy version:
nbdcopy 1.23.4
libnbd 1.23.4
Note the second line is the version of the installed library, which in
some (very unusual, and probably broken) situations might be different
from the version of the nbdcopy binary, which is why both are logged.
libnbd 1.23.5 will soon enhance the output to include the downstream
package version (such as the RPM version) which is even more useful.
In future the output will look like:
info: nbdcopy version:
nbdcopy 1.23.5 (libnbd-1.23.5-1.fc43)
libnbd 1.23.5 (libnbd-1.23.5-1.fc43)
See: https://gitlab.com/nbdkit/libnbd/-/merge_requests/28
(cherry picked from commit a8a0caf54ccaf52db70988494b6f5a397a1af105)
---
v2v/v2v.ml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index d32993d4..c780ab1d 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -469,6 +469,11 @@ read the man page virt-v2v(1).
(* Do the copy. *)
with_open_out (v2vdir // "copy") (fun _ -> ());
+ if verbose () then (
+ eprintf "info: nbdcopy version:\n%!";
+ ignore (Sys.command (sprintf "%s --version >&2" Config.nbdcopy))
+ );
+
(* Get the list of disks and corresponding NBD URIs. *)
let disks =
List.combine input_disks output_disks |>

View File

@ -1,4 +1,4 @@
From 7e0bee433cb357afae186e5821c738c3b2f3bf57 Mon Sep 17 00:00:00 2001
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
@ -11,16 +11,15 @@ Fixes: https://issues.redhat.com/browse/RHEL-144467
Signed-off-by: Martin Necas <mnecas@redhat.com>
(cherry picked from commit 161679267f2100e3604dca3f5bfa0827e9a5de30)
(cherry picked from commit 3ef1078cd3cf5a56dc8023ed113838533d9cea09)
---
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 fe88b903..a0674d88 100644
index 6c021efb..ce02b04a 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -1320,13 +1320,15 @@ let convert (g : G.guestfs) source inspect i_firmware _ keep_serial_console _ =
@@ -1324,13 +1324,15 @@ fi
g inspect.i_root "fix uefi boot" fix_script)
else
cant_fix_uefi ()
@ -37,7 +36,7 @@ index fe88b903..a0674d88 100644
let shim =
String.concat "" [grub_path; "/shim"; arch_suffix; ".efi"] in
let uefi_grub_name =
@@ -1342,14 +1344,14 @@ let convert (g : G.guestfs) source inspect i_firmware _ keep_serial_console _ =
@@ -1346,14 +1348,14 @@ fi
* if not, then just don't clean up and leave the temp loader
* at UEFI fallback path for simplicity
*)

View File

@ -1,101 +0,0 @@
From ef40dab47ba94ca47e6a268853d415d9311aca04 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 9 Jul 2025 09:38:50 +0100
Subject: [PATCH] vddk: Remove -io vddk-noextents option
Commit 191b8cf418 ("input: Add undocumented -io vddk-noextents=true
option") added an option which could be used to insert the nbdkit
noextents filter on top of the VDDK source. This was designed so we
could test in production if this improved performance (which it
didn't).
Since then we've spent more time investigating problems with
QueryAllocatedBlocks and believe we have a better solution in nbdkit.
See:
https://gitlab.com/nbdkit/nbdkit/-/commit/5a882e74cae3dbaa09bf3b942a02f9947b12f6e5
Reverts: commit 191b8cf418076ae3766b134ffa96eee048c7eb9d
---
README | 1 -
input/input_vddk.ml | 35 -----------------------------------
2 files changed, 36 deletions(-)
diff --git a/README b/README
index 49082a96..1cdbef15 100644
--- a/README
+++ b/README
@@ -71,7 +71,6 @@ REQUIREMENTS
+ nbdkit-blocksize-filter
+ nbdkit-cow-filter
+ nbdkit-multi-conn-filter
- + nbdkit-noextents-filter
+ nbdkit-rate-filter
+ nbdkit-retry-filter
diff --git a/input/input_vddk.ml b/input/input_vddk.ml
index 39356129..12f43729 100644
--- a/input/input_vddk.ml
+++ b/input/input_vddk.ml
@@ -58,7 +58,6 @@ All other settings are optional:
-io vddk-file=FILE Override nbdkit-vddk-plugin file= parameter
-io vddk-libdir=LIBDIR VDDK library parent directory
-io vddk-nfchostport=PORT VDDK nfchostport
- -io vddk-noextents=true Avoid slow VDDK QueryAllocatedBlocks API
-io vddk-port=PORT VDDK port
-io vddk-snapshot=SNAPSHOT-MOREF
VDDK snapshot moref
@@ -79,7 +78,6 @@ information on these settings.
"file";
"libdir";
"nfchostport";
- "noextents";
"port";
"snapshot";
"thumbprint";
@@ -208,9 +206,6 @@ information on these settings.
try Some (List.assoc "libdir" io_options) with Not_found -> None in
let nfchostport =
try Some (List.assoc "nfchostport" io_options) with Not_found -> None in
- let noextents =
- try bool_of_string (List.assoc "noextents" io_options)
- with Not_found -> false in
let port =
try Some (List.assoc "port" io_options) with Not_found -> None in
let snapshot =
@@ -318,36 +313,6 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
*)
Nbdkit.add_filter_if_available cmd "retry";
- (* VDDK's QueryAllocatedBlocks API is infamously slow. It appears
- * to block all other requests while it is running. This API is
- * also only called during the copy phase, not during conversion
- * (or if it is, extremely rarely).
- *
- * If fstrim was successful, then trimmed blocks are stored in
- * the COW filter (see below), and so requests for extents stop
- * at that layer. However for areas of the disk that fstrim
- * thinks contain data, we still have to go through to VDDK to
- * fetch extents.
- *
- * We could therefore add nbdkit-noextents-filter here (below COW,
- * above VDDK plugin) which stops extents requests from going
- * to VDDK, which would stop QueryAllocatedBlocks ever being
- * called. In my testing this is a moderate performance win.
- *
- * However ... in the case where fstrim failed, or for filesystems
- * or partitions on the disk that we don't understand, doing this
- * would mean that those are copied completely, as there would be
- * no extent data (nbdcopy will still sparsify them on the target,
- * but we'd have to copy all the bits from VMware). Because
- * here we don't know if this is the case, be conservative and
- * actually don't use this filter.
- *
- * If used, this filter should be close to the plugin and MUST
- * be below the COW filter.
- *)
- if noextents then
- Nbdkit.add_filter_if_available cmd "noextents";
-
(* Split very large requests to avoid out of memory errors on the
* server. Since we're using this filter, also add minblock=512
* although it will make no difference.

View File

@ -1,114 +0,0 @@
From cdb7ffa3a378a1832c92f40aef9e7dd6d8d093ff Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 9 Jul 2025 09:48:35 +0100
Subject: [PATCH] curl, ssh, vddk, file: Add nbdkit-count-filter
nbdkit-count-filter, added in nbdkit 1.45.1, prints a debug message
which just records the number of bytes read, written, trimmed or
zeroed. This is useful for determining how many bytes were actually
copied over the wire or written to disk, and that's a common question
that we currently have no easy way to answer. For more details about
this filter see:
https://gitlab.com/nbdkit/nbdkit/-/commit/3512c3ce9308b4d940119ac6cc87f1baa9afb655
https://libguestfs.org/nbdkit-count-filter.1.html
Use this filter (if available) unconditionally for all inputs that
read over the network, and for the common file-based outputs
(specifically -o kubevirt).
It is only enabled if we're producing debug output (ie. conversion
logs).
---
README | 1 +
input/input_vddk.ml | 7 +++++++
input/nbdkit_curl.ml | 7 +++++++
input/nbdkit_ssh.ml | 7 +++++++
output/output.ml | 2 ++
5 files changed, 24 insertions(+)
diff --git a/README b/README
index 1cdbef15..407869b4 100644
--- a/README
+++ b/README
@@ -69,6 +69,7 @@ REQUIREMENTS
+ nbdkit-vddk-plugin
+ nbdkit-blocksize-filter
+ + nbdkit-count-filter
+ nbdkit-cow-filter
+ nbdkit-multi-conn-filter
+ nbdkit-rate-filter
diff --git a/input/input_vddk.ml b/input/input_vddk.ml
index 12f43729..e88befa2 100644
--- a/input/input_vddk.ml
+++ b/input/input_vddk.ml
@@ -313,6 +313,13 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
*)
Nbdkit.add_filter_if_available cmd "retry";
+ (* Add the count filter if available, to report bytes read.
+ * Since it writes a debug message, only do this if verbose.
+ * This should be close to the plugin so we're reporting what
+ * is read over the wire.
+ *)
+ if verbose () then Nbdkit.add_filter_if_available cmd "count";
+
(* Split very large requests to avoid out of memory errors on the
* server. Since we're using this filter, also add minblock=512
* although it will make no difference.
diff --git a/input/nbdkit_curl.ml b/input/nbdkit_curl.ml
index d8c832b8..f8a0213e 100644
--- a/input/nbdkit_curl.ml
+++ b/input/nbdkit_curl.ml
@@ -58,6 +58,13 @@ let create_curl ?bandwidth ?cookie_script ?cookie_script_renew ?cor
*)
Nbdkit.add_filter_if_available cmd "retry";
+ (* Add the count filter if available, to report bytes read.
+ * Since it writes a debug message, only do this if verbose.
+ * This should be close to the plugin so we're reporting what
+ * is read over the wire.
+ *)
+ if verbose () then Nbdkit.add_filter_if_available cmd "count";
+
(* IMPORTANT! Add the COW filter. It must be furthest away
* except for the rate filter.
*)
diff --git a/input/nbdkit_ssh.ml b/input/nbdkit_ssh.ml
index e6d99ede..4e4c918f 100644
--- a/input/nbdkit_ssh.ml
+++ b/input/nbdkit_ssh.ml
@@ -54,6 +54,13 @@ let create_ssh ?bandwidth ?cor ?(retry=true)
if retry then
Nbdkit.add_filter_if_available cmd "retry";
+ (* Add the count filter if available, to report bytes read.
+ * Since it writes a debug message, only do this if verbose.
+ * This should be close to the plugin so we're reporting what
+ * is read over the wire.
+ *)
+ if verbose () then Nbdkit.add_filter_if_available cmd "count";
+
(* IMPORTANT! Add the COW filter. It must be furthest away
* except for the rate filter.
*)
diff --git a/output/output.ml b/output/output.ml
index b3629372..65325538 100644
--- a/output/output.ml
+++ b/output/output.ml
@@ -98,6 +98,7 @@ let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false)
let cmd = Nbdkit.create "file" in
Nbdkit.add_arg cmd "file" filename;
Nbdkit.add_arg cmd "cache" "none";
+ if verbose () then Nbdkit.add_filter_if_available cmd "count";
let _, pid = Nbdkit.run_unix socket cmd in
pid
@@ -197,6 +198,7 @@ let create_local_output_disks dir
let cmd = Nbdkit.create "file" in
Nbdkit.add_arg cmd "dir" output_storage;
Nbdkit.add_arg cmd "cache" "none";
+ 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 a5fe9fd47c3695c021dc7479bdce18aa59f9d068 Mon Sep 17 00:00:00 2001
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`
@ -19,7 +19,6 @@ Fixes: https://issues.redhat.com/browse/RHEL-133729
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit f13e85f9ce3bb51f65c0afbaae009b5a3e6af9c7)
(cherry picked from commit c532b2c1d14b22b540cced337ad26473aa5b6648)
---
input/vCenter.ml | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

View File

@ -0,0 +1,112 @@
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,233 +0,0 @@
From 71d68738920971f0216cfe77f6873a518369045f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 8 Jul 2025 10:40:48 +0100
Subject: [PATCH] -o kubevirt: Add -oo disk to allow disk names to be
overridden
Fixes: https://issues.redhat.com/browse/RHEL-101599
---
docs/virt-v2v.pod | 15 +++++++--
output/output_kubevirt.ml | 58 ++++++++++++++++++++++++++------
tests/Makefile.am | 2 ++
tests/test-o-kubevirt-oo-disk.sh | 52 ++++++++++++++++++++++++++++
4 files changed, 115 insertions(+), 12 deletions(-)
create mode 100755 tests/test-o-kubevirt-oo-disk.sh
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 3eefe404..5020d179 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -466,8 +466,9 @@ Set the output method to I<kubevirt>. B<Note the way this mode works
is experimental and will change in future.>
In this mode, the converted guest is written to a local directory
-specified by I<-os /dir> (the directory must exist). The converted
-guests disks are written to:
+specified by I<-os /dir> (the directory must exist).
+
+By default the converted guests disks are written to:
/dir/name-sda
/dir/name-sdb
@@ -479,6 +480,8 @@ and guest metadata is created in the associated YAML file:
where C<name> is the guest name.
+You can override the disk paths by using I<-oo disk=...> option(s).
+
=item B<-o> B<libvirt>
Set the output method to I<libvirt>. This is the default.
@@ -600,6 +603,14 @@ For outputs which support qcow2 format (I<-of qcow2>), this writes a
compressed qcow2 file. It is the equivalent to the I<-c> option of
L<qemu-img(1)>.
+=item B<-oo disk=>DISK
+
+For I<-o kubevirt> this overrides the path to each output disk,
+instead of using the default which is C<DISK-sda> etc in the output
+storage (I<-os>) path. If you use this option at all, you must repeat
+it once for each guest disk. If you don't use it, then the default
+method of putting disks in the output storage path is used.
+
=item B<-oo guest-id=>C<ID>
For I<-o openstack> (L<virt-v2v-output-openstack(1)>) only, set a guest ID
diff --git a/output/output_kubevirt.ml b/output/output_kubevirt.ml
index 76ecd39d..eae9c049 100644
--- a/output/output_kubevirt.ml
+++ b/output/output_kubevirt.ml
@@ -35,7 +35,8 @@ let rfc1123_re =
"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"
module Kubevirt = struct
- type poptions = bool * output_allocation * string * string * string
+ type poptions =
+ bool * string list option * output_allocation * string * string * string
type t = unit
@@ -49,15 +50,18 @@ module Kubevirt = struct
printf (f_"Output options that can be used with -o kubevirt:
-oo compressed Compress the output file (used only with -of qcow2)
+ -oo disk=disk1 Specify filename of output disk (if used, must be
+ given once for each disk, else -os path is used)
")
-
let parse_options options source =
let compressed = ref false in
+ let disks = ref [] in
List.iter (
function
| "compressed", "" -> compressed := true
| "compressed", v -> compressed := bool_of_string v
+ | "disk", v -> List.push_back disks v
| k, _ ->
error (f_"-o kubevirt: unknown output option -oo %s") k
) options.output_options;
@@ -84,23 +88,57 @@ module Kubevirt = struct
end with an alphanumeric character. Rerun virt-v2v with \
the '-on name' option to rename it.");
- !compressed, options.output_alloc, options.output_format,
+ let disks = match !disks with [] -> None | disks -> Some disks in
+
+ !compressed, disks,
+ options.output_alloc, options.output_format,
output_name, output_storage
let setup dir options source input_disks =
- let compressed, output_alloc, output_format, output_name, output_storage =
- options in
+ let compressed, disks,
+ output_alloc, output_format, output_name, output_storage = options in
let uris =
- create_local_output_disks dir ~compressed output_alloc output_format
- output_name output_storage input_disks in
+ match disks with
+ | None ->
+ create_local_output_disks dir ~compressed
+ output_alloc output_format output_name output_storage input_disks
+ | Some disks ->
+ (* -oo disk specified, so create the disks by hand. *)
+ let nr_input_disks = List.length input_disks
+ and nr_output_disks = List.length disks in
+ if nr_input_disks <> nr_output_disks then
+ error (f_"incorrect number of '-oo disk' parameters. This guest \
+ has %d disks, but the parameter was used %d times.")
+ nr_input_disks nr_output_disks;
+
+ let input_sizes = get_disk_sizes input_disks in
+ List.mapi (
+ fun i (disk, size) ->
+ let socket = sprintf "%s/out%d" dir i in
+ On_exit.unlink socket;
+
+ output_to_local_file ~compressed
+ output_alloc output_format disk size socket;
+
+ NBD_URI.Unix (socket, None)
+ ) (List.combine disks input_sizes)
+ in
+
(), uris
let finalize dir options () output_disks source inspect target_meta =
- let _, output_alloc, output_format, output_name, output_storage = options in
+ let _, disks,
+ output_alloc, output_format, output_name, output_storage = options in
- let doc = create_kubevirt_yaml source inspect target_meta
- (disk_path output_storage output_name)
+ (* This function will return the disk path for the i'th disk. *)
+ let disk_path =
+ match disks with
+ | None -> Output.disk_path output_storage output_name
+ | Some disks -> List.nth disks
+ in
+
+ let doc = create_kubevirt_yaml source inspect target_meta disk_path
output_format output_name in
let file = output_storage // output_name ^ ".yaml" in
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 62237092..3a8bab3c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -95,6 +95,7 @@ TESTS = \
test-networks-and-bridges.sh \
test-o-glance.sh \
test-o-kubevirt-fedora.sh \
+ test-o-kubevirt-oo-disk.sh \
test-o-kubevirt-windows.sh \
test-o-libvirt.sh \
test-o-local-qcow2-compressed.sh \
@@ -288,6 +289,7 @@ EXTRA_DIST += \
test-o-glance.sh \
test-o-kubevirt-fedora.sh \
test-o-kubevirt-fedora.yaml.expected \
+ test-o-kubevirt-oo-disk.sh \
test-o-kubevirt-windows.sh \
test-o-kubevirt-windows.yaml.expected \
test-o-libvirt.sh \
diff --git a/tests/test-o-kubevirt-oo-disk.sh b/tests/test-o-kubevirt-oo-disk.sh
new file mode 100755
index 00000000..e1e6fd61
--- /dev/null
+++ b/tests/test-o-kubevirt-oo-disk.sh
@@ -0,0 +1,52 @@
+#!/bin/bash -
+# libguestfs virt-v2v test script
+# Copyright (C) 2018-2025 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 -o kubevirt + -oo disk option.
+
+set -e
+set -x
+
+source ./functions.sh
+set -e
+set -x
+
+skip_if_skipped
+requires test -f ../test-data/phony-guests/fedora.img
+
+libvirt_uri="test://$abs_top_builddir/test-data/phony-guests/guests.xml"
+fedora=../test-data/phony-guests/fedora.img
+
+d=test-o-kubevirt-oo-disk.d
+rm -rf $d
+cleanup_fn rm -r $d
+mkdir $d
+
+# Run virt-v2v -o kubevirt.
+$VG virt-v2v --debug-gc \
+ -i libvirt -ic "$libvirt_uri" fedora \
+ -o kubevirt -oo disk=$d/disk.img -os $d
+
+ls -l $d
+
+cat $d/fedora.yaml
+
+# Check the disk was created.
+test -f $d/disk.img
+
+# Check the default path was _not_ created.
+! test -f $d/fedora-sda

View File

@ -0,0 +1,36 @@
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,141 +0,0 @@
From ab8623d45801d50e0d9450033ba74a31fdb872fc Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 8 Jul 2025 11:08:08 +0100
Subject: [PATCH] output: Add optional ?create parameter
This parameter of Output.create_local_output_disks and
Output.output_to_local_file allows the default creation of disks to be
skipped. It defaults to true (ie. create them) which is the normal
behaviour.
This allows output modes to implement the '-oo create=false' option,
although none do so far.
---
output/output.ml | 61 ++++++++++++++++++++++++++---------------------
output/output.mli | 5 +++-
2 files changed, 38 insertions(+), 28 deletions(-)
diff --git a/output/output.ml b/output/output.ml
index 65325538..15cb50db 100644
--- a/output/output.ml
+++ b/output/output.ml
@@ -66,7 +66,9 @@ let error_if_disk_count_gt input_disks n =
type on_exit_kill = Kill | KillAndWait
-let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false)
+let output_to_local_file ?(changeuid = fun f -> f ())
+ ?(compressed = false)
+ ?(create = true)
?(on_exit_kill = Kill)
output_alloc output_format filename size socket =
(* Check nbdkit is installed and has the required plugin. *)
@@ -83,13 +85,15 @@ let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false)
is a local qcow2-format file, i.e. -of qcow2")
);
- let g = open_guestfs () in
- let preallocation =
- match output_alloc with
- | Preallocated -> Some "full"
- | Sparse -> None in
- changeuid (
- fun () -> g#disk_create ?preallocation filename output_format size
+ if create then (
+ let g = open_guestfs () in
+ let preallocation =
+ match output_alloc with
+ | Preallocated -> Some "full"
+ | Sparse -> None in
+ changeuid (
+ fun () -> g#disk_create ?preallocation filename output_format size
+ )
);
let pid =
@@ -151,6 +155,7 @@ let disk_path os name i =
let create_local_output_disks dir
?(compressed = false)
+ ?(create = true)
output_alloc output_format output_name output_storage
input_disks =
let input_sizes = get_disk_sizes input_disks in
@@ -171,25 +176,27 @@ let create_local_output_disks dir
error (f_"nbdkit-file-plugin is not installed or not working");
(* We still have to create the output disks. *)
- let g = open_guestfs () in
- let preallocation =
- match output_alloc with
- | Preallocated -> Some "full"
- | Sparse -> None in
- List.iter (
- fun (size, filename) ->
- g#disk_create ?preallocation filename output_format size;
+ if create then (
+ let g = open_guestfs () in
+ let preallocation =
+ match output_alloc with
+ | Preallocated -> Some "full"
+ | Sparse -> None in
+ List.iter (
+ fun (size, filename) ->
+ g#disk_create ?preallocation filename output_format size;
- (* We've had issues with there not being enough space to write
- * the disk image. Run df on the output filename. df follows
- * symlinks and reports the space on the filesystem. But don't
- * fail here if df cannot be run.
- *)
- if verbose () then (
- let cmd = sprintf "df %s 1>&2" (quote filename) in
- ignore (Sys.command cmd)
- )
- ) (List.combine input_sizes output_disk_names);
+ (* We've had issues with there not being enough space to write
+ * the disk image. Run df on the output filename. df follows
+ * symlinks and reports the space on the filesystem. But don't
+ * fail here if df cannot be run.
+ *)
+ if verbose () then (
+ let cmd = sprintf "df %s 1>&2" (quote filename) in
+ ignore (Sys.command cmd)
+ )
+ ) (List.combine input_sizes output_disk_names)
+ );
let socket = sprintf "%s/out0" dir in
On_exit.unlink socket;
@@ -220,7 +227,7 @@ let create_local_output_disks dir
On_exit.unlink socket;
(* Create the actual output disk. *)
- output_to_local_file ~compressed output_alloc output_format
+ output_to_local_file ~compressed ~create output_alloc output_format
outdisk size socket;
NBD_URI.Unix (socket, None)
diff --git a/output/output.mli b/output/output.mli
index 51bdde06..63a1c3f6 100644
--- a/output/output.mli
+++ b/output/output.mli
@@ -84,6 +84,7 @@ val error_if_disk_count_gt : NBD_URI.t list -> int -> unit
val create_local_output_disks : string ->
?compressed:bool ->
+ ?create:bool ->
Types.output_allocation ->
string -> string -> string ->
NBD_URI.t list ->
@@ -98,7 +99,9 @@ val create_local_output_disks : string ->
type on_exit_kill = Kill | KillAndWait
val output_to_local_file : ?changeuid:((unit -> unit) -> unit) ->
- ?compressed:bool -> ?on_exit_kill:on_exit_kill ->
+ ?compressed:bool ->
+ ?create:bool ->
+ ?on_exit_kill:on_exit_kill ->
Types.output_allocation ->
string -> string -> int64 -> string ->
unit

View File

@ -0,0 +1,75 @@
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

View File

@ -1,119 +0,0 @@
From b0ac37f6c9f6ab8da44e631e9cb6af5649548634 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 8 Jul 2025 11:15:56 +0100
Subject: [PATCH] -o kubevirt: Add -oo create=false to avoid disk creation
Indicate that an external process will create the disks, so normal
creation of disks by virt-v2v should be skipped.
Testing
-------
I couldn't think of a way to add a test this since g#disk_create
(implemented in libguestfs.git:lib/create.c) will open(O_TRUNC) +
truncate(2) the existing disk, so the inode will remain the same.
Instead I tested it by hand by not creating the disk and observing the
error from nbdkit:
nbdkit: error: realpath: /var/tmp/disk.img: No such file or directory
virt-v2v: error: nbdkit did not start up. There may be errors printed by
nbdkit above.
Fixes: https://issues.redhat.com/browse/RHEL-101599
---
docs/virt-v2v.pod | 5 +++++
output/output_kubevirt.ml | 17 +++++++++++------
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 5020d179..e228fb33 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -603,6 +603,11 @@ For outputs which support qcow2 format (I<-of qcow2>), this writes a
compressed qcow2 file. It is the equivalent to the I<-c> option of
L<qemu-img(1)>.
+=item B<-oo create=false>
+
+For I<-o kubevirt>, indicate that another management process will
+create the output disks, so do not (re-)create them in virt-v2v.
+
=item B<-oo disk=>DISK
For I<-o kubevirt> this overrides the path to each output disk,
diff --git a/output/output_kubevirt.ml b/output/output_kubevirt.ml
index eae9c049..8a5ab56d 100644
--- a/output/output_kubevirt.ml
+++ b/output/output_kubevirt.ml
@@ -36,7 +36,8 @@ let rfc1123_re =
module Kubevirt = struct
type poptions =
- bool * string list option * output_allocation * string * string * string
+ bool * bool * string list option *
+ output_allocation * string * string * string
type t = unit
@@ -50,17 +51,21 @@ module Kubevirt = struct
printf (f_"Output options that can be used with -o kubevirt:
-oo compressed Compress the output file (used only with -of qcow2)
+ -oo create=false Do not create the output disks
-oo disk=disk1 Specify filename of output disk (if used, must be
given once for each disk, else -os path is used)
")
let parse_options options source =
let compressed = ref false in
+ let create = ref true in
let disks = ref [] in
List.iter (
function
| "compressed", "" -> compressed := true
| "compressed", v -> compressed := bool_of_string v
+ | "create", "" -> create := true
+ | "create", v -> create := bool_of_string v
| "disk", v -> List.push_back disks v
| k, _ ->
error (f_"-o kubevirt: unknown output option -oo %s") k
@@ -90,18 +95,18 @@ module Kubevirt = struct
let disks = match !disks with [] -> None | disks -> Some disks in
- !compressed, disks,
+ !compressed, !create, disks,
options.output_alloc, options.output_format,
output_name, output_storage
let setup dir options source input_disks =
- let compressed, disks,
+ let compressed, create, disks,
output_alloc, output_format, output_name, output_storage = options in
let uris =
match disks with
| None ->
- create_local_output_disks dir ~compressed
+ create_local_output_disks dir ~compressed ~create
output_alloc output_format output_name output_storage input_disks
| Some disks ->
(* -oo disk specified, so create the disks by hand. *)
@@ -118,7 +123,7 @@ module Kubevirt = struct
let socket = sprintf "%s/out%d" dir i in
On_exit.unlink socket;
- output_to_local_file ~compressed
+ output_to_local_file ~compressed ~create
output_alloc output_format disk size socket;
NBD_URI.Unix (socket, None)
@@ -128,7 +133,7 @@ module Kubevirt = struct
(), uris
let finalize dir options () output_disks source inspect target_meta =
- let _, disks,
+ let _, _, disks,
output_alloc, output_format, output_name, output_storage = options in
(* This function will return the disk path for the i'th disk. *)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
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

@ -0,0 +1,30 @@
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

@ -0,0 +1,54 @@
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

@ -0,0 +1,85 @@
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

@ -0,0 +1,71 @@
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,543 +0,0 @@
From ef4fb3f73251ee72eb2c2c2e1f20a4392dc8a299 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 8 Jul 2024 09:35:54 +0100
Subject: [PATCH] RHEL: Remove input from Xen
Originally this bug was to remove input from RHEL 5 Xen only. This
change actually removes all conversions from Xen as in RHEL 9 we only
supported RHEL 5 Xen.
Fixes: https://issues.redhat.com/browse/RHEL-37687
---
docs/Makefile.am | 14 ----
docs/virt-v2v-input-xen.pod | 154 ------------------------------------
docs/virt-v2v.pod | 50 ++----------
input/Makefile.am | 2 -
input/input_xen_ssh.ml | 136 -------------------------------
input/input_xen_ssh.mli | 21 -----
input/select_input.ml | 4 -
v2v/v2v.ml | 1 -
8 files changed, 5 insertions(+), 377 deletions(-)
delete mode 100644 docs/virt-v2v-input-xen.pod
delete mode 100644 input/input_xen_ssh.ml
delete mode 100644 input/input_xen_ssh.mli
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 14b0b074..aa899304 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -23,7 +23,6 @@ EXTRA_DIST = \
virt-v2v-hacking.pod \
virt-v2v-in-place.pod \
virt-v2v-input-vmware.pod \
- virt-v2v-input-xen.pod \
virt-v2v-inspector.pod \
virt-v2v-open.pod \
virt-v2v-output-local.pod \
@@ -45,7 +44,6 @@ man_MANS = \
virt-v2v-hacking.1 \
virt-v2v-in-place.1 \
virt-v2v-input-vmware.1 \
- virt-v2v-input-xen.1 \
virt-v2v-inspector.1 \
virt-v2v-open.1 \
virt-v2v-output-local.1 \
@@ -64,7 +62,6 @@ noinst_DATA = \
$(top_builddir)/website/virt-v2v-hacking.1.html \
$(top_builddir)/website/virt-v2v-in-place.1.html \
$(top_builddir)/website/virt-v2v-input-vmware.1.html \
- $(top_builddir)/website/virt-v2v-input-xen.1.html \
$(top_builddir)/website/virt-v2v-inspector.1.html \
$(top_builddir)/website/virt-v2v-open.1.html \
$(top_builddir)/website/virt-v2v-output-local.1.html \
@@ -125,17 +122,6 @@ stamp-virt-v2v-input-vmware.pod: virt-v2v-input-vmware.pod
$<
touch $@
-virt-v2v-input-xen.1 $(top_builddir)/website/virt-v2v-input-xen.1.html: stamp-virt-v2v-input-xen.pod
-
-stamp-virt-v2v-input-xen.pod: virt-v2v-input-xen.pod
- $(PODWRAPPER) \
- --man virt-v2v-input-xen.1 \
- --html $(top_builddir)/website/virt-v2v-input-xen.1.html \
- --license GPLv2+ \
- --warning safe \
- $<
- touch $@
-
virt-v2v-inspector.1 $(top_builddir)/website/virt-v2v-inspector.1.html: stamp-virt-v2v-inspector.pod
stamp-virt-v2v-inspector.pod: virt-v2v-inspector.pod
diff --git a/docs/virt-v2v-input-xen.pod b/docs/virt-v2v-input-xen.pod
deleted file mode 100644
index 0417e89f..00000000
--- a/docs/virt-v2v-input-xen.pod
+++ /dev/null
@@ -1,154 +0,0 @@
-=head1 NAME
-
-virt-v2v-input-xen - Using virt-v2v to convert guests from Xen
-
-=head1 SYNOPSIS
-
- virt-v2v -ic 'xen+ssh://root@xen.example.com'
- -ip passwordfile
- GUEST_NAME [-o* options]
-
-=head1 DESCRIPTION
-
-This page documents how to use L<virt-v2v(1)> to convert guests from
-RHEL 5 Xen, or SLES and OpenSUSE Xen hosts.
-
-=head1 INPUT FROM XEN
-
-=head2 SSH authentication
-
-You can use SSH password authentication, by supplying the name of a
-file containing the password to the I<-ip> option (note this option
-does I<not> take the password directly). You may need to adjust
-F</etc/ssh/sshd_config> on the Xen server to set
-C<PasswordAuthentication yes>.
-
-If you are not using password authentication, an alternative is to use
-ssh-agent, and add your ssh public key to
-F</root/.ssh/authorized_keys> (on the Xen host). After doing this,
-you should check that passwordless access works from the virt-v2v
-server to the Xen host. For example:
-
- $ ssh root@xen.example.com
- [ logs straight into the shell, no password is requested ]
-
-Note that support for non-interactive authentication via the I<-ip>
-option is incomplete. Some operations remain that still require the
-user to enter the password manually. Therefore ssh-agent is recommended
-over the I<-ip> option. See L<https://bugzilla.redhat.com/1854275>.
-
-With some modern ssh implementations, legacy crypto algorithms required
-to interoperate with RHEL 5 sshd are disabled. To enable them, you may
-need to add the following C<Host> stanza to your F<~/.ssh/config>:
-
- Host xen.example.com
- KexAlgorithms +diffie-hellman-group14-sha1
- MACs +hmac-sha1
- HostKeyAlgorithms +ssh-rsa
- PubkeyAcceptedKeyTypes +ssh-rsa
- PubkeyAcceptedAlgorithms +ssh-rsa
-
-(C<PubkeyAcceptedKeyTypes> and C<PubkeyAcceptedAlgorithms> have
-identical meaning; the former is the old option name, the latter is the
-new one. Virt-v2v uses both C<libssh> and C<ssh> when converting a guest
-from Xen, and on some operating systems, C<libssh> and C<ssh> may not
-both accept the same option variant.)
-
-When connecting to RHEL 5 sshd from RHEL 9, the SHA1 algorithm's use in
-signatures has to be re-enabled at the OpenSSL level, in addition to the
-above SSH configuration. Create a file called F<$HOME/openssl-sha1.cnf>
-with the following contents:
-
- .include /etc/ssl/openssl.cnf
- [openssl_init]
- alg_section = evp_properties
- [evp_properties]
- rh-allow-sha1-signatures = yes
-
-and export the following variable into the environment of the
-C<virt-v2v> process:
-
- OPENSSL_CONF=$HOME/openssl-sha1.cnf
-
-Note that the C<OPENSSL_CONF> environment variable will only take effect
-if the libvirt client library used by virt-v2v is at least version
-8.6.0.
-
-=head2 Test libvirt connection to remote Xen host
-
-Use the L<virsh(1)> command to list the guests on the remote Xen host:
-
- $ virsh -c xen+ssh://root@xen.example.com list --all
- Id Name State
- ----------------------------------------------------
- 0 Domain-0 running
- - rhel49-x86_64-pv shut off
-
-You should also try dumping the metadata from any guest on your
-server, like this:
-
- $ virsh -c xen+ssh://root@xen.example.com dumpxml rhel49-x86_64-pv
- <domain type='xen'>
- <name>rhel49-x86_64-pv</name>
- [...]
- </domain>
-
-B<If the above commands do not work, then virt-v2v is not going to
-work either>. Fix your libvirt configuration or the remote server
-before continuing.
-
-B<If the guest disks are located on a host block device>, then the
-conversion will fail. See L</Xen or ssh conversions from block devices>
-below for a workaround.
-
-=head2 Importing a guest
-
-To import a particular guest from a Xen server, do:
-
- $ virt-v2v -ic 'xen+ssh://root@xen.example.com' \
- rhel49-x86_64-pv \
- -o local -os /var/tmp
-
-where C<rhel49-x86_64-pv> is the name of the guest (which must be shut
-down).
-
-In this case the output flags are set to write the converted guest to
-a temporary directory as this is just an example, but you can also
-write to libvirt or any other supported target.
-
-=head2 Xen or ssh conversions from block devices
-
-Currently virt-v2v cannot directly access a Xen guest (or any guest
-located remotely over ssh) if that guests disks are located on host
-block devices.
-
-To tell if a Xen guest uses host block devices, look at the guest XML.
-You will see:
-
- <disk type='block' device='disk'>
- ...
- <source dev='/dev/VG/guest'/>
-
-where C<type='block'>, C<source dev=> and C</dev/...> are all
-indications that the disk is located on a host block device.
-
-This happens because the qemu ssh block driver that we use to access
-remote disks uses the ssh sftp protocol, and this protocol cannot
-correctly detect the size of host block devices.
-
-The workaround is to copy the block device from the remote Xen
-server to a regular local file, copy the libvirt guest XML,
-adjust the C<disk> element to point to the local file, and use
-C<-i libvirtxml> mode instead.
-
-=head1 SEE ALSO
-
-L<virt-v2v(1)>.
-
-=head1 AUTHOR
-
-Richard W.M. Jones
-
-=head1 COPYRIGHT
-
-Copyright (C) 2009-2025 Red Hat Inc.
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 35886561..8e31fd0b 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -12,7 +12,7 @@ virt-v2v - Convert a guest to use KVM
=head1 DESCRIPTION
Virt-v2v converts a single guest from a foreign hypervisor to run on
-KVM. It can read Linux and Windows guests running on VMware, Xen,
+KVM. It can read Linux and Windows guests running on VMware,
Hyper-V and some other hypervisors, and convert them to KVM managed by
libvirt, OpenStack, oVirt, or several other targets. It can modify
the guest to make it bootable on KVM and install virtio drivers so it
@@ -59,8 +59,6 @@ management systems, guests.
L<virt-v2v-input-vmware(1)> — Input from VMware.
-L<virt-v2v-input-xen(1)> — Input from Xen.
-
L<virt-v2v-output-local(1)> — Output to local files or local libvirt.
L<virt-v2v-output-ovirt(1)> — Output to oVirt
@@ -189,10 +187,6 @@ This is only supported for:
=item *
-L<input from Xen|virt-v2v-input-xen(1)>
-
-=item *
-
L<input from VMware VMX|virt-v2v-input-vmware(1)/INPUT FROM VMWARE VMX>
when using the SSH transport method
@@ -304,12 +298,10 @@ hypervisor. See L<virt-v2v-input-vmware(1)>.
Specify a libvirt connection URI to use when reading the guest. This
is only used when S<I<-i libvirt>>.
-Only local libvirt connections, VMware vCenter connections, or RHEL 5
-Xen remote connections can be used. Other remote libvirt connections
-will not work in general.
+Only local libvirt connections or VMware vCenter connections.
+Other remote libvirt connections will not work in general.
-See also L<virt-v2v-input-vmware(1)>,
-L<virt-v2v-input-xen(1)>.
+See also L<virt-v2v-input-vmware(1)>.
=item B<-if> format
@@ -883,7 +875,7 @@ bandwidth. Virt-v2v should be able to copy guest data at gigabit
ethernet speeds or greater.
Ensure that the network connections between servers (conversion
-server, NFS server, vCenter, Xen) are as fast and as low latency as
+server, NFS server, vCenter) are as fast and as low latency as
possible.
=head2 Disk space
@@ -1182,38 +1174,6 @@ changes to the Windows Registry and filesystem.
=head1 NOTES
-=head2 Xen paravirtualized guests
-
-Older versions of virt-v2v could turn a Xen paravirtualized (PV) guest
-into a KVM guest by installing a new kernel. This version of virt-v2v
-does I<not> attempt to install any new kernels. Instead it will give
-you an error if there are I<only> Xen PV kernels available.
-
-Therefore before conversion you should check that a regular kernel is
-installed. For some older Linux distributions, this means installing
-a kernel from the table below:
-
- RHEL 4 i686 with > 10GB of RAM: install 'kernel-hugemem'
- i686 SMP: install 'kernel-smp'
- other i686: install 'kernel'
- x86-64 SMP with > 8 CPUs: install 'kernel-largesmp'
- x86-64 SMP: install 'kernel-smp'
- other x86-64: install 'kernel'
-
- RHEL 5 i686: install 'kernel-PAE'
- x86-64: install 'kernel'
-
- SLES 10 i586 with > 10GB of RAM: install 'kernel-bigsmp'
- i586 SMP: install 'kernel-smp'
- other i586: install 'kernel-default'
- x86-64 SMP: install 'kernel-smp'
- other x86-64: install 'kernel-default'
-
- SLES 11+ i586: install 'kernel-pae'
- x86-64: install 'kernel-default'
-
- Windows (Does not apply, as there is no Xen PV Windows kernel)
-
=head2 Enabling virtio
"Virtio" is the name for a set of drivers which make disk (block
diff --git a/input/Makefile.am b/input/Makefile.am
index d5e77f76..98ea5223 100644
--- a/input/Makefile.am
+++ b/input/Makefile.am
@@ -29,7 +29,6 @@ SOURCES_MLI = \
input_vcenter_https.mli \
input_vddk.mli \
input_vmx.mli \
- input_xen_ssh.mli \
name_from_disk.mli \
nbdkit_curl.mli \
nbdkit_ssh.mli \
@@ -60,7 +59,6 @@ SOURCES_ML = \
input_vcenter_https.ml \
input_vddk.ml \
input_vmx.ml \
- input_xen_ssh.ml \
select_input.ml
# We pretend that we're building a C library. automake handles the
diff --git a/input/input_xen_ssh.ml b/input/input_xen_ssh.ml
deleted file mode 100644
index 45864cfe..00000000
--- a/input/input_xen_ssh.ml
+++ /dev/null
@@ -1,136 +0,0 @@
-(* helper-v2v-input
- * Copyright (C) 2009-2025 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.
- *)
-
-open Printf
-open Unix
-
-open Std_utils
-open Tools_utils
-open Common_gettext.Gettext
-
-open Types
-open Utils
-
-open Parse_libvirt_xml
-open Input
-
-module XenSSH = struct
- let to_string options args =
- let xs = args in
- let xs =
- match options.input_conn with
- | Some ic -> ("-ic " ^ ic) :: xs
- | None -> xs in
- let xs = "-i libvirt" :: xs in
- String.concat " " xs
-
- let query_input_options () =
- printf (f_"No input options can be used in this mode.\n")
-
- let setup dir options args =
- if options.input_options <> [] then
- error (f_"no -io (input options) are allowed here");
-
- if not options.read_only then
- error (f_"in-place mode does not work with Xen over SSH source");
-
- (* Get the guest name. *)
- let guest =
- match args with
- | [arg] -> arg
- | _ ->
- error (f_"-i libvirt: expecting a libvirt guest name \
- on the command line") in
-
- (* -ic must be set. *)
- let input_conn =
- match options.input_conn with
- | Some ic -> ic
- | None ->
- error (f_"-i libvirt: expecting -ic parameter for \
- Xen over SSH connection") in
-
- let uri =
- try Xml.parse_uri input_conn
- with Invalid_argument msg ->
- error (f_"could not parse '-ic %s'. Original error message was: %s")
- input_conn msg in
-
- (* Connect to the hypervisor. *)
- let conn =
- let auth = Libvirt_utils.auth_for_password_file
- ?password_file:options.input_password () in
- Libvirt.Connect.connect_auth ~name:input_conn auth in
-
- (* Parse the libvirt XML. *)
- let source, disks, _ = parse_libvirt_domain conn guest in
-
- let server =
- match uri.Xml.uri_server with
- | Some server -> server
- | None ->
- error (f_"-ic %s URL does not contain a host name field")
- input_conn in
-
- let port =
- match uri.uri_port with
- | 0 | 22 -> None
- | i -> Some (string_of_int i) in
-
- let user = uri.uri_user in
-
- let password =
- match options.input_password with
- | None -> None
- | Some ip -> Some (Nbdkit_ssh.PasswordFile ip) in
-
- (* Create an nbdkit instance for each disk. *)
- let uris =
- List.mapi (
- fun i { d_format = format; d_type } ->
- let socket = sprintf "%s/in%d" dir i in
- On_exit.unlink socket;
-
- (match d_type with
- | NBD _ | HTTP _ -> (* These should never happen? *)
- assert false
-
- | BlockDev _ ->
- (* Conversion from a remote block device over SSH isn't
- * supported because OpenSSH sftp server doesn't know how
- * to get the size of a block device. Therefore we disallow
- * this and refer users to the manual.
- *)
- error (f_"input from xen over ssh does not support disks stored \
- on remote block devices. See virt-v2v-input-xen(1) \
- section \"Xen or ssh conversions from block devices\".")
-
- | LocalFile path ->
- let cor = dir // "convert" in
- 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
- On_exit.kill pid
- );
-
- NBD_URI.Unix (socket, None)
- ) disks in
-
- source, uris
-end
diff --git a/input/input_xen_ssh.mli b/input/input_xen_ssh.mli
deleted file mode 100644
index 339309b8..00000000
--- a/input/input_xen_ssh.mli
+++ /dev/null
@@ -1,21 +0,0 @@
-(* virt-v2v
- * Copyright (C) 2009-2025 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.
- *)
-
-(** Input from Xen over SSH *)
-
-module XenSSH : Input.INPUT
diff --git a/input/select_input.ml b/input/select_input.ml
index a5eb1433..bbf0180f 100644
--- a/input/select_input.ml
+++ b/input/select_input.ml
@@ -90,10 +90,6 @@ let select_input ?(allow_remote = true) input_mode input_conn input_transport =
| Some server, Some ("esx"|"gsx"|"vpx"), Some Input.VDDK, true ->
(module Input_vddk.VDDK)
- (* Xen over SSH *)
- | Some server, Some "xen+ssh", _, true ->
- (module Input_xen_ssh.XenSSH)
-
(* Old virt-v2v also supported qemu+ssh://. However I am
* deliberately not supporting this in new virt-v2v. Don't
* use virt-v2v if a guest already runs on KVM.
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index c780ab1d..1811f9e6 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -335,7 +335,6 @@ read the man page virt-v2v(1).
pr "virt-v2v-2.0\n";
pr "libguestfs-rewrite\n";
pr "vcenter-https\n";
- pr "xen-ssh\n";
pr "vddk\n";
pr "colours-option\n";
pr "vdsm-compat-option\n";

View File

@ -0,0 +1,55 @@
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,239 +0,0 @@
From 5c5d4163dfa7cbdd10450d677a85aeaf87e1a14b 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: Remove -o glance
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1977539
---
docs/virt-v2v-output-openstack.pod | 54 ++----------------------------
docs/virt-v2v.pod | 20 -----------
output/output_glance.mli | 2 +-
output/select_output.ml | 5 ---
output/select_output.mli | 1 -
tests/test-o-glance.sh | 3 ++
v2v/v2v.ml | 2 --
7 files changed, 6 insertions(+), 81 deletions(-)
diff --git a/docs/virt-v2v-output-openstack.pod b/docs/virt-v2v-output-openstack.pod
index 9bef76ea..04595816 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
@@ -176,48 +164,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. See
-L</OpenStack: Authentication> above.
-
-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 8e31fd0b..fde60a8c 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -439,14 +439,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<kubevirt>
Set the output method to I<kubevirt>. B<Note the way this mode works
@@ -897,11 +889,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>
@@ -1053,13 +1040,6 @@ See also L</Starting the libvirt system 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 83d67576..7ab1503c 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/output/select_output.ml b/output/select_output.ml
index ab4bfe4d..b1f7d0ab 100644
--- a/output/select_output.ml
+++ b/output/select_output.ml
@@ -21,7 +21,6 @@ open Common_gettext.Gettext
type output_mode =
| Disk
- | Glance
| Kubevirt
| Libvirt
| Null
@@ -33,7 +32,6 @@ type output_mode =
let output_modes = [
Disk;
- Glance;
Kubevirt;
Libvirt;
Null;
@@ -46,7 +44,6 @@ let output_modes = [
let string_of_output_mode = function
| Disk -> "disk"
- | Glance -> "glance"
| Kubevirt -> "kubevirt"
| Libvirt -> "libvirt"
| Null -> "null"
@@ -57,7 +54,6 @@ let string_of_output_mode = function
| VDSM -> "vdsm"
let output_mode_of_string = function
- | "glance" -> Glance
| "kubevirt" -> Kubevirt
| "libvirt" -> Libvirt
| "disk" | "local" -> Disk
@@ -75,7 +71,6 @@ let select_output = function
| Some Disk -> (module Output_disk.Disk)
| Some Null -> (module Output_null.Null)
| Some QEmu -> (module Output_qemu.QEMU)
- | Some Glance -> (module Output_glance.Glance)
| Some Kubevirt -> (module Output_kubevirt.Kubevirt)
| Some Openstack -> (module Output_openstack.Openstack)
| Some OVirt_Upload -> (module Output_ovirt_upload.OVirtUpload)
diff --git a/output/select_output.mli b/output/select_output.mli
index a509a1db..093c9b9a 100644
--- a/output/select_output.mli
+++ b/output/select_output.mli
@@ -18,7 +18,6 @@
type output_mode =
| Disk
- | Glance
| Kubevirt
| Libvirt
| Null
diff --git a/tests/test-o-glance.sh b/tests/test-o-glance.sh
index 9e32d2bf..632579ee 100755
--- a/tests/test-o-glance.sh
+++ b/tests/test-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 1811f9e6..5d3a9dbb 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -267,8 +267,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.

View File

@ -0,0 +1,27 @@
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,4 +1,4 @@
From 2cdab0acc99796d9e885697c6d9e50255bb3956b Mon Sep 17 00:00:00 2001
From 5bb9b83c288b0c4bdac081e123f2fa54c840a6ca 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,22 +19,22 @@ 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 ff82ad54..45d48a95 100644
index e3fd41b8..eb51e9b9 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -53,6 +53,7 @@ let rec convert input_disks options source =
@@ -55,6 +55,7 @@ let rec convert input_disks 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.
let memsize =
match options.memsize with
| None ->
diff --git a/test-data/phony-guests/make-windows-img.sh b/test-data/phony-guests/make-windows-img.sh
index b52d2522..8d036ee6 100755
index 5b3f7912..137bae2f 100755
--- a/test-data/phony-guests/make-windows-img.sh
+++ b/test-data/phony-guests/make-windows-img.sh
@@ -49,6 +49,7 @@ fi
@@ -78,6 +78,7 @@ fi
# Create a disk image.
guestfish <<EOF
@ -43,10 +43,10 @@ index b52d2522..8d036ee6 100755
run
diff --git a/tests/test-block-driver.sh b/tests/test-block-driver.sh
index 595e969c..0b8ac6ea 100755
index 1ea2181e..00aa8b41 100755
--- a/tests/test-block-driver.sh
+++ b/tests/test-block-driver.sh
@@ -100,7 +100,11 @@ check_driver_presence ()
@@ -99,7 +99,11 @@ check_driver_presence ()
local virtio_dir="/Windows/Drivers/VirtIO"
@ -60,10 +60,10 @@ index 595e969c..0b8ac6ea 100755
is-file $virtio_dir/$drv.cat
is-file $virtio_dir/$drv.inf
diff --git a/tests/test-in-place.sh b/tests/test-in-place.sh
index e66d2647..38d05de5 100755
index 0c6432cf..2d17029c 100755
--- a/tests/test-in-place.sh
+++ b/tests/test-in-place.sh
@@ -89,6 +89,12 @@ mktest ()
@@ -88,6 +88,12 @@ mktest ()
:> "$script"
:> "$expected"
@ -76,7 +76,7 @@ index e66d2647..38d05de5 100755
firstboot_dir="/Program Files/Guestfs/Firstboot"
mktest "is-dir \"$firstboot_dir\"" true
mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
@@ -101,7 +107,7 @@ for drv in netkvm vioscsi viostor; do
@@ -100,7 +106,7 @@ for drv in netkvm vioscsi viostor; do
done
done
@ -86,10 +86,10 @@ index e66d2647..38d05de5 100755
# Test the base image remained untouched
diff --git a/tests/test-virtio-win-iso.sh b/tests/test-virtio-win-iso.sh
index ccc42550..cd92db92 100755
index 1ee343fd..0216a39b 100755
--- a/tests/test-virtio-win-iso.sh
+++ b/tests/test-virtio-win-iso.sh
@@ -82,6 +82,12 @@ mktest ()
@@ -80,6 +80,12 @@ mktest ()
:> "$script"
:> "$expected"
@ -102,7 +102,7 @@ index ccc42550..cd92db92 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
@@ -92,5 +98,5 @@ for drv in netkvm vioscsi viostor; do
done
done
@ -110,10 +110,10 @@ index ccc42550..cd92db92 100755
+guestfish --ro -a "$d/windows-sda" < "$script" > "$response"
diff -u "$expected" "$response"
diff --git a/tests/test-windows-conversion.sh b/tests/test-windows-conversion.sh
index bfe04904..eeddcb86 100755
index db688ddf..74f28bbb 100755
--- a/tests/test-windows-conversion.sh
+++ b/tests/test-windows-conversion.sh
@@ -76,6 +76,12 @@ mktest ()
@@ -74,6 +74,12 @@ mktest ()
:> "$script"
:> "$expected"
@ -126,7 +126,7 @@ index bfe04904..eeddcb86 100755
firstboot_dir="/Program Files/Guestfs/Firstboot"
mktest "is-dir \"$firstboot_dir\"" true
mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
@@ -83,7 +89,7 @@ mktest "is-dir \"$firstboot_dir/scripts\"" true
@@ -81,7 +87,7 @@ mktest "is-dir \"$firstboot_dir/scripts\"" true
virtio_dir="/Windows/Drivers/VirtIO"
mktest "ls \"$virtio_dir\"" "$(cat test-windows-conversion-ls.txt)"
@ -136,10 +136,10 @@ index bfe04904..eeddcb86 100755
# We also update the Registry several times, for firstboot, and (ONLY
diff --git a/tests/test-windows-phony.sh b/tests/test-windows-phony.sh
index fa5f6a17..3f5dfe5e 100755
index 22c0fb9e..96420ff9 100755
--- a/tests/test-windows-phony.sh
+++ b/tests/test-windows-phony.sh
@@ -71,6 +71,17 @@ mktest ()
@@ -69,6 +69,17 @@ mktest ()
:> "$script"
:> "$expected"
@ -157,7 +157,7 @@ index fa5f6a17..3f5dfe5e 100755
firstboot_dir="/Program Files/Guestfs/Firstboot"
mktest "is-dir \"$firstboot_dir\"" true
mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
@@ -80,7 +91,7 @@ mktest "ls \"$virtio_dir\"" "$(cat test-phony-$guestname-ls.txt)"
@@ -78,7 +89,7 @@ mktest "ls \"$virtio_dir\"" "$(cat test-phony-$guestname-ls.txt)"
osinfo_name="${guestname%-32}"
mktest "inspect-get-osinfo /dev/sda2" "$osinfo_name"

View File

@ -1,157 +0,0 @@
From 0c2aebab2d1c3cf7a02c16dd6a5af4ae55a69995 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 28 Apr 2023 12:28:19 +0100
Subject: [PATCH] RHEL: Remove --block-driver option
Go back to the old default of always installing virtio-blk drivers in
Windows guests.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2190387
---
docs/virt-v2v-in-place.pod | 10 ----------
docs/virt-v2v.pod | 10 ----------
in-place/in_place.ml | 11 +----------
tests/Makefile.am | 1 -
v2v/v2v.ml | 11 +----------
5 files changed, 2 insertions(+), 41 deletions(-)
diff --git a/docs/virt-v2v-in-place.pod b/docs/virt-v2v-in-place.pod
index 6c02a99c..3d0d1b28 100644
--- a/docs/virt-v2v-in-place.pod
+++ b/docs/virt-v2v-in-place.pod
@@ -72,16 +72,6 @@ Display help.
See I<--network> below.
-=item B<--block-driver> B<virtio-blk>
-
-=item B<--block-driver> B<virtio-scsi>
-
-When choosing a block driver for Windows guests, prefer C<virtio-blk> or
-C<virtio-scsi>. The default is C<virtio-blk>.
-
-Note this has no effect for Linux guests at the moment. That may be
-added in future.
-
=item B<--colors>
=item B<--colours>
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index fde60a8c..0e68de10 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -212,16 +212,6 @@ The options are silently ignored for other input methods.
See I<--network> below.
-=item B<--block-driver> B<virtio-blk>
-
-=item B<--block-driver> B<virtio-scsi>
-
-When choosing a block driver for Windows guests, prefer C<virtio-blk> or
-C<virtio-scsi>. The default is C<virtio-blk>.
-
-Note this has no effect for Linux guests at the moment. That may be
-added in future.
-
=item B<--colors>
=item B<--colours>
diff --git a/in-place/in_place.ml b/in-place/in_place.ml
index 604a662d..a91ee39d 100644
--- a/in-place/in_place.ml
+++ b/in-place/in_place.ml
@@ -49,7 +49,6 @@ let rec main () =
let bandwidth = ref None in
let bandwidth_file = ref None in
- let block_driver = ref None in
let input_conn = ref None in
let input_format = ref None in
let input_password = ref None in
@@ -162,8 +161,6 @@ let rec main () =
let argspec = [
[ S 'b'; L"bridge" ], Getopt.String ("in:out", add_bridge),
s_"Map bridge in to out";
- [ L"block-driver" ], Getopt.String ("driver", set_string_option_once "--block-driver" block_driver),
- s_"Prefer 'virtio-blk' or 'virtio-scsi'";
[ S 'i' ], Getopt.String (input_modes, set_input_mode),
s_"Set input mode (default: libvirt)";
[ M"ic" ], Getopt.String ("uri", set_string_option_once "-ic" input_conn),
@@ -230,12 +227,6 @@ read the man page virt-v2v-in-place(1).
(* Dereference the arguments. *)
let args = List.rev !args in
- let block_driver =
- match !block_driver with
- | None | Some "virtio-blk" -> Virtio_blk
- | Some "virtio-scsi" -> Virtio_SCSI
- | Some driver ->
- error (f_"unknown block driver --block-driver %s") driver in
let customize_ops = get_customize_ops () in
let input_conn = !input_conn in
let input_mode = !input_mode in
@@ -298,7 +289,7 @@ read the man page virt-v2v-in-place(1).
(* Get the conversion options. *)
let conv_options = {
- Convert.block_driver = block_driver;
+ Convert.block_driver = Virtio_blk;
keep_serial_console = true;
ks = opthandle.ks;
network_map;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f9c748ed..c0aa8498 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -57,7 +57,6 @@ TESTS_ENVIRONMENT = $(top_builddir)/run --test
TESTS = \
test-bad-networks-and-bridges.sh \
- test-block-driver.sh \
test-cdrom.sh \
test-checksum-bad.sh \
test-checksum-good-qcow2.sh \
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index 5d3a9dbb..2e8071db 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -48,7 +48,6 @@ let rec main () =
let bandwidth = ref None in
let bandwidth_file = ref None in
- let block_driver = ref None in
let input_conn = ref None in
let input_format = ref None in
let input_password = ref None in
@@ -201,8 +200,6 @@ let rec main () =
s_"Set bandwidth dynamically from file";
[ S 'b'; L"bridge" ], Getopt.String ("in:out", add_bridge),
s_"Map bridge in to out";
- [ L"block-driver" ], Getopt.String ("driver", set_string_option_once "--block-driver" block_driver),
- s_"Prefer 'virtio-blk' or 'virtio-scsi'";
[ S 'i' ], Getopt.String (input_modes, set_input_mode),
s_"Set input mode (default: libvirt)";
[ M"ic" ], Getopt.String ("uri", set_string_option_once "-ic" input_conn),
@@ -295,12 +292,6 @@ read the man page virt-v2v(1).
(* Dereference the arguments. *)
let args = List.rev !args in
- let block_driver =
- match !block_driver with
- | None | Some "virtio-blk" -> Virtio_blk
- | Some "virtio-scsi" -> Virtio_SCSI
- | Some driver ->
- error (f_"unknown block driver --block-driver %s") driver in
let customize_ops = get_customize_ops () in
let input_conn = !input_conn in
let input_mode = !input_mode in
@@ -413,7 +404,7 @@ read the man page virt-v2v(1).
(* Get the conversion options. *)
let conv_options = {
- Convert.block_driver = block_driver;
+ Convert.block_driver = Virtio_blk;
keep_serial_console = not remove_serial_console;
ks = opthandle.ks;
network_map;

View File

@ -1,4 +1,4 @@
From de879aad4bd0d17e884d571da3348965a9d02756 Mon Sep 17 00:00:00 2001
From 38516e4b16f2148db9d16c352e4bec6c9235e52a 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
@ -16,10 +16,10 @@ support cases.
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/output/output_qemu.ml b/output/output_qemu.ml
index 47a6f4ff..909b6e10 100644
index b9090d86..b17ac518 100644
--- a/output/output_qemu.ml
+++ b/output/output_qemu.ml
@@ -164,7 +164,7 @@ module QEMU = struct
@@ -165,7 +165,7 @@ module QEMU = struct
* module deals with shell and qemu comma quoting.
*)
let cmd = Qemuopts.create () in

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
From 21c7424d64065fe77d4bfd6c05f0ca85e0a08229 Mon Sep 17 00:00:00 2001
From b00922090f704e97388dbc96f6f710fd5e22af92 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 e228fb33..35886561 100644
index 04764832..eb550da0 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -160,11 +160,6 @@ Since F<guest-domain.xml> contains the path(s) to the guest disk
@@ -169,11 +169,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,17 +58,17 @@ index e228fb33..35886561 100644
=head1 OPTIONS
=over 4
@@ -549,9 +544,6 @@ This is similar to I<-o local>, except that a shell script is written
@@ -578,9 +573,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>
-option which boots the guest under qemu immediately.
-
ifelse(ENABLE_OVIRT, yes, `
=item B<-o> B<vdsm>
Set the output method to I<vdsm>.
@@ -622,11 +614,6 @@ For I<-o openstack> (L<virt-v2v-output-openstack(1)>) only, set a guest ID
@@ -653,11 +645,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.
@ -81,7 +81,7 @@ index e228fb33..35886561 100644
For I<-o openstack> (L<virt-v2v-output-openstack(1)>) only, set optional
diff --git a/output/output_qemu.ml b/output/output_qemu.ml
index 909b6e10..37371aad 100644
index b17ac518..197fe385 100644
--- a/output/output_qemu.ml
+++ b/output/output_qemu.ml
@@ -65,6 +65,9 @@ module QEMU = struct

View File

@ -1,4 +1,4 @@
From 04ee519268f9805ac0a9c54fe20e26ccb99c8550 Mon Sep 17 00:00:00 2001
From f19e71394757c9f44ed3367addbe694140f34fea 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,10 +9,10 @@ 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 f3f7a205..7b0d2327 100644
index 15af5b1a..f5afa58f 100644
--- a/lib/utils.ml
+++ b/lib/utils.ml
@@ -81,13 +81,14 @@ let kvm_arch = function
@@ -83,13 +83,14 @@ let kvm_arch = function
(* Does qemu support the given sound card? *)
let qemu_supports_sound_card = function
| Types.AC97

View File

@ -1,4 +1,4 @@
From 4f5301bfa39c09df4ce4368abbafcb53ea139efc Mon Sep 17 00:00:00 2001
From 2e69a53b203968d77eb0a0447bdb347bd34481c6 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)
@ -9,10 +9,10 @@ The SDL output mode is not supported in RHEL's qemu-kvm.
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/input/input_disk.ml b/input/input_disk.ml
index 8b027fed..6dd1b0cf 100644
index a5291031..599436f9 100644
--- a/input/input_disk.ml
+++ b/input/input_disk.ml
@@ -78,7 +78,7 @@ module Disk = struct
@@ -77,7 +77,7 @@ module Disk = struct
s_firmware = UnknownFirmware; (* causes virt-v2v to autodetect *)
s_uefi_secureboot = false;
s_display =

View File

@ -1,24 +0,0 @@
From 74cbf6c5f6c65736a5b5e70aa8876564948645fa Mon Sep 17 00:00:00 2001
From: Vadim Rozenfeld <vrozenfe@redhat.com>
Date: Fri, 18 Jul 2025 19:31:34 +1000
Subject: [PATCH] remove timeout before installing virtio-win drivers
Signed-off-by: Vadim Rozenfeld <vrozenfe@redhat.com>
(cherry picked from commit 07192e2bf5e73dd4d3d7d3c1faa940c7a67e2d72)
---
convert/convert_windows.ml | 2 --
1 file changed, 2 deletions(-)
diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
index 2ff9bcfa..f416b3ad 100644
--- a/convert/convert_windows.ml
+++ b/convert/convert_windows.ml
@@ -401,8 +401,6 @@ let convert (g : G.guestfs) source inspect i_firmware
echo Installing drivers from %inf_dir%\n\
set REBOOT_PENDING=0\n\
\n\
- timeout /t 10 /nobreak\n\
- \n\
reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\RebootRequired\"\n\
if %errorlevel%==0 (\n\
echo Windows Update: Reboot required.\n\

View File

@ -1,4 +1,4 @@
From a3ca5d7c85f44c55bccc8b964e00e4937a54a3b4 Mon Sep 17 00:00:00 2001
From 19cd953d2b43f1d385845ed86c1802d4343093e7 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,81 +0,0 @@
From c674bb5596460fddea5478208dc2cec17993189e Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 13 Aug 2025 16:55:27 +0100
Subject: [PATCH] v2v: Fix SELinux relabelling
Update the common submodule to pick up:
Richard W.M. Jones (3):
mlcustomize/SELinux_relabel.ml: Add comment
mlcustomize/SELinux_relabel.ml: Use new guestfs_setfiles API
mlcustomize/SELinux_relabel.ml: Relabel every mountpoint
This allows SELinux relabelling to work for Linux guests that have a
split-/usr configuration.
This requires libguestfs >= 1.57.1, for the new guestfs_setfiles API.
Fixes: https://issues.redhat.com/browse/RHEL-108174
Reported-by: Germano Veit Michel
Thanks: Ming Xie
(cherry picked from commit e4c53263d08e8aa40b0d911d470ea2930dbb27c7)
---
common | 2 +-
m4/guestfs-libraries.m4 | 6 ++----
2 files changed, 3 insertions(+), 5 deletions(-)
Submodule common 10d2b626..89f1eb2d:
diff --git a/common/mlcustomize/SELinux_relabel.ml b/common/mlcustomize/SELinux_relabel.ml
index 2f3a09bf..f1729e3f 100644
--- a/common/mlcustomize/SELinux_relabel.ml
+++ b/common/mlcustomize/SELinux_relabel.ml
@@ -1,5 +1,5 @@
(* virt-customize
- * Copyright (C) 2016 Red Hat Inc.
+ * Copyright (C) 2016-2025 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
@@ -24,6 +24,10 @@ open Printf
module G = Guestfs
+(* XXX A lot of this code could usefully be moved into
+ * [libguestfs.git/daemon/selinux.ml].
+ *)
+
let rec relabel (g : G.guestfs) =
(* Is the guest using SELinux? (Otherwise this is a no-op). *)
if is_selinux_guest g then (
@@ -109,5 +113,13 @@ and use_setfiles g =
g#copy_attributes ~all:true old_specfile specfile
);
+ (* Get the list of mountpoints, since setfiles does not cross
+ * filesystems (RHEL-108174).
+ *)
+ let mps = g#mountpoints () |>
+ List.map snd |> (* the list of directories *)
+ List.sort compare |> (* sort them for consistency *)
+ Array.of_list in
+
(* Relabel everything. *)
- g#selinux_relabel ~force:true specfile "/"
+ g#setfiles ~force:true specfile mps
diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4
index fa13e0f6..f1d5d127 100644
--- a/m4/guestfs-libraries.m4
+++ b/m4/guestfs-libraries.m4
@@ -19,10 +19,8 @@ dnl Any C libraries required by virt-v2v.
dnl Of course we need libguestfs.
dnl
-dnl We need libguestfs 1.55.6 for guestfs_sh_out.
-dnl We need libguestfs 1.55.12 for guestfs_btrfs_scrub_full.
-dnl We need libguestfs 1.55.13 for guestfs_e2fsck FORCENO flag.
-PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.55.13])
+dnl We need libguestfs 1.57.1 for guestfs_setfiles.
+PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.57.1])
printf "libguestfs version is "; $PKG_CONFIG --modversion libguestfs
dnl And libnbd.

View File

@ -1,25 +0,0 @@
From 687965a4797104fe20f8dc6eaab93d11a6b15775 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 13 Aug 2025 18:03:41 +0100
Subject: [PATCH] RHEL 10: m4: Depend on libguestfs 1.56.1-2.el10 for
guestfs_setfiles
---
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 f1d5d127..1bd39074 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.57.1 for guestfs_setfiles.
-PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.57.1])
+dnl We need libguestfs 1.56.1-2.el10 for guestfs_setfiles.
+PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.56.1])
printf "libguestfs version is "; $PKG_CONFIG --modversion libguestfs
dnl And libnbd.

View File

@ -1,4 +1,4 @@
From 867666d94ada861146fcd0ae6643c0d69c2e4513 Mon Sep 17 00:00:00 2001
From 57a29e5f33a5035917ef0bfffaa61326148c7afa 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 3a8bab3c..f9c748ed 100644
index 54cfd124..8e142b09 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -64,7 +64,6 @@ TESTS = \

View File

@ -1,18 +1,32 @@
From 40333a5f19e6442d0765e11c5b7f8cc4adb8b090 Mon Sep 17 00:00:00 2001
From 61eac56a5cb787d591b9338324513b94f0f51b74 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
Fixes: https://issues.redhat.com/browse/RHEL-40903
---
docs/virt-v2v-in-place.pod | 4 ++++
in-place/in_place.ml | 3 +++
in-place/in_place.ml | 3 +++
in-place/virt-v2v-in-place.pod | 4 ++++
2 files changed, 7 insertions(+)
diff --git a/docs/virt-v2v-in-place.pod b/docs/virt-v2v-in-place.pod
index 3d0d1b28..9714bbac 100644
--- a/docs/virt-v2v-in-place.pod
+++ b/docs/virt-v2v-in-place.pod
diff --git a/in-place/in_place.ml b/in-place/in_place.ml
index 7e490867..6c2790af 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).
let opthandle = create_standard_options argspec ~anon_fun ~key_opts:true ~machine_readable:true usage_msg in
Getopt.parse opthandle.getopt;
+ warning "virt-v2v-in-place is NOT SUPPORTED for command line use. \
+ It is almost always better to use virt-v2v instead of this tool.";
+
(* Print the version, easier than asking users to tell us. *)
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
--- 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
=head1 DESCRIPTION
@ -24,17 +38,3 @@ index 3d0d1b28..9714bbac 100644
Virt-v2v-in-place converts a single guest from a foreign hypervisor to
run on KVM. It does this conversion in place, modifying the original
disk.
diff --git a/in-place/in_place.ml b/in-place/in_place.ml
index a91ee39d..dba0772c 100644
--- a/in-place/in_place.ml
+++ b/in-place/in_place.ml
@@ -211,6 +211,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;
+ warning "virt-v2v-in-place is NOT SUPPORTED for command line use. \
+ It is almost always better to use virt-v2v instead of this tool.";
+
(* Print the version, easier than asking users to tell us. *)
debug "info: %s: %s %s (%s)"
prog Config.package_name Config.package_version_full

View File

@ -1,98 +0,0 @@
From c00234c61eb2a49b2961b24672e41f15d8d734b8 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 21 Aug 2025 09:45:44 +0100
Subject: [PATCH] convert: Model target boot device
SeaBIOS recently changed how it works so it no longer initializes all
disks at boot. To get around this, for some Linux BIOS guests, we
will have to assign a boot order to the disks, with <boot order='1'>
for the disk that contains the GRUB bootloader, and higher boot orders
assigned to the other disks.
As the first step, model the target boot device.
In the current commit this is always unset (set to 'None'), so this
does nothing.
(cherry picked from commit e512d84bc8e18734aac7659e839f32c960f6fb0a)
---
convert/convert.ml | 8 ++++++--
lib/types.ml | 3 ++-
lib/types.mli | 15 ++++++++++++++-
3 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/convert/convert.ml b/convert/convert.ml
index 45d48a95..f8a35506 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -136,7 +136,8 @@ let rec convert input_disks options source =
get_target_firmware i_firmware guestcaps source output in
(* Create target metadata file. *)
- let target_meta = { guestcaps; target_buses; target_firmware; target_nics } in
+ let target_meta = { guestcaps; target_buses; target_nics;
+ target_firmware; target_boot_device = None } in
(* This is a good place to dump everything we know about the guest. *)
if verbose () then debug_info source inspect target_meta mpstats;
@@ -366,7 +367,8 @@ and get_target_firmware i_firmware guestcaps source output =
* is enabled.
*)
and debug_info source inspect
- { guestcaps; target_buses; target_firmware; target_nics }
+ { guestcaps; target_buses; target_nics;
+ target_firmware; target_boot_device }
mpstats =
eprintf "info:\n";
eprintf "%s\n" (string_of_source source);
@@ -374,6 +376,8 @@ and debug_info source inspect
eprintf "%s\n" (string_of_guestcaps guestcaps);
eprintf "%s\n" (string_of_target_buses target_buses);
eprintf "target firmware: %s\n" (string_of_target_firmware target_firmware);
+ eprintf "target boot device: %s\n"
+ (match target_boot_device with None -> "" | Some i -> string_of_int i);
eprintf "target NICs:\n";
List.iter (fun nic -> eprintf "%s\n" (string_of_source_nic nic))
target_nics;
diff --git a/lib/types.ml b/lib/types.ml
index 0196a3fd..bd4ab31c 100644
--- a/lib/types.ml
+++ b/lib/types.ml
@@ -485,8 +485,9 @@ let string_of_target_buses buses =
type target_meta = {
guestcaps : guestcaps;
target_buses : target_buses;
+ target_nics : target_nics;
target_firmware : target_firmware;
- target_nics : target_nics
+ target_boot_device : int option;
}
type root_choice = AskRoot | SingleRoot | FirstRoot | RootDev of string
diff --git a/lib/types.mli b/lib/types.mli
index b3815c8e..0c43b149 100644
--- a/lib/types.mli
+++ b/lib/types.mli
@@ -367,8 +367,21 @@ val string_of_target_buses : target_buses -> string
type target_meta = {
guestcaps : guestcaps;
target_buses : target_buses;
+ target_nics : target_nics;
+
target_firmware : target_firmware;
- target_nics : target_nics
+
+ target_boot_device : int option;
+ (** The disk index of the device containing the bootloader (index
+ starting from 0).
+
+ For libvirt guests this should usually be mapped to
+ [<boot order='1'>] for this disk, and [<boot order='N'>]
+ where N > 1 for each other disk (order does not matter
+ for the other disks).
+
+ This is only necessary for SeaBIOS so only collected for
+ a subset of BIOS guests (RHEL-108991). *)
}
(** {2 Command line parameters} *)

View File

@ -1,41 +1,41 @@
From 24cd76732009fabd3070d1a1fcfee5cbfa5c229c Mon Sep 17 00:00:00 2001
From 9e9546aa983337e197407ce25ef3d3cd0a3cf173 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 cache=none
Subject: [PATCH] RHEL: output/output.ml: Remove reduce-memory-pressure=on
(cache=none)
Virt-v2v tries to reduce the amount of page cache used when writing
out the disk image to the target storage. It does this by enabling the
cache=none option in nbdkit-file-plugin.
reduce-memory-pressure=on option (previously cache=none) option in
nbdkit-file-plugin.
However, use of nbdkit-file-plugin cache=none option causes data
corruption with Dell PowerMax 8000 storage (only).
As this is only an advisory setting, remove it. Use of the page cache
can be limited instead using cgroupsv2 memory settings.
As this is only an advisory setting, remove it for now.
Fixes: https://issues.redhat.com/browse/RHEL-135617
(cherry picked from commit 30c03c7e308b063843a7848d15890871566bbbc0)
---
output/output.ml | 2 --
1 file changed, 2 deletions(-)
diff --git a/output/output.ml b/output/output.ml
index 15cb50db..5d9c044f 100644
index ff4b12b1..8b94df34 100644
--- a/output/output.ml
+++ b/output/output.ml
@@ -101,7 +101,6 @@ let output_to_local_file ?(changeuid = fun f -> f ())
@@ -102,7 +102,6 @@ let output_to_local_file ?name
| "raw" ->
let cmd = Nbdkit.create "file" in
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
@@ -204,7 +203,6 @@ let create_local_output_disks dir
@@ -209,7 +208,6 @@ let create_local_output_disks dir
(* Create the single nbdkit-file-plugin instance. *)
let cmd = Nbdkit.create "file" in
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,184 +0,0 @@
From e7abf2e39ed17e324b54c00f2386f56152660522 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 21 Aug 2025 09:53:42 +0100
Subject: [PATCH] output: Add boot order depending on target boot device
If no target boot device was specified, we number them <boot order='1'>
through <boot order='N'> for each disk.
If a target boot device was specified, then that disk has
<boot order='1'>, and the remaining disks are numbered sequentially
starting at 2.
(cherry picked from commit 08e57a392aa5e0720e8787968a562808cb0a31fe)
---
lib/create_ovf.ml | 19 ++++++++-----------
output/create_libvirt_xml.ml | 16 +++++++++++++++-
output/output_qemu.ml | 16 +++++++++++++---
tests/test-cdrom.expected | 1 +
tests/test-floppy.expected | 1 +
tests/test-i-ova.xml | 1 +
6 files changed, 39 insertions(+), 15 deletions(-)
diff --git a/lib/create_ovf.ml b/lib/create_ovf.ml
index 0af62c88..f74ba3a7 100644
--- a/lib/create_ovf.ml
+++ b/lib/create_ovf.ml
@@ -544,7 +544,7 @@ let create_meta_files output_alloc output_format sd_uuid image_uuids sizes =
(* Create the OVF file. *)
let rec create_ovf source inspect
- { guestcaps; target_firmware; target_nics }
+ { guestcaps; target_nics; target_firmware; target_boot_device }
sizes
output_alloc output_format
output_name
@@ -763,7 +763,7 @@ let rec create_ovf source inspect
] in
(* Add disks to the OVF XML. *)
- add_disks sizes guestcaps output_alloc output_format
+ add_disks sizes guestcaps target_boot_device output_alloc output_format
sd_uuid image_uuids vol_uuids need_actual_sizes output_disks
ovf_flavour ovf;
@@ -813,7 +813,7 @@ and get_flavoured_section ovf ovirt_path esd_path esd_path_attr = function
with Not_found -> assert false
(* This modifies the OVF DOM, adding a section for each disk. *)
-and add_disks sizes guestcaps output_alloc output_format
+and add_disks sizes guestcaps target_boot_device output_alloc output_format
sd_uuid image_uuids vol_uuids need_actual_sizes output_disks
ovf_flavour ovf =
let references =
@@ -838,14 +838,11 @@ and add_disks sizes guestcaps output_alloc output_format
(* Iterate over the disks, adding them to the OVF document. *)
List.iteri (
fun i (size, image_uuid, vol_uuid, output_uri) ->
- (* This sets the boot order to boot the first disk first. This
- * isn't generally correct. We should copy over the boot order
- * from the source hypervisor. See long discussion in
- * https://bugzilla.redhat.com/show_bug.cgi?id=1308535 for
- * what we should be doing. (XXX)
- *)
- let is_bootable_drive = i == 0 in
- let boot_order = i+1 in
+ let is_bootable_drive, boot_order =
+ match target_boot_device with
+ | None -> i = 0, i+1
+ | Some disk_index when disk_index = i -> true, 1
+ | Some _ -> false, i+2 in
let fileref =
match ovf_flavour with
diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml
index 7ab8d34c..59f2f1f8 100644
--- a/output/create_libvirt_xml.ml
+++ b/output/create_libvirt_xml.ml
@@ -41,7 +41,8 @@ let get_osinfo_id inspect =
None
let create_libvirt_xml ?pool source inspect
- { guestcaps; target_buses; target_firmware; target_nics }
+ { guestcaps; target_buses; target_nics; target_firmware;
+ target_boot_device }
target_features outdisk_name output_format output_name =
(* The main body of the libvirt XML document. *)
let body = ref [] in
@@ -206,6 +207,18 @@ let create_libvirt_xml ?pool source inspect
| BusSlotDisk d ->
let outdisk = outdisk_name d.s_disk_id in
+ let boot_order =
+ match target_boot_device with
+ | None ->
+ (* No known boot device, just number them sequentially. *)
+ i+1
+ | Some disk_index when disk_index = i ->
+ (* For the boot disk, use order 1. *)
+ 1
+ | Some _ ->
+ (* For the others number them sequentially starting at 2. *)
+ i+2 in
+
e "disk" (
[
"type", if pool = None then "file" else "volume";
@@ -231,6 +244,7 @@ let create_libvirt_xml ?pool source inspect
"dev", drive_prefix ^ drive_name i;
"bus", bus_name;
] [];
+ e "boot" [ "order", string_of_int boot_order ] [];
]
| BusSlotRemovable { s_removable_type = CDROM } ->
diff --git a/output/output_qemu.ml b/output/output_qemu.ml
index 37371aad..dff08b66 100644
--- a/output/output_qemu.ml
+++ b/output/output_qemu.ml
@@ -108,7 +108,8 @@ module QEMU = struct
let _, qemu_boot, output_alloc, output_format,
output_name, output_storage = options in
- let { guestcaps; target_buses; target_firmware } = target_meta in
+ let { guestcaps; target_buses;
+ target_firmware; target_boot_device } = target_meta in
(* Start the shell script. Write it to a temporary file
* which we rename at the end.
@@ -282,8 +283,17 @@ module QEMU = struct
* "disk_id".
*)
let outdisk = disk_path output_storage output_name disk_id in
- arg_list "-drive" [ "file=" ^ outdisk; "format=" ^ output_format;
- "if=none"; "id=" ^ backend_name; "media=disk" ]
+ let bootindex =
+ match target_boot_device with
+ | None -> disk_id+1
+ | Some disk_index when disk_index = disk_id -> 1
+ | Some _ -> disk_id+2 in
+ arg_list "-drive" [ "file=" ^ outdisk;
+ "format=" ^ output_format;
+ "if=none";
+ "id=" ^ backend_name;
+ "media=disk";
+ sprintf "bootindex=%d" bootindex ]
and add_cdrom_backend backend_name =
(* Add a drive (back-end) for an "ide-cd" or "scsi-cd" device (front-end).
diff --git a/tests/test-cdrom.expected b/tests/test-cdrom.expected
index 17bd152d..806461e7 100644
--- a/tests/test-cdrom.expected
+++ b/tests/test-cdrom.expected
@@ -1,6 +1,7 @@
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<target dev='vda' bus='virtio'/>
+ <boot order='1'/>
</disk>
<disk device='cdrom' type='file'>
<driver name='qemu' type='raw'/>
diff --git a/tests/test-floppy.expected b/tests/test-floppy.expected
index a718c21f..c5bd913b 100644
--- a/tests/test-floppy.expected
+++ b/tests/test-floppy.expected
@@ -1,6 +1,7 @@
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<target dev='vda' bus='virtio'/>
+ <boot order='1'/>
</disk>
<disk device='floppy' type='file'>
<driver name='qemu' type='raw'/>
diff --git a/tests/test-i-ova.xml b/tests/test-i-ova.xml
index f1d8f2e3..08b5b9f2 100644
--- a/tests/test-i-ova.xml
+++ b/tests/test-i-ova.xml
@@ -27,6 +27,7 @@
<driver name='qemu' type='raw'/>
<source file='TestOva-sda'/>
<target dev='vda' bus='virtio'/>
+ <boot order='1'/>
</disk>
<disk device='cdrom' type='file'>
<driver name='qemu' type='raw'/>

View File

@ -1,7 +1,11 @@
From 69c4b5280893793771f6514357ab56348420fcf7 Mon Sep 17 00:00:00 2001
From 2666493010b1b82d5b8dbb517c9976727b05184f Mon Sep 17 00:00:00 2001
Message-ID: <2666493010b1b82d5b8dbb517c9976727b05184f.1770914130.git.crobinso@redhat.com>
In-Reply-To: <859c43b1eb81cfdcb5f481b571e2c387860f8a27.1770914130.git.crobinso@redhat.com>
References: <859c43b1eb81cfdcb5f481b571e2c387860f8a27.1770914130.git.crobinso@redhat.com>
From: Cole Robinson <crobinso@redhat.com>
Date: Wed, 11 Feb 2026 19:09:26 -0500
Subject: [PATCH] Update common submodule
Content-type: text/plain
Update to fix:
https://issues.redhat.com/browse/RHEL-148423
@ -11,14 +15,13 @@ This pulls in the following commits:
Cole Robinson (1):
virtio-win: Install blnsvr.exe to C:\Windows\Drivers\VirtIO
(cherry picked from commit b227d493ace2250bbc53a25ce7db42fcf220ba51)
Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit b227d493ace2250bbc53a25ce7db42fcf220ba51)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 54a5b4ce..10fed783:
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

View File

@ -1,78 +0,0 @@
From 46af95ecd11c9eda5fd4195b62528b1eea214550 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 21 Aug 2025 10:27:41 +0100
Subject: [PATCH] convert: Detect target boot device for Linux guests
If the guest is Linux, try to detect the boot device, so we can set
<boot order='N'> appropriately. We do this for BIOS or UEFI here, but
this only really matters for SeaBIOS.
Suggested-by: Gerd Hoffmann
Fixes: https://issues.redhat.com/browse/RHEL-108991
(cherry picked from commit ca6ec6317e20a633315f783a8ba4ece3c2fc01f2)
---
convert/convert.ml | 37 ++++++++++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
diff --git a/convert/convert.ml b/convert/convert.ml
index f8a35506..728ea5a1 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -95,6 +95,10 @@ let rec convert input_disks options source =
let root = Choose_root.choose_root options.root_choice g in
let inspect = Mount_filesystems.mount_filesystems g root in
+ (* Detect boot device. *)
+ message (f_"Detecting the boot device");
+ let target_boot_device = get_target_boot_device g inspect in
+
let mpstats = get_mpstats g in
check_guest_free_space inspect mpstats;
@@ -137,7 +141,7 @@ let rec convert input_disks options source =
(* Create target metadata file. *)
let target_meta = { guestcaps; target_buses; target_nics;
- target_firmware; target_boot_device = None } in
+ target_firmware; target_boot_device } in
(* This is a good place to dump everything we know about the guest. *)
if verbose () then debug_info source inspect target_meta mpstats;
@@ -362,6 +366,37 @@ and get_target_firmware i_firmware guestcaps source output =
target_firmware
+and get_target_boot_device g inspect =
+ (* We only do it for Linux, as most likely Windows never(?) boots
+ * from any drive other than C:. We can revisit this decision
+ * if someone reports a bug.
+ *)
+ match inspect.i_type with
+ | "linux" ->
+ (try
+ (* In sane cases, the Grub stage1/boot.img (ie. the boot sector) is
+ * always on the same drive as /boot. So we can just find out
+ * where /boot is mounted and use that.
+ *)
+ let boot_mountpoint = List.assoc "/boot" inspect.i_mountpoints in
+ let boot_device = g#part_to_dev boot_mountpoint in
+ let boot_device = g#device_index boot_device in
+ Some boot_device
+ with
+ | Not_found -> None
+ | G.Error msg
+ (* Returned by part_to_dev if the /boot mountpoint is not
+ * a partition name.
+ *)
+ when String.find msg "device name is not a partition" >= 0 -> None
+ | G.Error msg
+ (* Returned by device_index if the /boot device is not
+ * a normal drive name (eg. /dev/mdX).
+ *)
+ when String.find msg "device not found" >= 0 -> None
+ )
+ | _ -> None
+
(* After conversion we dump as much information about the guest
* as we can in one place. Note this is only called when verbose
* is enabled.

View File

@ -0,0 +1,33 @@
From 4e06515083d7effdee91195dbf93082e544a6283 Mon Sep 17 00:00:00 2001
Message-ID: <4e06515083d7effdee91195dbf93082e544a6283.1771345004.git.crobinso@redhat.com>
In-Reply-To: <859c43b1eb81cfdcb5f481b571e2c387860f8a27.1771345004.git.crobinso@redhat.com>
References: <859c43b1eb81cfdcb5f481b571e2c387860f8a27.1771345004.git.crobinso@redhat.com>
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,66 +0,0 @@
From e2aa9fab93431ff03421806c11fd66349aa3dd92 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 25 Aug 2025 20:59:12 +0100
Subject: [PATCH] output: kubevirt: Add bootOrder to Kubevirt YAML
Fixes: https://issues.redhat.com/browse/RHEL-110742
(cherry picked from commit 394159cfa36b06b031bdc7322b355af9aac658a5)
---
output/create_kubevirt_yaml.ml | 9 ++++++++-
tests/test-o-kubevirt-fedora.yaml.expected | 1 +
tests/test-o-kubevirt-windows.yaml.expected | 1 +
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/output/create_kubevirt_yaml.ml b/output/create_kubevirt_yaml.ml
index 067cf6cb..1bb53216 100644
--- a/output/create_kubevirt_yaml.ml
+++ b/output/create_kubevirt_yaml.ml
@@ -27,7 +27,8 @@ open Utils
open YAML
let create_kubevirt_yaml source inspect
- { guestcaps; target_buses; target_firmware; target_nics }
+ { guestcaps; target_buses; target_nics;
+ target_firmware; target_boot_device }
outdisk_name output_format output_name =
(* The body of the YAML contains various sections attached to
* a tree. We fill in these sections first.
@@ -164,8 +165,14 @@ let create_kubevirt_yaml source inspect
(* XXX How to place devices on the bus? *) ()
| BusSlotDisk d ->
let disk_id = sprintf "disk-%d" d.s_disk_id in
+ let boot_order =
+ match target_boot_device with
+ | None -> d.s_disk_id + 1
+ | Some disk_index when disk_index = d.s_disk_id -> 1
+ | Some _ -> d.s_disk_id + 2 in
let disk = Assoc [
"disk", Assoc ["bus", String "virtio"];
+ "bootOrder", Int boot_order;
"name", String disk_id
] in
List.push_back disks disk;
diff --git a/tests/test-o-kubevirt-fedora.yaml.expected b/tests/test-o-kubevirt-fedora.yaml.expected
index 63205f1b..38577866 100644
--- a/tests/test-o-kubevirt-fedora.yaml.expected
+++ b/tests/test-o-kubevirt-fedora.yaml.expected
@@ -26,6 +26,7 @@ spec:
disks:
- disk:
bus: virtio
+ bootOrder: 1
name: disk-0
volumes:
- hostDisk:
diff --git a/tests/test-o-kubevirt-windows.yaml.expected b/tests/test-o-kubevirt-windows.yaml.expected
index 9bad64bd..d0544510 100644
--- a/tests/test-o-kubevirt-windows.yaml.expected
+++ b/tests/test-o-kubevirt-windows.yaml.expected
@@ -36,6 +36,7 @@ spec:
disks:
- disk:
bus: virtio
+ bootOrder: 1
name: disk-0
interfaces:
- name: net_default

View File

@ -1,239 +0,0 @@
From f221fc8b697335bbb5b90df25f14e0e998b29e57 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 10 Sep 2025 14:39:18 +0100
Subject: [PATCH] convert: Look for GRUB signature first to identify boot
device
In commit ca6ec6317e ("convert: Detect target boot device for Linux
guests") we tried to identify the boot order by looking for the device
containing the /boot filesystem. However during our testing we found
a guest where GRUB was installed on /dev/sda but the /boot partition
was found on /dev/sdd. This guest would not boot with the boot order
indicating that disk 4 (sdd) was the boot disk.
Change how we search for the boot device by first trying to find a
GRUB signature in the boot sector of any disk. The first matching
disk (if any) would then be picked as the boot device. If this fails
then we fall back to looking at the device containing /boot as before.
This also updates the common module to get:
Richard W.M. Jones (1):
mlstdutils: Export List.find_opt
Reported-by: Ming Xie
Thanks: Gerd Hoffmann
Fixes: commit ca6ec6317e20a633315f783a8ba4ece3c2fc01f2
Fixes: https://issues.redhat.com/browse/RHEL-108991
See-also: https://thestarman.pcministry.com/asm/mbr/GRUB.htm
(cherry picked from commit 06fa7bf0f9078d8035eab7ad4689a5018136e712)
---
common | 2 +-
convert/convert.ml | 77 +++++++++++++++++++++++++++++-----------------
2 files changed, 49 insertions(+), 30 deletions(-)
Submodule common 89f1eb2d..5be8d552:
diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml
index 5f2642b0..360c33d6 100644
--- a/common/mlcustomize/firstboot.ml
+++ b/common/mlcustomize/firstboot.ml
@@ -35,8 +35,7 @@ let sanitize_name =
module Linux = struct
let firstboot_dir = "/usr/lib/virt-sysprep"
- let firstboot_sh = sprintf "\
-#!/bin/sh -
+ let firstboot_sh = sprintf {|#!/bin/sh -
### BEGIN INIT INFO
# Provides: virt-sysprep
@@ -57,14 +56,14 @@ d=%s/scripts
d_done=%s/scripts-done
logfile=~root/virt-sysprep-firstboot.log
-echo \"$0\" \"$@\" 2>&1 | tee -a $logfile
-echo \"Scripts dir: $d\" 2>&1 | tee -a $logfile
+echo "$0" "$@" 2>&1 | tee -a $logfile
+echo "Scripts dir: $d" 2>&1 | tee -a $logfile
-if test \"$1\" = \"start\"
+if test "$1" = "start"
then
mkdir -p $d_done
for f in $d/* ; do
- if test -x \"$f\"
+ if test -x "$f"
then
# move the script to the 'scripts-done' directory, so it is not
# executed again at the next boot
@@ -75,7 +74,7 @@ then
done
rm -f $d_done/*
fi
-" firstboot_dir firstboot_dir
+|} firstboot_dir firstboot_dir
let systemd_target = "multi-user.target"
@@ -282,38 +281,37 @@ module Windows = struct
* XXX It would be better to use powershell here. For some ideas see
* https://github.com/HCK-CI/HLK-Setup-Scripts/
*)
- let firstboot_script = sprintf "\
-@echo off
+ let firstboot_script = sprintf {|@echo off
setlocal EnableDelayedExpansion
set firstboot=%s
-set log=%%firstboot%%\\log.txt
+set log=%%firstboot%%\log.txt
-set scripts=%%firstboot%%\\scripts
-set scripts_done=%%firstboot%%\\scripts-done
+set scripts=%%firstboot%%\scripts
+set scripts_done=%%firstboot%%\scripts-done
-call :main >> \"%%log%%\" 2>&1
+call :main >> "%%log%%" 2>&1
exit /b
:main
echo starting firstboot service
-if not exist \"%%scripts_done%%\" (
- mkdir \"%%scripts_done%%\"
+if not exist "%%scripts_done%%" (
+ mkdir "%%scripts_done%%"
)
:: Pick the next script to run.
-for %%%%f in (\"%%scripts%%\"\\*.bat) do (
- echo running \"%%%%f\"
- pushd \"%%scripts%%\"
- call \"%%%%~nf\"
+for %%%%f in ("%%scripts%%"\*.bat) do (
+ echo running "%%%%f"
+ pushd "%%scripts%%"
+ call "%%%%~nf"
set elvl=!errorlevel!
echo .... exit code !elvl!
popd
if !elvl! NEQ 249 (
echo Script succeeded, moving to scripts-done
- move \"%%%%f\" \"%%scripts_done%%\"
+ move "%%%%f" "%%scripts_done%%"
) else (
echo Script failed, will retry on next boot
)
@@ -329,8 +327,8 @@ for %%%%f in (\"%%scripts%%\"\\*.bat) do (
:: Fallthrough here if there are no scripts.
echo uninstalling firstboot service
-\"%%firstboot%%\\%s\" -s firstboot uninstall
-" firstboot_dir_win srvany in
+"%%firstboot%%\%s" -s firstboot uninstall
+|} firstboot_dir_win srvany in
g#write (firstboot_dir // "firstboot.bat")
(String.unix2dos firstboot_script);
diff --git a/common/mlstdutils/std_utils.mli b/common/mlstdutils/std_utils.mli
index a20e720c..6c1911da 100644
--- a/common/mlstdutils/std_utils.mli
+++ b/common/mlstdutils/std_utils.mli
@@ -46,6 +46,7 @@ module List : sig
val mem : 'a -> 'a list -> bool
val memq : 'a -> 'a list -> bool
val find : ('a -> bool) -> 'a list -> 'a
+ val find_opt : ('a -> bool) -> 'a list -> 'a option
val filter : ('a -> bool) -> 'a list -> 'a list
val find_all : ('a -> bool) -> 'a list -> 'a list
val partition : ('a -> bool) -> 'a list -> 'a list * 'a list
diff --git a/convert/convert.ml b/convert/convert.ml
index 728ea5a1..6c78bd99 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -367,35 +367,54 @@ and get_target_firmware i_firmware guestcaps source output =
target_firmware
and get_target_boot_device g inspect =
- (* We only do it for Linux, as most likely Windows never(?) boots
- * from any drive other than C:. We can revisit this decision
- * if someone reports a bug.
- *)
- match inspect.i_type with
- | "linux" ->
- (try
- (* In sane cases, the Grub stage1/boot.img (ie. the boot sector) is
- * always on the same drive as /boot. So we can just find out
- * where /boot is mounted and use that.
- *)
- let boot_mountpoint = List.assoc "/boot" inspect.i_mountpoints in
- let boot_device = g#part_to_dev boot_mountpoint in
- let boot_device = g#device_index boot_device in
- Some boot_device
- with
- | Not_found -> None
- | G.Error msg
- (* Returned by part_to_dev if the /boot mountpoint is not
- * a partition name.
- *)
- when String.find msg "device name is not a partition" >= 0 -> None
- | G.Error msg
- (* Returned by device_index if the /boot device is not
- * a normal drive name (eg. /dev/mdX).
- *)
- when String.find msg "device not found" >= 0 -> None
- )
- | _ -> None
+ with_return (fun {return} ->
+ (* We only do it for Linux, as most likely Windows never(?) boots
+ * from any drive other than C:. We can revisit this decision
+ * if someone reports a bug.
+ *)
+ if inspect.i_type <> "linux" then return None;
+
+ (* Look for "GRUB" signature in the boot sector of each disk.
+ * If we find it, choose that disk.
+ *)
+ let devices = g#list_devices () |> Array.to_list in
+ let boot_device = List.find_opt (has_grub_signature g) devices in
+ let boot_device = Option.map g#device_index boot_device in
+ if boot_device <> None then return boot_device;
+
+ (* If that fails, in sane cases, the Grub stage1/boot.img (ie. the boot
+ * sector) is always on the same drive as /boot. So we can just find
+ * out where /boot is mounted and use that.
+ *)
+ get_device_of_boot_filesystem g inspect
+ )
+
+and has_grub_signature g dev =
+ let boot_sector = g#pread_device dev 512 0_L in
+ let r = String.find boot_sector "GRUB" >= 0 in
+ debug "has_grub_signature: \"GRUB\" signature on %s? %b" dev r;
+ r
+
+and get_device_of_boot_filesystem g inspect =
+ try
+ let boot_mountpoint = List.assoc "/boot" inspect.i_mountpoints in
+ let boot_device = g#part_to_dev boot_mountpoint in
+ debug "get_device_of_boot_filesystem: found /boot filesystem on device %s"
+ boot_device;
+ let boot_device = g#device_index boot_device in
+ Some boot_device
+ with
+ | Not_found -> None
+ (* Returned by part_to_dev if the /boot mountpoint is not
+ * a partition name.
+ *)
+ | G.Error msg
+ when String.find msg "device name is not a partition" >= 0 -> None
+ (* Returned by device_index if the /boot device is not
+ * a normal drive name (eg. /dev/mdX).
+ *)
+ | G.Error msg
+ when String.find msg "device not found" >= 0 -> None
(* After conversion we dump as much information about the guest
* as we can in one place. Note this is only called when verbose

View File

@ -1,34 +0,0 @@
From def3f0343f3cbf0431004f0b00ec0862c09ce476 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 25 Sep 2025 10:35:31 +0100
Subject: [PATCH] lib/types.ml: Fix formatting of debug message
With multiple disks you would see:
virtio-blk slot 0:
0 [scsi]virtio-blk slot 1:
1 [scsi]virtio-blk slot 2:
2 [scsi]virtio-blk slot 3:
3 [scsi]
Fix this by adding a \n character.
Fixes: commit 2c96e93f63d86c9980594816a532b787532cdc2c
(cherry picked from commit dfd78446296c721efe596f2107163c5157d6c3d2)
---
lib/types.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/types.ml b/lib/types.ml
index bd4ab31c..d6709a2c 100644
--- a/lib/types.ml
+++ b/lib/types.ml
@@ -471,7 +471,7 @@ let string_of_target_bus_slots bus_name slots =
sprintf "%s slot %d:\n" bus_name slot_nr ^
(match slot with
| BusSlotEmpty -> "\t(slot empty)\n"
- | BusSlotDisk d -> string_of_source_disk d
+ | BusSlotDisk d -> string_of_source_disk d ^ "\n"
| BusSlotRemovable r -> string_of_source_removable r ^ "\n"
)
) slots in

View File

@ -1,69 +0,0 @@
From e0f472c42409b157e32e0c8efd0af3a2bd02f0e7 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 28 Oct 2025 11:34:22 +0000
Subject: [PATCH] convert: windows: Fix ESP conversion if C:\Windows\Temp has
alternate case
We found a Windows guest which had the expected C:\Windows\Temp path,
but the actual name was TEMP rather than Temp. It's unclear if this
had been renamed, or if Windows can create this normally. In any
case, the unexpected casing caused this failure:
virt-v2v: error: libguestfs error: mkdtemp: /Windows/Temp/ESP_XXXXXX: No such file or directory
We have to use g#case_sensitive_path here since the directory is on
NTFS.
I also removed the hard-coded "\Windows" in favour of %systemroot%,
and fixed the indentation.
Fixes: https://issues.redhat.com/browse/RHEL-124569
Reported-by: Ulhas Surse
(cherry picked from commit 277ddd1a9b84d9c1b1fa93ef9a2e7f52b68d7930)
---
convert/convert_windows.ml | 30 +++++++++++++++++-------------
1 file changed, 17 insertions(+), 13 deletions(-)
diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
index f416b3ad..b7a7727b 100644
--- a/convert/convert_windows.ml
+++ b/convert/convert_windows.ml
@@ -961,21 +961,25 @@ let convert (g : G.guestfs) source inspect i_firmware
match i_firmware with
| Firmware.I_BIOS -> ()
| I_UEFI esp_list ->
- let esp_temp_path = g#mkdtemp "/Windows/Temp/ESP_XXXXXX" in
- let uefi_arch = get_uefi_arch_suffix inspect.i_arch in
+ let esp_temp_path =
+ let temp = inspect.i_windows_systemroot ^ "/Temp" in
+ let mp = g#case_sensitive_path temp in
+ let template = mp ^ "/ESP_XXXXXX" in
+ g#mkdtemp template in
+ let uefi_arch = get_uefi_arch_suffix inspect.i_arch in
- List.iter (
- fun dev_path ->
- g#mount dev_path esp_temp_path;
- fix_win_uefi_bcd esp_temp_path;
- (match uefi_arch with
- | Some uefi_arch -> fix_win_uefi_fallback esp_temp_path uefi_arch
- | None -> ()
- );
- g#umount esp_temp_path;
- ) esp_list;
+ List.iter (
+ fun dev_path ->
+ g#mount dev_path esp_temp_path;
+ fix_win_uefi_bcd esp_temp_path;
+ (match uefi_arch with
+ | Some uefi_arch -> fix_win_uefi_fallback esp_temp_path uefi_arch
+ | None -> ()
+ );
+ g#umount esp_temp_path;
+ ) esp_list;
- g#rmdir esp_temp_path
+ g#rmdir esp_temp_path
in
do_convert ()

View File

@ -1,34 +0,0 @@
From 519ccf9d812093c0c54625d14f835652c07cf0dc Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 20 Sep 2025 17:20:25 +0100
Subject: [PATCH] Update common submodule
Richard W.M. Jones (2):
daemon, generator: Use power of 2 for initial size of Hashtbl.create
mlcustomize/inject_virtio_win.ml: Use viostor.inf instead of guestor
Fixes: https://issues.redhat.com/browse/RHEL-128908
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 5be8d552..54a5b4ce:
diff --git a/common/mlcustomize/inject_virtio_win.ml b/common/mlcustomize/inject_virtio_win.ml
index b26b14d3..114df064 100644
--- a/common/mlcustomize/inject_virtio_win.ml
+++ b/common/mlcustomize/inject_virtio_win.ml
@@ -310,8 +310,13 @@ and ddb_regedits inspect drv_name drv_pciid =
* one must add keys into the DriverDatabase.
*)
+ let winarch =
+ match inspect.i_arch with
+ | "i386" -> "x86" | "x86_64" -> "amd64"
+ | _ -> assert false in
+
let drv_inf = "guestor.inf" in
- let drv_inf_label = drv_inf ^ "_tmp" in
+ let drv_inf_label = sprintf "%s_%s_0000000000000000" drv_inf winarch in
let drv_config = "guestor_conf" in
[

View File

@ -1,118 +0,0 @@
From 1053eaf35267c20f451f581973e55474a1f2ee58 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 16 Oct 2025 12:32:40 +0100
Subject: [PATCH] input/input_vddk.ml: Handle subdirectories in nbdkit vddk
export wildcard
When calling nbdkit vddk plugin, we have to construct an export
parameter, which is a wildcard that matches all of the filenames we
will request. See:
https://libguestfs.org/nbdkit-vddk-plugin.1.html#PARAMETERS
The wildcard is checked using fnmatch(FNM_PATHNAME), so '/' characters
in the filename do *not* match '*' characters in the wildcard. As a
result, we failed before when the VMware filename was a path with
subdirectories.
Attempt some hairy functional programming to calculate a suitable
wildcard for these cases. This definitely won't handle the case where
we have filenames at different directory depths, because in fact
nbdkit itself cannot handle this case right now.
Reported-by: Ming Xie
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
Fixes: https://issues.redhat.com/browse/RHEL-121728
Related: commit 5461976e229873a203062848c0de30e70067b3fb
Fixes: commit 076727e55f4d4fed246097d3f89ebfe83e3de88f
Related: https://issues.redhat.com/browse/RHEL-102734
(cherry picked from commit ba86b22c75a65240fdb65ac2e91c472c0f68f78e)
---
input/input_vddk.ml | 63 +++++++++++++++++++++++++++++++++++----------
1 file changed, 50 insertions(+), 13 deletions(-)
diff --git a/input/input_vddk.ml b/input/input_vddk.ml
index e88befa2..7fd416b9 100644
--- a/input/input_vddk.ml
+++ b/input/input_vddk.ml
@@ -35,6 +35,53 @@ open Input
*)
let libNN = sprintf "lib%d" Sys.word_size
+(* Calculate the nbdkit vddk plugin 'export' parameter. This is a
+ * wildcard that must match all filenames given. nbdkit uses
+ * 'fnmatch (export, filename, FNM_PATHNAME)' when checking this,
+ * which means:
+ * - We have to escape any fnmatch-special chars such as '[' and '*'
+ * - '*' does not match '/' characters in the filename
+ *)
+let get_vddk_export_wildcard = function
+ | [] -> assert false (* can't happen, checked by the caller *)
+ | [f] -> fnmatch_escape f (* single file, just escape the whole thing *)
+ | files ->
+ (* We implicitly assume all files end in *.vmdk, check that. *)
+ List.iter (fun f -> assert (String.ends_with ".vmdk" f)) files;
+
+ (* Calculate the longest common prefix of all the filenames.
+ * Remove the prefix from each filename, leaving the remainder strings.
+ * eg.
+ * "foobar", "foobazs" => prefix = "fooba", remainders = ["r", "zs"]
+ *)
+ let prefix = String.longest_common_prefix files in
+ let prefix_len = String.length prefix in
+ let remainders = List.map (
+ fun f ->
+ let n = String.length f in
+ assert (prefix_len <= n);
+ String.sub f prefix_len (n - prefix_len)
+ ) files in
+
+ (* The number of '/' (slash) characters in the remainders must be
+ * the same, otherwise there's something weird with subdirectories
+ * going on that we can't handle yet. (XXX If this happens, then
+ * we'd need to change nbdkit because it cannot possibly handle
+ * a wildcard that matches different directory depths).
+ *)
+ let count_slashes = List.map (String.count_chars '/') remainders in
+ let nr_slashes = List.hd count_slashes in
+ List.iter (fun nr -> assert (nr_slashes = nr)) count_slashes;
+
+ (* Now we need to generate "*/*/*" for this number of slashes. *)
+ let stars = List.make (nr_slashes+1) "*" in
+ let stars_n_slashes = String.concat "/" stars in
+
+ (* Construct the final wildcard. Note we only need to
+ * escape the prefix (the only part which is user content).
+ *)
+ fnmatch_escape prefix ^ stars_n_slashes ^ ".vmdk"
+
module VDDK = struct
let to_string options args =
let xs = "-it vddk" :: args in
@@ -415,24 +462,14 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
* instance of nbdkit.
*)
if Nbdkit.probe_plugin_parameter "vddk" "export=" then (
- let wildcard =
- match files with
- | [] -> assert false (* can't happen, see assert above *)
- | [f] -> fnmatch_escape f
- | files ->
- (* Calculate the longest common prefix across all the files,
- * then set the wildcard to this.
- * XXX May not work if there are subdirectories?
- * XXX Is every file we want to read called *.vmdk?
- *)
- let prefix = String.longest_common_prefix files in
- fnmatch_escape prefix ^ "*.vmdk" in
-
let socket = sprintf "%s/in0" dir in
On_exit.unlink socket;
let nbdkit = create_nbdkit_vddk () in
+
+ let wildcard = get_vddk_export_wildcard files in
Nbdkit.add_arg nbdkit "export" wildcard;
+
let _, pid = Nbdkit.run_unix socket nbdkit in
On_exit.kill pid;

View File

@ -1,127 +0,0 @@
From c1119abb08bc27609f99f99a4d2f5c8e71f06cd5 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 20 Oct 2025 14:50:07 +0100
Subject: [PATCH] input/input_vddk.ml: Pass only longest prefix to vddk export
parameter
See discussion on https://gitlab.com/nbdkit/nbdkit/-/merge_requests/113
nbdkit commit 01b429c412 ("vddk: Don't use FNM_PATHNAME when matching
export parameter") removes the FNM_PATHNAME restriction, so we can
just use the longest common prefix again.
This change requires nbdkit >= 1.45.11. I think it's time to raise
the minimum version of nbdkit anyway, so starting with virt-v2v 2.10,
nbdkit 1.46 will be required. If you use too old nbdkit you will see
the error:
virt-v2v: error: nbdkit must be >= 1.45.11 for input from VDDK
This partially reverts commit ba86b22c75 ("input/input_vddk.ml: Handle
subdirectories in nbdkit vddk export wildcard") but I didn't actually
revert that commit because I wanted to keep the explantory comments in
the code.
Reverts: commit ba86b22c75
Related: https://gitlab.com/nbdkit/nbdkit/-/merge_requests/113
Related: https://gitlab.com/nbdkit/nbdkit/-/commit/01b429c412504a491a4b5cc009a9c2e906f993ef
Related: https://issues.redhat.com/browse/RHEL-121728
Cherry picked from commit dda93d7fd3ef5b2cdf25cfefa0b2d41207fa54f6,
but remove the hard test for nbdkit >= 1.45.11, and replace it with
an RPM dependency.
---
README | 2 +-
input/input_vddk.ml | 46 ++++++++++++++++-----------------------------
2 files changed, 17 insertions(+), 31 deletions(-)
diff --git a/README b/README
index 407869b4..b21cb87d 100644
--- a/README
+++ b/README
@@ -56,7 +56,7 @@ REQUIREMENTS
* OCaml bindings for libnbd
-* nbdkit >= 1.28 (https://gitlab.com/nbdkit/nbdkit)
+* nbdkit >= 1.45.11 (https://gitlab.com/nbdkit/nbdkit)
* These nbdkit plugins and filters:
diff --git a/input/input_vddk.ml b/input/input_vddk.ml
index 7fd416b9..f420192b 100644
--- a/input/input_vddk.ml
+++ b/input/input_vddk.ml
@@ -36,11 +36,15 @@ open Input
let libNN = sprintf "lib%d" Sys.word_size
(* Calculate the nbdkit vddk plugin 'export' parameter. This is a
- * wildcard that must match all filenames given. nbdkit uses
- * 'fnmatch (export, filename, FNM_PATHNAME)' when checking this,
- * which means:
- * - We have to escape any fnmatch-special chars such as '[' and '*'
- * - '*' does not match '/' characters in the filename
+ * wildcard that must match all filenames given.
+ *
+ * nbdkit 1.44 used 'fnmatch (export, filename, FNM_PATHNAME)'
+ * which means '*' does not match '/' characters in the filename.
+ * Unfortunately this made it impossible to match certain paths,
+ * in particular if the guest has some files in a subdirectory.
+ *
+ * nbdkit 1.46 relaxes this to 'fnmatch (export, filename, 0)',
+ * so a simple longest prefix works.
*)
let get_vddk_export_wildcard = function
| [] -> assert false (* can't happen, checked by the caller *)
@@ -50,37 +54,14 @@ let get_vddk_export_wildcard = function
List.iter (fun f -> assert (String.ends_with ".vmdk" f)) files;
(* Calculate the longest common prefix of all the filenames.
- * Remove the prefix from each filename, leaving the remainder strings.
- * eg.
- * "foobar", "foobazs" => prefix = "fooba", remainders = ["r", "zs"]
+ * eg. "foobar", "foobazs" => prefix = "fooba"
*)
let prefix = String.longest_common_prefix files in
- let prefix_len = String.length prefix in
- let remainders = List.map (
- fun f ->
- let n = String.length f in
- assert (prefix_len <= n);
- String.sub f prefix_len (n - prefix_len)
- ) files in
-
- (* The number of '/' (slash) characters in the remainders must be
- * the same, otherwise there's something weird with subdirectories
- * going on that we can't handle yet. (XXX If this happens, then
- * we'd need to change nbdkit because it cannot possibly handle
- * a wildcard that matches different directory depths).
- *)
- let count_slashes = List.map (String.count_chars '/') remainders in
- let nr_slashes = List.hd count_slashes in
- List.iter (fun nr -> assert (nr_slashes = nr)) count_slashes;
-
- (* Now we need to generate "*/*/*" for this number of slashes. *)
- let stars = List.make (nr_slashes+1) "*" in
- let stars_n_slashes = String.concat "/" stars in
(* Construct the final wildcard. Note we only need to
* escape the prefix (the only part which is user content).
*)
- fnmatch_escape prefix ^ stars_n_slashes ^ ".vmdk"
+ fnmatch_escape prefix ^ "*.vmdk"
module VDDK = struct
let to_string options args =
@@ -283,6 +264,11 @@ information on these settings.
(* Check we have nbdkit and the vddk plugin and the cow filter. *)
if not (Nbdkit.is_installed ()) then
error (f_"nbdkit is not installed or not working");
+(* Remove this test for RHEL 10.1-z, we will enforce it through
+ RPM dependencies instead.
+ if not (Nbdkit.version () >= (1, 45, 11)) then
+ error (f_"nbdkit must be >= 1.45.11 for input from VDDK");
+*)
if not (Nbdkit.probe_plugin "vddk") then
error (f_"nbdkit-vddk-plugin is not installed");
if not (Nbdkit.probe_filter "cow") then

View File

@ -1,364 +0,0 @@
From 4b5e135960edde0091aa25fd070934fa643c5299 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 26 Aug 2025 12:33:18 +0100
Subject: [PATCH] v2v: Add --memsize and --smp options
For a long time in virt-builder and virt-customize, we have had
options --memsize and --smp which let you override the default amount
of memory and number of vCPUs assigned to the libguestfs appliance.
Usually virt-builder / virt-customize choose suitable numbers, but
occasionally (for example if you need to --install a large package or
--run a heavyweight program) we cannot anticipate what is needed so
it's useful to allow these to be overridden by the user.
Virt-v2v by default choses 2560MB and min (8, NR_CPUS) for these.
However much the same as above applies, especially since we added
virt-customize features to virt-v2v. It's useful to have these
options as additional control or to "just get it working", although
generally we should still try to make virt-v2v choose good defaults.
Also add the same options to virt-v2v-in-place and virt-v2v-inspector.
(cherry picked from commit 03b656ed468ecbe309e7cca24721de9369d476aa)
---
convert/convert.ml | 29 ++++++++++++++++++++++++-----
convert/convert.mli | 2 ++
docs/virt-v2v-in-place.pod | 17 +++++++++++++++++
docs/virt-v2v-inspector.pod | 6 ++++++
docs/virt-v2v.pod | 17 +++++++++++++++++
in-place/in_place.ml | 13 +++++++++++++
inspector/inspector.ml | 13 +++++++++++++
v2v/v2v.ml | 13 +++++++++++++
8 files changed, 105 insertions(+), 5 deletions(-)
diff --git a/convert/convert.ml b/convert/convert.ml
index 6c78bd99..0b6c88f9 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -34,8 +34,10 @@ type options = {
block_driver : guestcaps_block_type;
keep_serial_console : bool;
ks : key_store;
+ memsize : int option;
network_map : Networks.t;
root_choice : root_choice;
+ smp : int option;
static_ips : static_ip list;
customize_ops : Customize_cmdline.ops;
}
@@ -54,11 +56,28 @@ let rec convert input_disks 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.
- *)
- g#set_smp (min 8 (Sysconf.nr_processors_online ()));
+ let memsize =
+ match options.memsize with
+ | None ->
+ (* Default (if [--memsize] option is not used) is to calculate
+ * some multiple of the libguestfs default memory size.
+ *)
+ g#get_memsize () * 2
+ | Some memsize -> memsize in
+ g#set_memsize memsize;
+ let smp =
+ match options.smp with
+ | None ->
+ (* Default (if [--smp] option is not used) is to set the number
+ * according to the number of physical CPUs on the host, but
+ * limit it because each vCPU consumes guest RAM. This is
+ * necessary to allow parallel mkinitrd which greatly improves
+ * performance.
+ *)
+ min 8 (Sysconf.nr_processors_online ())
+ | Some smp -> smp in
+ g#set_smp smp;
+
(* The network is used by the unconfigure_vmware () function, and the "--key
* ID:clevis" command line options (if any). *)
g#set_network true;
diff --git a/convert/convert.mli b/convert/convert.mli
index b34f04e0..85ed05cb 100644
--- a/convert/convert.mli
+++ b/convert/convert.mli
@@ -20,8 +20,10 @@ type options = {
block_driver : Types.guestcaps_block_type; (** [--block-driver] option *)
keep_serial_console : bool;
ks : Tools_utils.key_store; (** [--key] option *)
+ memsize : int option; (** [--memsize] option *)
network_map : Networks.t; (** [-b] and [-n] options *)
root_choice : Types.root_choice; (** [--root] option *)
+ smp : int option; (** [--smp] option *)
static_ips : Types.static_ip list; (** [--mac :ip:] option *)
customize_ops : Customize_cmdline.ops; (** virt-customize options *)
}
diff --git a/docs/virt-v2v-in-place.pod b/docs/virt-v2v-in-place.pod
index 9714bbac..2d1857b9 100644
--- a/docs/virt-v2v-in-place.pod
+++ b/docs/virt-v2v-in-place.pod
@@ -197,6 +197,14 @@ This option is used to make the output more machine friendly
when being parsed by other programs. See
L<virt-v2v(1)/Machine readable output>.
+=item B<-m> MB
+
+=item B<--memsize> MB
+
+Change the amount of memory allocated when doing the conversion.
+Virt-v2v-in-place will usually choose a suitable default. Increase
+this if you see that the conversion step is running out of memory.
+
=item B<-n> in:out
=item B<-n> out
@@ -244,6 +252,15 @@ This disables progress bars and other unnecessary output.
Choose the root filesystem to be converted. See the documentation of
this option in L<virt-v2v(1)>.
+=item B<--smp> N
+
+Change the number of virtual CPUs used when doing the conversion.
+Virt-v2v-in-place will usually choose a suitable default.
+
+Increasing this beyond 8 may improve conversion performance, if your
+host has sufficient physical CPUs. You may also need to increase the
+memory size (I<--memsize> option).
+
=item B<-v>
=item B<--verbose>
diff --git a/docs/virt-v2v-inspector.pod b/docs/virt-v2v-inspector.pod
index 29adcb56..26770459 100644
--- a/docs/virt-v2v-inspector.pod
+++ b/docs/virt-v2v-inspector.pod
@@ -194,6 +194,10 @@ virt-v2v-inspector.
=item B<--machine-readable>=format
+=item B<-m> MB
+
+=item B<--memsize> MB
+
=item B<-n> ...
=item B<--network> ...
@@ -204,6 +208,8 @@ virt-v2v-inspector.
=item B<--root> ...
+=item B<--smp> N
+
=item B<--wrap>
These options work in the same way as the equivalent virt-v2v options.
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index b63da9f3..76a53e34 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -386,6 +386,14 @@ This option is used to make the output more machine friendly
when being parsed by other programs. See
L</Machine readable output> below.
+=item B<-m> MB
+
+=item B<--memsize> MB
+
+Change the amount of memory allocated when doing the conversion.
+Virt-v2v will usually choose a suitable default. Increase this if you
+see that the conversion step is running out of memory.
+
=item B<-n> in:out
=item B<-n> out
@@ -646,6 +654,15 @@ would mean to use the second partition on the first hard drive. If
the named root device does not exist or was not detected as a root
device, then virt-v2v will fail.
+=item B<--smp> N
+
+Change the number of virtual CPUs used when doing the conversion.
+Virt-v2v will usually choose a suitable default.
+
+Increasing this beyond 8 may improve conversion performance, if your
+host has sufficient physical CPUs. You may also need to increase the
+memory size (I<--memsize> option).
+
=item B<-v>
=item B<--verbose>
diff --git a/in-place/in_place.ml b/in-place/in_place.ml
index dba0772c..2ee3abc4 100644
--- a/in-place/in_place.ml
+++ b/in-place/in_place.ml
@@ -66,6 +66,11 @@ let rec main () =
)
in
+ let memsize = ref None in
+ let set_memsize arg = memsize := Some arg in
+ let smp = ref None in
+ let set_smp arg = smp := Some arg in
+
let network_map = Networks.create () in
let output_xml = ref No_output_xml in
@@ -173,6 +178,8 @@ let rec main () =
s_"Use password from file to connect to input hypervisor";
[ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac),
s_"Map NIC to network or bridge or assign static IP";
+ [ S 'm'; L"memsize" ], Getopt.Int ("mb", set_memsize),
+ s_"Set memory size";
[ S 'n'; L"network" ], Getopt.String ("in:out", add_network),
s_"Map network in to out";
[ S 'O' ], Getopt.String ("output.xml", set_output_xml_option),
@@ -181,6 +188,8 @@ let rec main () =
s_"Print source and stop";
[ L"root" ], Getopt.String ("ask|... ", set_root_choice),
s_"How to choose root filesystem";
+ [ L"smp" ], Getopt.Int ("vcpus", set_smp),
+ s_"Set number of vCPUs";
] in
(* Append virt-customize options. *)
@@ -233,9 +242,11 @@ 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 memsize = !memsize in
let output_xml = !output_xml in
let print_source = !print_source in
let root_choice = !root_choice in
+ let smp = !smp in
let static_ips = !static_ips in
(* No arguments and machine-readable mode? Print out some facts
@@ -295,8 +306,10 @@ read the man page virt-v2v-in-place(1).
Convert.block_driver = Virtio_blk;
keep_serial_console = true;
ks = opthandle.ks;
+ memsize;
network_map;
root_choice;
+ smp;
static_ips;
customize_ops;
} in
diff --git a/inspector/inspector.ml b/inspector/inspector.ml
index 50b8f711..752a5c1c 100644
--- a/inspector/inspector.ml
+++ b/inspector/inspector.ml
@@ -65,6 +65,11 @@ let rec main () =
)
in
+ let memsize = ref None in
+ let set_memsize arg = memsize := Some arg in
+ let smp = ref None in
+ let set_smp arg = smp := Some arg in
+
let network_map = Networks.create () in
let static_ips = ref [] in
let rec add_network str =
@@ -164,12 +169,16 @@ let rec main () =
s_"Input transport";
[ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac),
s_"Map NIC to network or bridge or assign static IP";
+ [ S 'm'; L"memsize" ], Getopt.Int ("mb", set_memsize),
+ s_"Set memory size";
[ 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),
s_"Set the output filename";
[ L"root" ], Getopt.String ("ask|... ", set_root_choice),
s_"How to choose root filesystem";
+ [ L"smp" ], Getopt.Int ("vcpus", set_smp),
+ s_"Set number of vCPUs";
] in
(* Append virt-customize options. *)
@@ -223,7 +232,9 @@ read the man page virt-v2v-inspector(1).
| Some "vddk" -> Some Input.VDDK
| Some transport ->
error (f_"unknown input transport -it %s") transport in
+ let memsize = !memsize in
let root_choice = !root_choice in
+ let smp = !smp in
let static_ips = !static_ips in
(* No arguments and machine-readable mode? Print out some facts
@@ -276,8 +287,10 @@ read the man page virt-v2v-inspector(1).
Convert.block_driver = Virtio_blk;
keep_serial_console = true;
ks = opthandle.ks;
+ memsize;
network_map;
root_choice;
+ smp;
static_ips;
customize_ops;
} in
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index c274baa0..20082544 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -73,7 +73,12 @@ let rec main () =
)
in
+ let memsize = ref None in
+ let set_memsize arg = memsize := Some arg in
let parallel = ref 1 in
+ let smp = ref None in
+ let set_smp arg = smp := Some arg in
+
let network_map = Networks.create () in
let static_ips = ref [] in
let rec add_network str =
@@ -216,6 +221,8 @@ let rec main () =
s_"Use virt-v2v-in-place instead";
[ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac),
s_"Map NIC to network or bridge or assign static IP";
+ [ S 'm'; L"memsize" ], Getopt.Int ("mb", set_memsize),
+ s_"Set memory size";
[ S 'n'; L"network" ], Getopt.String ("in:out", add_network),
s_"Map network in to out";
[ S 'o' ], Getopt.String (output_modes, set_output_mode),
@@ -240,6 +247,8 @@ let rec main () =
s_"Print source and stop";
[ L"root" ], Getopt.String ("ask|... ", set_root_choice),
s_"How to choose root filesystem";
+ [ L"smp" ], Getopt.Int ("vcpus", set_smp),
+ s_"Set number of vCPUs";
] in
(* Append virt-customize options. *)
@@ -299,6 +308,7 @@ read the man page virt-v2v(1).
| Some "vddk" -> Some Input.VDDK
| Some transport ->
error (f_"unknown input transport -it %s") transport in
+ let memsize = !memsize in
let output_alloc =
match !output_alloc with
| `Not_set | `Sparse -> Types.Sparse
@@ -310,6 +320,7 @@ read the man page virt-v2v(1).
error (f_"--parallel parameter must be >= 1");
let print_source = !print_source in
let root_choice = !root_choice in
+ let smp = !smp in
let static_ips = !static_ips in
(* No arguments and machine-readable mode? Print out some facts
@@ -402,8 +413,10 @@ read the man page virt-v2v(1).
Convert.block_driver = Virtio_blk;
keep_serial_console = not remove_serial_console;
ks = opthandle.ks;
+ memsize;
network_map;
root_choice;
+ smp;
static_ips;
customize_ops;
} in

View File

@ -1,60 +0,0 @@
From edfb40af35c5922b6f7a5595f95f063b3a31fcba Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 30 Oct 2025 17:48:39 +0000
Subject: [PATCH] docs: Add more description for --memsize option
The adjustable --memsize option, which increases the amount of memory
available in the appliance, is necessary to work around at least one
unfixable setfiles / glibc bug. Document in more detail what this
option does in a new section, and mention this issue. (As the issue
can't be fixed properly, this is a documentation-only fix).
Fixes: https://issues.redhat.com/browse/RHEL-125116
(cherry picked from commit 9bb2e7d4705811f0e227103c14757895e5f591d9)
---
docs/virt-v2v.pod | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
index 76a53e34..ff31bb00 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -394,6 +394,8 @@ Change the amount of memory allocated when doing the conversion.
Virt-v2v will usually choose a suitable default. Increase this if you
see that the conversion step is running out of memory.
+See also L</Adjusting memory available for conversion>.
+
=item B<-n> in:out
=item B<-n> out
@@ -742,11 +744,27 @@ alleviate this.
=head2 Compute power and RAM
+Virt-v2v can be run in a virtual machine, but may run faster on bare
+metal.
+
Virt-v2v is not especially compute or RAM intensive. If you are
running many parallel conversions, then you may consider allocating
-one CPU core and 2 GB of RAM per running instance.
+one CPU core and 2 GB of RAM per running instance. (You may adjust
+the amount of memory used by conversion, see the next heading.)
-Virt-v2v can be run in a virtual machine.
+=head2 Adjusting memory available for conversion
+
+Virt-v2v I<--memsize=N> can be used to increase the amount of memory
+available to do conversion. This rarely needs to be adjusted, but can
+help to workaround some conversion problems.
+
+=head3 Linux: setfiles runs out of memory when relabelling
+
+For Linux guests that use SELinux, setfiles can run out of memory if a
+single directory contains millions of files. As there is no simple
+way for virt-v2v to detect this problem in advance, you may have to
+use I<--memsize=4000> (or larger) to convert such guests. For details
+see L<https://issues.redhat.com/browse/RHEL-125116>
=head2 Trimming

View File

@ -1,303 +0,0 @@
From ce2cb1b89e8431c1090c327246ff11a17a89d012 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)
(cherry picked from commit f937f290a4c032c971ad78d1b07e8aefe15eab8a)
---
convert/convert.ml | 10 +++++++--
convert/convert.mli | 1 +
docs/virt-v2v-in-place.pod | 4 ++++
docs/virt-v2v-inspector.pod | 2 ++
docs/virt-v2v.pod | 6 +++++
in-place/in_place.ml | 5 +++++
inspector/inspector.ml | 6 +++++
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 0b6c88f9..f2676fe9 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. *)
@@ -135,8 +136,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 85ed05cb..13d80351 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 *)
}
val convert : NBD_URI.t list -> options -> Types.source ->
diff --git a/docs/virt-v2v-in-place.pod b/docs/virt-v2v-in-place.pod
index 2d1857b9..78a3314e 100644
--- a/docs/virt-v2v-in-place.pod
+++ b/docs/virt-v2v-in-place.pod
@@ -227,6 +227,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/docs/virt-v2v-inspector.pod b/docs/virt-v2v-inspector.pod
index 26770459..65ce71ce 100644
--- a/docs/virt-v2v-inspector.pod
+++ b/docs/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/docs/virt-v2v.pod b/docs/virt-v2v.pod
index ff31bb00..38dc475a 100644
--- a/docs/virt-v2v.pod
+++ b/docs/virt-v2v.pod
@@ -418,6 +418,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>.
@@ -792,6 +796,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 2ee3abc4..0021089f 100644
--- a/in-place/in_place.ml
+++ b/in-place/in_place.ml
@@ -150,6 +150,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 =
@@ -184,6 +185,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),
@@ -242,6 +245,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
@@ -312,6 +316,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/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/tests/Makefile.am b/tests/Makefile.am
index df221b73..8048612e 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -91,6 +91,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 \
@@ -279,6 +280,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 20082544..0cad36af 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -79,6 +79,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 =
@@ -241,6 +243,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,
@@ -309,6 +313,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
@@ -419,6 +424,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,52 +0,0 @@
From 6d42e902a74d1d7053c4c14050c8b4b412f6ab1f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 15 Apr 2026 11:22:34 +0100
Subject: [PATCH] convert: Stop using maxmem (xfs_repair -m option)
We originally introduced this option in commit dba4f0d3ba ("convert:
Limit the amount of memory used by xfs_repair"). In the same commit
we also started to use noprefetch (xfs_repair -P). This was to avoid
xfs_repair taking too much memory, causing OOM errors.
However the -m option turns out to be deprecated. It has a number of
problems and sharp edges, including that it overestimates the amount
of memory required (often, greatly), its estimates are not very
accurate, and it prints a localized error message that libguestfs
needs to parse to obtain useful information.
xfs_repair has internal logic already to find the available physical
memory and limit memory usage. This also operates even if the -m
option is not used.
The beneficial option is noprefetch (-P) which limits the caching that
xfs_repair does. Leave that one alone.
Reported-by: Ming Xie
Thanks: Eric Sandeen, Dave Chinner
Related: https://redhat.atlassian.net/browse/RHEL-165677
(cherry picked from commit 788bd68663cfc4535753623faa25180fd35f0893)
---
convert/convert.ml | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/convert/convert.ml b/convert/convert.ml
index f2676fe9..d8b90d73 100644
--- a/convert/convert.ml
+++ b/convert/convert.ml
@@ -312,13 +312,11 @@ and do_fsck ?(before=false) g =
*)
let nomodify = true
(* xfs_repair runs out of memory in the low memory environment
- * of the appliance unless we limit the amount of memory it will
- * use here.
+ * of the appliance unless we disable prefetch.
*)
- and noprefetch = true
- and maxmem = Int64.of_int (g#get_memsize () / 2) in
+ and noprefetch = true in
- if g#xfs_repair ~maxmem ~noprefetch ~nomodify dev <> 0 then
+ if g#xfs_repair ~noprefetch ~nomodify dev <> 0 then
error (f_"detected errors on the XFS filesystem on %s") dev
| _, _ ->

View File

@ -1,53 +0,0 @@
From 11c3421fd248d5b02f521a96ddc95e05e46eaac3 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 23 Apr 2026 15:42:12 +0100
Subject: [PATCH] Update common submodule
Richard W.M. Jones (1):
mldrivers/firmware.ml: Ignore CHS geometry error from parted
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 10fed783..06905cd1:
diff --git a/common/mldrivers/firmware.ml b/common/mldrivers/firmware.ml
index ee0a7caf..6698b073 100644
--- a/common/mldrivers/firmware.ml
+++ b/common/mldrivers/firmware.ml
@@ -18,6 +18,7 @@
open Printf
+open Std_utils
open Tools_utils
module G = Guestfs
@@ -28,12 +29,22 @@ type i_firmware =
let detect_firmware g =
let parttype_is_gpt dev =
- try g#part_get_parttype dev = "gpt"
- with G.Error msg as exn ->
- (* If it's _not_ "unrecognised disk label" then re-raise it. *)
- if g#last_errno () <> G.Errno.errno_EINVAL then raise exn;
- debug "%s (ignored)" msg;
- false
+ try
+ g#part_get_parttype dev = "gpt"
+ with
+ | G.Error msg when String.find msg "CHS geometry" >= 0 ->
+ (* Parted has poor handling of "sun" partition types, always
+ * issuing a warning because the CHS doesn't match the physical
+ * geometry. Ignore this as we don't care about it in this
+ * function (RHEL-165220).
+ *)
+ debug "%s (ignored)" msg;
+ false
+ | G.Error msg as exn ->
+ (* If it's _not_ "unrecognised disk label" then re-raise it. *)
+ if g#last_errno () <> G.Errno.errno_EINVAL then raise exn;
+ debug "%s (ignored)" msg;
+ false
in
let accumulate_partition (esp_parts, bboot) part =
let dev = g#part_to_dev part in

View File

@ -7,7 +7,7 @@ set -e
# ./copy-patches.sh
project=virt-v2v
rhel_version=10.1
rhel_version=10.2
# Check we're in the right directory.
if [ ! -f $project.spec ]; then

7
gating.yaml Executable file
View File

@ -0,0 +1,7 @@
--- !Policy
product_versions:
- rhel-*
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
- !PassingTestCaseRule {test_case_name: libvirt-ci.v2v.brew-build.gating.x86_64.tier1.functional}

BIN
libguestfs.keyring Normal file

Binary file not shown.

10
rpminspect.yaml Normal file
View File

@ -0,0 +1,10 @@
# config docs: https://github.com/rpminspect/rpminspect/blob/main/data/generic.yaml
# real example: https://gitlab.com/redhat/centos-stream/rpms/python3.14/-/blob/c10s/rpminspect.yaml
# annocheck has known issues with ocaml binaries
# https://issues.redhat.com/browse/RHEL-44303
annocheck:
ignore:
- '/usr/bin/virt-v2v*'
- '/usr/libexec/virt-v2v*'

View File

@ -1,2 +1,2 @@
SHA512 (libguestfs.keyring) = 297a15edc7c220222b9f650e0a9361ae132d3f0fed04aeb2237a1d9c3f6dac6f336846434f66480faed72635a33f659e849b052e74b88d1508aeff03f8c9a2ac
SHA512 (virt-v2v-2.8.1.tar.gz) = 70da68563e870955ca013e6d55be8f56ad65dde6f84909f06fae7ab928227a566e8949bb90e839fffce2ad4ebc604b2cfa1c5547394c8d1bd092bb95f9e6435c
SHA512 (virt-v2v-2.10.0.tar.gz) = 035f2181c1cc5f482e96d3e21b513b95939ca224d71ac6ad938842d5af5d60ef07db1600d2ccb609dc2042b1c74088f6f39ffbe595cb51e80278ecb50c314515
SHA512 (virt-v2v-2.10.0.tar.gz.sig) = cb6301224ef00577a9cd0fc8fa504e583eb447341bd3849e6854f2d78ae72ca39bca68b70f30efd3d1d64480acf161c5e4bc9ba943595ef4dd2a654c3268aa66

13
tests/basic-test.sh Executable file
View File

@ -0,0 +1,13 @@
#!/bin/bash -
set -e
set -x
# This only makes sure that virt-v2v isn't totally broken.
# virt-v2v is extensively tested on real guests by the QE
# team using a mix of automated and manual testing.
# Fix libvirt.
systemctl restart virtqemud virtsecretd virtstoraged virtnetworkd
virt-builder fedora-30
virt-v2v -i disk fedora-30.img -o null

13
tests/tests.yml Normal file
View File

@ -0,0 +1,13 @@
- hosts: localhost
roles:
- role: standard-test-basic
tags:
- classic
required_packages:
- virt-v2v
- guestfs-tools
- libvirt-daemon-kvm
tests:
- simple:
dir: .
run: ./basic-test.sh

View File

@ -1,17 +0,0 @@
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAmhdYdMRHHJpY2hAYW5u
ZXhpYS5vcmcACgkQkXOPc+G3aKD8Lg/2KysBtKtSnEhMUKhvSzIyj8nIB/qFB+hV
4BPxLeRyW5DgDIN+caJ5DwR50U/wNsK3xpMYApyDHyBcYflzoSh1yul0IGKaTH9n
zGrBxkjHblAJkV4aA0BDkczJcR/PcRR8y+2v6o5XeiP4Ih90l1lGWcregY9H4oi9
7ExxibkWMn1E35iqIO3Yhaei7tBU7Z6IYztqrNnmZW7hkkJvrnYq3i/TZiU5n3zq
77ounYTp7aM4py6FtN01/M5nIhXULt2vwegs9Tt9gWen+BPyvME9Ul2ESvkF8lS1
7/4JuPXPoGsMy5KDMvCKMmoau+8WYNaARVg35+rTx4UIg3GDGPjcZkauquJTztgx
n6wLP0LqiyVdE58r3N84VJo949wSi8JoyCZ1rUSgTe50UVsVItFmvWwZkjB5Frk5
uARpa7KFD5udVCaVYh6MN4CDT19re5WfadYOocoETIRKGzz7W4+OzsMtuURYCdL7
d8Yk2XNFwPDNEM3f+5l2FjDu8LyYrhPO9CTY2swxsLFMpVGCYIAruDgY4FqVg6s5
pG8zdQo9u6wVOWs4wxZsoY7GGdjDo6COvDgDOHjI3OQMVa8IszJVliJqxefHFEKg
ouAwqg/HrrzyzJtFmPCfMHodYJF0YF1zgMZnT/n/CyCelP6tGETR/xyPaVtcd8cu
IbrfJq2HWg==
=IwRf
-----END PGP SIGNATURE-----

View File

@ -2,12 +2,50 @@
%global verify_tarball_signature 1
# The source directory.
%global source_directory 2.8-stable
%global source_directory 2.10-stable
%if !0%{?rhel}
# Optional features enabled in this build for Fedora.
%global with_block_driver 1
%global with_glance 1
%global with_ovirt 1
%global with_xen 1
# 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}
# Version extra string for Fedora.
%global version_extra fedora=%{fedora},release=%{release}
%else
# Optional features enabled in this build for RHEL.
%global with_block_driver 0
%global with_glance 0
%global with_ovirt 0
%global with_xen 0
# Architectures where virt-v2v is shipped on RHEL:
#
# 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
# Version extra string for RHEL.
%global version_extra rhel=%{rhel},release=%{release}
%endif
Name: virt-v2v
Epoch: 1
Version: 2.8.1
Release: 22%{?dist}
Version: 2.10.0
Release: 7%{?dist}
Summary: Convert a virtual machine to run on KVM
License: GPL-2.0-or-later AND LGPL-2.0-or-later
@ -24,85 +62,59 @@ Source2: libguestfs.keyring
Source3: copy-patches.sh
# Patches are maintained in the following repository:
# https://github.com/libguestfs/virt-v2v/commits/rhel-10.1
# https://github.com/libguestfs/virt-v2v/commits/rhel-10.2
# Patches.
Patch0001: 0001-docs-Move-oo-verify-server-certificate-docs-to-alpha.patch
Patch0002: 0002-input-input_vddk.ml-Fix-escaping-of-export-.-paramet.patch
Patch0003: 0003-Modify-configure_pnputil_install-script-to-check.patch
Patch0004: 0004-Update-the-common-submodule.patch
Patch0005: 0005-Ignore-ERROR_NO_MORE_ITEMS-status-from-PnPUtil.patch
Patch0006: 0006-v2v-Print-the-version-of-libnbd-nbdcopy-in-debug-out.patch
Patch0007: 0007-vddk-Remove-io-vddk-noextents-option.patch
Patch0008: 0008-curl-ssh-vddk-file-Add-nbdkit-count-filter.patch
Patch0009: 0009-o-kubevirt-Add-oo-disk-to-allow-disk-names-to-be-ove.patch
Patch0010: 0010-output-Add-optional-create-parameter.patch
Patch0011: 0011-o-kubevirt-Add-oo-create-false-to-avoid-disk-creatio.patch
Patch0012: 0012-RHEL-Fixes-for-libguestfs-winsupport.patch
Patch0013: 0013-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch
Patch0014: 0014-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch
Patch0015: 0015-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch
Patch0016: 0016-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch
Patch0017: 0017-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch
Patch0018: 0018-RHEL-Remove-input-from-Xen.patch
Patch0019: 0019-RHEL-Remove-o-glance.patch
Patch0020: 0020-RHEL-tests-Remove-btrfs-test.patch
Patch0021: 0021-RHEL-Remove-block-driver-option.patch
Patch0022: 0022-RHEL-Remove-o-ovirt-o-ovirt-upload-and-o-vdsm-modes.patch
Patch0023: 0023-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch
Patch0024: 0024-remove-timeout-before-installing-virtio-win-drivers.patch
Patch0025: 0025-v2v-Fix-SELinux-relabelling.patch
Patch0026: 0026-RHEL-10-m4-Depend-on-libguestfs-1.56.1-2.el10-for-gu.patch
Patch0027: 0027-convert-Model-target-boot-device.patch
Patch0028: 0028-output-Add-boot-order-depending-on-target-boot-devic.patch
Patch0029: 0029-convert-Detect-target-boot-device-for-Linux-guests.patch
Patch0030: 0030-output-kubevirt-Add-bootOrder-to-Kubevirt-YAML.patch
Patch0031: 0031-convert-Look-for-GRUB-signature-first-to-identify-bo.patch
Patch0032: 0032-lib-types.ml-Fix-formatting-of-debug-message.patch
Patch0033: 0033-convert-windows-Fix-ESP-conversion-if-C-Windows-Temp.patch
Patch0034: 0034-Update-common-submodule.patch
Patch0035: 0035-RHEL-output-output.ml-Remove-cache-none.patch
Patch0036: 0036-input-input_vddk.ml-Handle-subdirectories-in-nbdkit-.patch
Patch0037: 0037-input-input_vddk.ml-Pass-only-longest-prefix-to-vddk.patch
Patch0038: 0038-v2v-Add-memsize-and-smp-options.patch
Patch0039: 0039-docs-Add-more-description-for-memsize-option.patch
Patch0040: 0040-convert-convert_linux.ml-Add-debian-12-UEFI.patch
Patch0041: 0041-input-vcenter-double-uri_encode-dcPath-and-dsName.patch
Patch0042: 0042-Update-common-submodule.patch
Patch0043: 0043-Add-no-fstrim-option-to-disable-fstrim-during-conver.patch
Patch0044: 0044-convert-Stop-using-maxmem-xfs_repair-m-option.patch
Patch0045: 0045-Update-common-submodule.patch
%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:
#
# 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
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
BuildRequires: autoconf, automake, libtool
BuildRequires: make
BuildRequires: /usr/bin/pod2man
BuildRequires: perl(Pod::Usage)
BuildRequires: perl(Getopt::Long)
BuildRequires: perl(IPC::Run3)
BuildRequires: gcc
BuildRequires: ocaml >= 4.08
BuildRequires: libguestfs-devel >= 1:1.56.1-2.el10
BuildRequires: libguestfs-devel >= 1:1.58.1-2
BuildRequires: augeas-devel
BuildRequires: bash-completion
%if 0%{?fedora} || 0%{?rhel} >= 11
BuildRequires: bash-completion-devel
%endif
BuildRequires: file
BuildRequires: gettext-devel
BuildRequires: json-c-devel
BuildRequires: libnbd-devel >= 1.14
BuildRequires: libnbd-devel >= 1.24
BuildRequires: libosinfo-devel
BuildRequires: libvirt-daemon-kvm
BuildRequires: libvirt-devel
@ -126,11 +138,9 @@ BuildRequires: glibc-utils
BuildRequires: %{_bindir}/qemu-nbd
BuildRequires: %{_bindir}/nbdcopy
BuildRequires: %{_bindir}/nbdinfo
BuildRequires: nbdkit-server >= 1.46.1
BuildRequires: nbdkit-file-plugin
BuildRequires: nbdkit-null-plugin
%if !0%{?rhel}
BuildRequires: nbdkit-python-plugin
%endif
BuildRequires: nbdkit-cow-filter
BuildRequires: mingw-srvany-redistributable >= 1.1-6
%ifarch x86_64
@ -141,8 +151,8 @@ BuildRequires: glibc-static
BuildRequires: gnupg2
%endif
Requires: libguestfs%{?_isa} >= 1:1.56.1-2.el10
Requires: guestfs-tools >= 1.49.7-1
Requires: libguestfs%{?_isa} >= 1:1.58.1-2
Requires: guestfs-tools >= 1.54
# XFS is the default filesystem in Fedora and RHEL.
Requires: libguestfs-xfs
@ -168,24 +178,19 @@ Requires: edk2-ovmf
Requires: edk2-aarch64
%endif
%if !0%{?rhel}
%if !%{with_ovirt}
Requires: /usr/bin/python3
%else
%if 0%{?rhel} == 9
Requires: platform-python
# Python is not needed by RHEL 10.
%endif
%endif
Requires: libnbd >= 1.10
Requires: libnbd >= 1.24
Requires: %{_bindir}/qemu-nbd
Requires: %{_bindir}/nbdcopy
Requires: %{_bindir}/nbdinfo
Requires: nbdkit-server >= 1.44.1-3.el10_1
Requires: nbdkit-server >= 1.46.1
Requires: nbdkit-curl-plugin
Requires: nbdkit-file-plugin
Requires: nbdkit-nbd-plugin
Requires: nbdkit-null-plugin
%if !0%{?rhel}
%if !%{with_ovirt}
Requires: nbdkit-python-plugin
%endif
Requires: nbdkit-ssh-plugin
@ -193,9 +198,9 @@ Requires: nbdkit-ssh-plugin
Requires: nbdkit-vddk-plugin
%endif
Requires: nbdkit-blocksize-filter
Requires: nbdkit-count-filter
Requires: nbdkit-cow-filter
Requires: nbdkit-multi-conn-filter
Requires: nbdkit-noextents-filter
Requires: nbdkit-rate-filter
Requires: nbdkit-retry-filter
@ -261,11 +266,27 @@ autoreconf -fiv
%build
%configure \
%if !0%{?rhel}
--with-extra="fedora=%{fedora},release=%{release}" \
%if %{with_block_driver}
--enable-block-driver \
%else
--with-extra="rhel=%{rhel},release=%{release}" \
--disable-block-driver \
%endif
%if %{with_glance}
--enable-glance \
%else
--disable-glance \
%endif
%if %{with_ovirt}
--enable-ovirt \
%else
--disable-ovirt \
%endif
%if %{with_xen}
--enable-xen \
%else
--disable-xen \
%endif
--with-extra="%{version_extra}"
make V=1 %{?_smp_mflags}
@ -282,9 +303,6 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
mkdir -p $RPM_BUILD_ROOT%{_libexecdir}
mv $RPM_BUILD_ROOT%{_bindir}/virt-v2v-in-place $RPM_BUILD_ROOT%{_libexecdir}/
rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-in-place.1*
# these are also not supported on RHEL
rm -f $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-input-xen.1*
rm -f $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-output-ovirt.1*
%endif
# Find locale files.
@ -292,6 +310,23 @@ rm -f $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-output-ovirt.1*
%check
# Check that the binary runs and the features match those configured.
./run virt-v2v --version
./run virt-v2v --machine-readable | tee machine-readable.out
grep "virt-v2v-2.0" machine-readable.out
grep "input:disk" machine-readable.out
%if %{with_block_driver}
grep "block-driver-option" machine-readable.out
%endif
%if %{with_glance}
grep "output:glance" machine-readable.out
%endif
%if %{with_ovirt}
grep "output:ovirt$" machine-readable.out
grep "output:ovirt-upload" machine-readable.out
grep "output:vdsm" machine-readable.out
%endif
%ifarch x86_64
# Only run the tests with non-debug (ie. non-Rawhide) kernels.
# XXX This tests for any debug kernel installed.
@ -330,15 +365,17 @@ done
%{_mandir}/man1/virt-v2v.1*
%{_mandir}/man1/virt-v2v-hacking.1*
%{_mandir}/man1/virt-v2v-input-vmware.1*
%if !0%{?rhel}
%if %{with_xen}
%{_mandir}/man1/virt-v2v-input-xen.1*
%endif
%if !0%{?rhel}
%{_mandir}/man1/virt-v2v-in-place.1*
%endif
%{_mandir}/man1/virt-v2v-inspector.1*
%{_mandir}/man1/virt-v2v-open.1*
%{_mandir}/man1/virt-v2v-output-local.1*
%{_mandir}/man1/virt-v2v-output-openstack.1*
%if !0%{?rhel}
%if %{with_ovirt}
%{_mandir}/man1/virt-v2v-output-ovirt.1*
%endif
%{_mandir}/man1/virt-v2v-release-notes-1.42.1*
@ -362,54 +399,58 @@ done
%changelog
* Thu Apr 23 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-22
- Stop using maxmem (xfs_repair -m option)
resolves: RHEL-169173
- Fix CHS geometry error for Veritas/Sun partitions
resolves: RHEL-169224
* Tue Feb 17 2026 Cole Robinson <crobinso@redhat.com> - 2.10.0-7
- Attempt 2 to fix sles12sp5 crypttab
resolves: RHEL-93583
* Fri Apr 03 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-20
- Add --no-fstrim option
resolves: RHEL-164582
* Sun Feb 15 2026 Cole Robinson <crobinso@redhat.com> - 1:2.8.1-19
* Thu Feb 12 2026 Cole Robinson <crobinso@redhat.com> - 1:2.10.0-6
- Install blnsvr.exe to \Windows\Drivers\VirtIO
resolves: RHEL-149474
resolves: RHEL-148423
* Fri Jan 30 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-18
- Fix import when datastore name has characters like '+'
resolves: RHEL-145321
* Thu Jan 29 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-17
- Fix Debian 12 UEFI conversions
resolves: RHEL-144643
* Wed Jan 07 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-16
- Add --memsize and --smp options
resolves: RHEL-139153
* Tue Jan 06 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-15
- v2v can't convert guest with multiple windows OS on rhel10
- Add runtime requires for nbdkit-1.44.1-3.el10_1
resolves: RHEL-137304
* Mon Dec 15 2025 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-14
- Remove cache=none
resolves: RHEL-135750
* Mon Nov 17 2025 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-13
- Fix pnputil driver store after conversion
resolves: RHEL-128908
* Wed Oct 29 2025 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-12
* Wed Feb 11 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.10.0-5
- Rebase to virt-v2v 2.10.0
resolves: RHEL-111241
- Synchronize spec file with Fedora.
- Tighten permissions on windows C:\Program Files\Guestfs
resolves: RHEL-104352
- Don't output floppy XML with qemu lacks support
resolves: RHEL-90175
- convert: linux: Ignore /etc/lvm/archive/*.vg files
resolves: RHEL-113820
- mlcustomize/inject_virtio_win.ml: Use viostor.inf instead of guestor
resolves: RHEL-112517
- Fix for setting boot order for Linux guests based on grub location
resolves: RHEL-115989, RHEL-115990
- Remove virt-v2v subscription manager options
resolves: RHEL-122308
- Handle subdirectories in nbdkit vddk export wildcard
resolves: RHEL-121728
- Further fixes for nbdkit vddk export wildcard
resolves: RHEL-122753
- Fix ESP conversion if C:\Windows\Temp has alternate case
resolves: RHEL-124791
* Thu Sep 25 2025 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-10
- Fix setting boot order for Linux BIOS guests
resolves: RHEL-108991
- Set boot order for guests in -o kubevirt output mode
resolves: RHEL-110742
resolves: RHEL-124569
- setfiles runs out of memory in glibc fts_read (doc fix)
resolves: RHEL-125116
- Use AV and GPO information from inspection instead of open coding
resolves: RHEL-125956
- Remove reduce-memory-pressure=on as workaround for Dell Powermax 8000
resolves: RHEL-135617
- Hard depend on libnbd 1.24
resolves: RHEL-140894
- Add documentation about BitLocker Recovery
resolves: RHEL-103915
- Fix regression when converting vmx+ssh with snapshots
resolves: RHEL-102938
- Expose XFS version in virt-v2v-inspector
resolves: RHEL-144075
- Fix Debian 12 UEFI conversions
resolves: RHEL-144467
- Fix import when datastore name has characters like '+'
resolves: RHEL-133729
- Replace /etc/crypttab /dev/sdX with UUID
resolves: RHEL-93583
- Replace '/' in output name with '_'
resolves: RHEL-136479
* Thu Aug 21 2025 Richard W.M. Jones <rjones@redhat.com> - 1:2.8.1-9
- Rebase to virt-v2v 2.8.1