[Libguestfs] [PATCH v2v] convert: windows: Copy drivers for Windows 11, Windows 2019 & Windows 2022

Richard W.M. Jones rjones at redhat.com
Fri Dec 2 10:02:04 UTC 2022


On Fri, Dec 02, 2022 at 10:16:53AM +0100, Laszlo Ersek wrote:
> 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 at redhat.com>

I really want to take a big axe to this code and rewrite it all more
sensibly.  It has accreted over a very long period of time and is
extremely hard to follow (although not helped at all by the fact that
the virtio-win disk is plain weird and unhelpfully constructed).

But that's for another day ...

Thanks,

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html


More information about the Libguestfs mailing list