On 12/01/22 13:49, Richard W.M. Jones wrote:
If the virtio-win ISO contains drivers for Windows 11, Windows 2019
or
Windows 2022, and the guest matches these, then copy in the right
drivers. For this to work you will need libguestfs >= 1.49.8 which
allows osinfo to be used to detect Windows versions >= 10.
Side note: virtio-win uses a mix of different path element styles.
In the exploded tree of drivers installed by the RPM:
/usr/share/virtio-win/drivers/amd64$ ls -l
total 0
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win10
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win11
drwxr-xr-x. 2 root root 236 Nov 30 13:28 Win2008R2
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win2012
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win2012R2
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win2016
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win2019
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win2022
drwxr-xr-x. 2 root root 236 Nov 30 13:28 Win7
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win8
drwxr-xr-x. 2 root root 174 Nov 30 13:28 Win8.1
Inside the ISO:
><fs> ll /viostor/
total 28
dr-xr-xr-x 1 root root 2048 Jun 14 2020 2k12
dr-xr-xr-x 1 root root 2048 Jun 14 2020 2k12R2
dr-xr-xr-x 1 root root 2048 Jun 14 2020 2k16
dr-xr-xr-x 1 root root 2048 Jun 14 2020 2k19
dr-xr-xr-x 1 root root 2048 Dec 11 2021 2k22
dr-xr-xr-x 1 root root 2048 Jun 14 2020 2k8R2
dr-xr-xr-x 1 root root 2048 Jun 14 2020 w10
dr-xr-xr-x 1 root root 2048 Dec 11 2021 w11
dr-xr-xr-x 1 root root 2048 Jun 14 2020 w7
dr-xr-xr-x 1 root root 2048 Jun 14 2020 w8
dr-xr-xr-x 1 root root 2048 Jun 14 2020 w8.1
So I have matched both path elements.
Reported-by: Tingting Zheng
Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=2149811
---
convert/windows_virtio.ml | 45 +++++++++++++++++++++++----------------
1 file changed, 27 insertions(+), 18 deletions(-)
diff --git a/convert/windows_virtio.ml b/convert/windows_virtio.ml
index a27cd6a543..3156694d11 100644
--- a/convert/windows_virtio.ml
+++ b/convert/windows_virtio.ml
@@ -50,9 +50,9 @@ let rec install_drivers ((g, _) as reg) inspect =
g#mkdir_p driverdir;
if not (copy_drivers g inspect driverdir) then (
- warning (f_"there are no virtio drivers available for this version of Windows
(%d.%d %s %s). virt-v2v looks for drivers in %s\n\nThe guest will be configured to use
slower emulated devices.")
+ warning (f_"there are no virtio drivers available for this version of Windows
(%d.%d %s %s %s). virt-v2v looks for drivers in %s\n\nThe guest will be configured to use
slower emulated devices.")
inspect.i_major_version inspect.i_minor_version inspect.i_arch
- inspect.i_product_variant virtio_win;
+ inspect.i_product_variant inspect.i_osinfo virtio_win;
(IDE, RTL8139, false, false, false, false)
)
else (
@@ -279,7 +279,8 @@ and copy_from_virtio_win g inspect srcdir destdir filter missing =
*)
and virtio_iso_path_matches_guest_os path inspect =
let { i_major_version = os_major; i_minor_version = os_minor;
- i_arch = arch; i_product_variant = os_variant } = inspect in
+ i_arch = arch; i_product_variant = os_variant;
+ i_osinfo = osinfo } = inspect in
try
(* Lowercased path, since the ISO may contain upper or lowercase path
* elements.
@@ -300,37 +301,45 @@ and virtio_iso_path_matches_guest_os path inspect =
let is_client os_variant = os_variant = "Client"
and not_client os_variant = os_variant <> "Client"
- and any_variant os_variant = true in
- let p_os_major, p_os_minor, match_os_variant =
+ and any_variant os_variant = true
+ and any_osinfo osinfo = true in
+ let p_os_major, p_os_minor, match_os_variant, match_osinfo =
if pathelem "xp" || pathelem "winxp" then
- (5, 1, any_variant)
+ (5, 1, any_variant, any_osinfo)
else if pathelem "2k3" || pathelem "win2003" then
- (5, 2, any_variant)
+ (5, 2, any_variant, any_osinfo)
else if pathelem "vista" then
- (6, 0, is_client)
+ (6, 0, is_client, any_osinfo)
else if pathelem "2k8" || pathelem "win2008" then
- (6, 0, not_client)
+ (6, 0, not_client, any_osinfo)
else if pathelem "w7" || pathelem "win7" then
- (6, 1, is_client)
+ (6, 1, is_client, any_osinfo)
else if pathelem "2k8r2" || pathelem "win2008r2" then
- (6, 1, not_client)
+ (6, 1, not_client, any_osinfo)
else if pathelem "w8" || pathelem "win8" then
- (6, 2, is_client)
+ (6, 2, is_client, any_osinfo)
else if pathelem "2k12" || pathelem "win2012" then
- (6, 2, not_client)
+ (6, 2, not_client, any_osinfo)
else if pathelem "w8.1" || pathelem "win8.1" then
- (6, 3, is_client)
+ (6, 3, is_client, any_osinfo)
else if pathelem "2k12r2" || pathelem "win2012r2" then
- (6, 3, not_client)
+ (6, 3, not_client, any_osinfo)
else if pathelem "w10" || pathelem "win10" then
- (10, 0, is_client)
+ (10, 0, is_client, ((=) "win10"))
+ else if pathelem "w11" || pathelem "win11" then
+ (10, 0, is_client, ((=) "win11"))
else if pathelem "2k16" || pathelem "win2016" then
- (10, 0, not_client)
+ (10, 0, not_client, ((=) "win2k16"))
+ else if pathelem "2k19" || pathelem "win2019" then
+ (10, 0, not_client, ((=) "win2k19"))
+ else if pathelem "2k22" || pathelem "win2022" then
+ (10, 0, not_client, ((=) "win2k22"))
else
raise Not_found in
arch = p_arch && os_major = p_os_major && os_minor = p_os_minor
&&
- match_os_variant os_variant
+ match_os_variant os_variant &&
+ match_osinfo osinfo
with Not_found -> false
I think this patch would be improved if the osinfo part were first
introduced as a pure refactoring ("any_osinfo"), and then the bugfix
were implemented in a separate patch. But, it's not a big deal, so:
Reviewed-by: Laszlo Ersek <lersek(a)redhat.com>