import CS virt-v2v-2.10.0-7.el10
This commit is contained in:
parent
591a3f3ea9
commit
1416614d19
16
.gitignore
vendored
16
.gitignore
vendored
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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;
|
||||
@ -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
|
||||
@ -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
|
||||
47
0003-input-ssh.ml-Fix-Ssh.remote_file_exists.patch
Normal file
47
0003-input-ssh.ml-Fix-Ssh.remote_file_exists.patch
Normal 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
|
||||
120
0004-Update-common-submodule.patch
Normal file
120
0004-Update-common-submodule.patch
Normal 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
|
||||
@ -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
|
||||
@ -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\
|
||||
177
0005-v2v-Enhance-inspection-with-filesystems-information.patch
Normal file
177
0005-v2v-Enhance-inspection-with-filesystems-information.patch
Normal 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 = "";
|
||||
131
0006-inspector-Enhance-virt-v2v-inspector-output-with-fil.patch
Normal file
131
0006-inspector-Enhance-virt-v2v-inspector-output-with-fil.patch
Normal 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. *)
|
||||
@ -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 |>
|
||||
@ -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
|
||||
*)
|
||||
@ -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.
|
||||
@ -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;
|
||||
|
||||
@ -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(-)
|
||||
112
0009-lib-Replace-nbdkit-file-cache-none-with-reduce-memor.patch
Normal file
112
0009-lib-Replace-nbdkit-file-cache-none-with-reduce-memor.patch
Normal 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;
|
||||
@ -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
|
||||
-guest’s disks are written to:
|
||||
+specified by I<-os /dir> (the directory must exist).
|
||||
+
|
||||
+By default the converted guest’s 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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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. *)
|
||||
4099
0012-build-replace-AM_GNU_GETTEXT-with-simpler-LIBINTL-ch.patch
Normal file
4099
0012-build-replace-AM_GNU_GETTEXT-with-simpler-LIBINTL-ch.patch
Normal file
File diff suppressed because it is too large
Load Diff
44
0013-docs-Drop-references-to-virtio-win-osinfo-usage.patch
Normal file
44
0013-docs-Drop-references-to-virtio-win-osinfo-usage.patch
Normal 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.
|
||||
30
0014-docs-update-virtio-win-exploded-tree-docs.patch
Normal file
30
0014-docs-update-virtio-win-exploded-tree-docs.patch
Normal 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
|
||||
|
||||
@ -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"
|
||||
85
0016-output-introduce-disk_name-helper.patch
Normal file
85
0016-output-introduce-disk_name-helper.patch
Normal 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
|
||||
71
0017-output-Replace-in-VM-names-with-_.patch
Normal file
71
0017-output-Replace-in-VM-names-with-_.patch
Normal 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
|
||||
@ -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 guest’s 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";
|
||||
@ -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;
|
||||
|
||||
@ -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 won’t 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.
|
||||
|
||||
27
0019-output-sanitize-VM-names-in-libvirt-XML.patch
Normal file
27
0019-output-sanitize-VM-names-in-libvirt-XML.patch
Normal 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
|
||||
@ -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"
|
||||
|
||||
@ -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;
|
||||
@ -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
@ -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
|
||||
@ -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
|
||||
@ -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 =
|
||||
@ -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\
|
||||
@ -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
|
||||
@ -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.
|
||||
@ -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.
|
||||
@ -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 = \
|
||||
@ -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
|
||||
@ -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} *)
|
||||
@ -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;
|
||||
@ -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'/>
|
||||
@ -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
|
||||
@ -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.
|
||||
33
0030-convert-linux-properly-match-etc-crypttab.patch
Normal file
33
0030-convert-linux-properly-match-etc-crypttab.patch
Normal 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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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 ()
|
||||
@ -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
|
||||
|
||||
[
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
| _, _ ->
|
||||
@ -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
|
||||
@ -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
7
gating.yaml
Executable 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
BIN
libguestfs.keyring
Normal file
Binary file not shown.
10
rpminspect.yaml
Normal file
10
rpminspect.yaml
Normal 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*'
|
||||
4
sources
4
sources
@ -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
13
tests/basic-test.sh
Executable 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
13
tests/tests.yml
Normal 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
|
||||
@ -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-----
|
||||
311
virt-v2v.spec
311
virt-v2v.spec
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user