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