From 3959367bee3f6ac93e00b23b77fade0ddd0fc062 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 27 Aug 2024 14:01:17 +0100 Subject: [PATCH] convert: windows: Online all virtio disks at first boot resolves: RHEL-55763 --- ...Online-all-virtio-disks-at-first-boo.patch | 93 +++++++++++++++++++ virt-v2v.spec | 7 +- 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 0021-convert-windows-Online-all-virtio-disks-at-first-boo.patch diff --git a/0021-convert-windows-Online-all-virtio-disks-at-first-boo.patch b/0021-convert-windows-Online-all-virtio-disks-at-first-boo.patch new file mode 100644 index 0000000..8050e62 --- /dev/null +++ b/0021-convert-windows-Online-all-virtio-disks-at-first-boo.patch @@ -0,0 +1,93 @@ +From d26ed76801f9d3ce5d3863ca09dfa653b4bcd1b2 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 27 Aug 2024 12:36:41 +0100 +Subject: [PATCH] convert: windows: Online all virtio disks at first boot + +Windows 2022 (and possibly earlier versions back to around 2019) will +force offline any non-boot disks which change bus, apparently as a +security mitigation. The effect of this is that although the system +drive (C:) is present after conversion, other drives may seem to +disappear. + +Running a Powershell script to bring all disks online seems risky. +The compromise is to bring online only virtio disks at first boot. + +To further reduce risk, we only do this if there are non-system disks +(ie. > 1 disks in total), and only if we installed virtio drivers. + +Fixes: https://issues.redhat.com/browse/RHEL-55763 +Fixes: https://issues.redhat.com/browse/RHEL-55837 +Related: https://issues.redhat.com/browse/MTV-1299 +Related: https://bugzilla.redhat.com/show_bug.cgi?id=1662286 +Signed-off-by: Richard W.M. Jones +Thanks: Martin Necas +Acked-by: Martin Necas +(cherry picked from commit cb56f6f94dc153051515fc7aa0d9ca646f5e2340) +--- + convert/convert_windows.ml | 39 +++++++++++++++++++++++++++++++++++++- + 1 file changed, 38 insertions(+), 1 deletion(-) + +diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml +index 52ca5bbe..352e1218 100644 +--- a/convert/convert_windows.ml ++++ b/convert/convert_windows.ml +@@ -38,7 +38,8 @@ module G = Guestfs + * time the Windows VM is booted on KVM. + *) + +-let convert (g : G.guestfs) _ inspect i_firmware block_driver _ static_ips = ++let convert (g : G.guestfs) source inspect i_firmware ++ block_driver _ static_ips = + (*----------------------------------------------------------------------*) + (* Inspect the Windows guest. *) + +@@ -272,6 +273,8 @@ let convert (g : G.guestfs) _ inspect i_firmware block_driver _ static_ips = + Registry.with_hive_write g inspect.i_windows_software_hive + update_software_hive; + ++ configure_online_disks block_driver; ++ + configure_network_interfaces net_driver; + + fix_ntfs_heads (); +@@ -668,6 +671,40 @@ let convert (g : G.guestfs) _ inspect i_firmware block_driver _ static_ips = + warning (f_"could not find registry key \ + HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion") + ++ and configure_online_disks block_driver = ++ (* If there are > 1 disks, run a script which will force Windows ++ * to bring them all online. Windows 2022 will offline non-boot disks ++ * where the bus changes as some sort of "security" mitigation. ++ * https://issues.redhat.com/browse/RHEL-55837 ++ * https://issues.redhat.com/browse/MTV-1299 ++ * https://bugzilla.redhat.com/show_bug.cgi?id=1662286 ++ *) ++ let virtio_installed = ++ match block_driver with ++ | Inject_virtio_win.Virtio_blk | Virtio_SCSI -> true ++ | IDE -> false in ++ let more_than_one_disk = List.length source.s_disks > 1 in ++ ++ if virtio_installed && more_than_one_disk then ( ++ let psh_filename = "online-disks" in ++ let psh = ref [] in ++ let add = List.push_back psh in ++ ++ add "# Uncomment this line for lots of debug output."; ++ add "# Set-PSDebug -Trace 1"; ++ add ""; ++ add "Write-Host \"Online all virtio disks\""; ++ add ""; ++ add "Get-Disk | Where { $_.FriendlyName -like '*VirtIO*' } | % {"; ++ add " Write-Host (' - ' + $_.Number + ': ' + $_.FriendlyName + '(' + [math]::Round($_.Size/1GB,2) + 'GB)')"; ++ add " $_ | Set-Disk -IsOffline $false"; ++ add " $_ | Set-Disk -IsReadOnly $false"; ++ add "}"; ++ ++ (* Install the Powershell script to run late at firstboot. *) ++ Firstboot.add_firstboot_powershell g inspect.i_root psh_filename !psh ++ ) ++ + and configure_network_interfaces net_driver = + (* If we were asked to force network interfaces to have particular + * static IP addresses then it is done here by installing a diff --git a/virt-v2v.spec b/virt-v2v.spec index c3c5ff5..c9ff278 100644 --- a/virt-v2v.spec +++ b/virt-v2v.spec @@ -8,7 +8,7 @@ Name: virt-v2v Epoch: 1 Version: 2.5.6 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Convert a virtual machine to run on KVM License: GPL-2.0-or-later AND LGPL-2.0-or-later @@ -48,6 +48,7 @@ Patch0017: 0017-RHEL-9-oo-compressed-Remove-nbdcopy-version-check-an.patch Patch0018: 0018-RHEL-9-tests-Remove-btrfs-test.patch Patch0019: 0019-RHEL-9-Remove-block-driver-option.patch Patch0020: 0020-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch +Patch0021: 0021-convert-windows-Online-all-virtio-disks-at-first-boo.patch %if !0%{?rhel} # libguestfs hasn't been built on i686 for a while since there is no @@ -351,6 +352,10 @@ make -C tests TESTS=test-v2v-fedora-luks-on-lvm-conversion.sh check %changelog +* Tue Aug 27 2024 Richard W.M. Jones - 1:2.5.6-4 +- convert: windows: Online all virtio disks at first boot + resolves: RHEL-55763 + * Thu Aug 08 2024 Richard W.M. Jones - 1:2.5.6-3 - Further fixes for QEMU Guest Agent install & VMware Tools removal resolves: RHEL-49761, RHEL-51169