Add --no-fstrim option

resolves: RHEL-164271
This commit is contained in:
Richard W.M. Jones 2026-04-03 09:55:31 +01:00
parent aa41e3a69b
commit 8380dd5902
5 changed files with 309 additions and 9 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -45,7 +45,7 @@ ExclusiveArch: x86_64
Name: virt-v2v
Epoch: 1
Version: 2.10.0
Release: 8%{?dist}
Release: 9%{?dist}
Summary: Convert a virtual machine to run on KVM
License: GPL-2.0-or-later AND LGPL-2.0-or-later
@ -95,6 +95,7 @@ Patch0027: 0027-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch
Patch0028: 0028-RHEL-output-output.ml-Remove-reduce-memory-pressure-.patch
Patch0029: 0029-Update-common-submodule.patch
Patch0030: 0030-convert-linux-properly-match-etc-crypttab.patch
Patch0031: 0031-Add-no-fstrim-option-to-disable-fstrim-during-conver.patch
BuildRequires: autoconf, automake, libtool
BuildRequires: make
@ -400,6 +401,10 @@ done
%changelog
* Fri Apr 03 2026 Richard W.M. Jones <rjones@redhat.com> - 1:2.10.0-9
- Add --no-fstrim option
resolves: RHEL-164271
* Thu Mar 12 2026 Richard W.M. Jones <rjones@redhat.com> - 1::2.10.0-8
- Requires openssl (for finding thumbprint)
resolves: RHEL-155204