Andrey Drobyshev
2023-Mar-14 10:45 UTC
[Libguestfs] [V2V PATCH v3 0/1] convert_windows: add firstboot script to install drivers with pnputil
I haven't run too deep into the nature of the original bugs with the "v2vnetcf.ps1" script, but at least my experiment shows that it seems to be working. Namely I've set a static IP to VM during conversion (with --mac aa:bb:cc:dd:ee:ff:ip:ipaddr,gw,len), and after the first boot I see that pnputil is indeed prioritized to run earlier than v2vnetcf.ps1, and that my VM has the required IP set. Discussion on v2: https://listman.redhat.com/archives/libguestfs/2023-March/031025.html v2 -> v3: * Prioritize firstboot script with ~prio:2000. That value is chosen to be higher than that of "v2vnetcf.ps1". Discussion on v1: https://listman.redhat.com/archives/libguestfs/2023-March/031001.html v1 -> v2: * Omit redirecting output to a separate log with "%~dpn0.log". Andrey Drobyshev (1): convert_windows: add firstboot script to install drivers with pnputil convert/convert_windows.ml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) -- 2.31.1
Andrey Drobyshev
2023-Mar-14 10:45 UTC
[Libguestfs] [V2V PATCH v3 1/1] convert_windows: add firstboot script to install drivers with pnputil
During conversion we copy the necessary drivers to the directory "%systemroot%\Drivers\Virtio", adding it to the DevicePath registry value. As documented in [1], this should be enough for Windows to find device drivers and successfully install them. However, it doesn't always happen. Commit 73e009c04 ("v2v: windows: Document use of pnputil to install drivers.") describes such issues with Win2k12R2. I'm seeing the same problem with Win2k16 and netkvm.sys driver not being installed. That same commit 73e009c04 suggests adding a firstboot script invoking pnputil at an early stage to install all the drivers we put into the drivers store. So let's add such a script to make sure all the necessary drivers are installed. [1] https://learn.microsoft.com/en-us/windows-hardware/drivers/install/how-windows-selects-a-driver-for-a-device Signed-off-by: Andrey Drobyshev <andrey.drobyshev at virtuozzo.com> --- convert/convert_windows.ml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml index b5dc06ed..0f4dd70f 100644 --- a/convert/convert_windows.ml +++ b/convert/convert_windows.ml @@ -295,9 +295,11 @@ let convert (g : G.guestfs) _ inspect i_firmware block_driver _ static_ips | Virt -> Virt and configure_firstboot () - (* Note that pnp_wait.exe must be the first firstboot script as it - * suppresses PnP for all following scripts. + (* Run the firstboot script with pnputil.exe before the one with + * pnp_wait.exe as the latter suppresses PnP for all following scripts. *) + configure_pnputil_install (); + let tool_path = virt_tools_data_dir () // "pnp_wait.exe" in if Sys.file_exists tool_path then configure_wait_pnp tool_path @@ -345,6 +347,18 @@ let convert (g : G.guestfs) _ inspect i_firmware block_driver _ static_ips strkey name value | None -> sprintf "reg delete \"%s\" /v %s /f" strkey name + and configure_pnputil_install () + let fb_script = "@echo off\n\ + \n\ + echo Wait for VirtIO drivers to be installed\n\ + %systemroot%\\Sysnative\\PnPutil -i -a \ + %systemroot%\\Drivers\\Virtio\\*.inf \ + " in + + (* Set priority higher than that of "v2vnetcf.ps1" firstboot script. *) + Firstboot.add_firstboot_script g inspect.i_root ~prio:2000 + "pnputil install drivers" fb_script; + and configure_wait_pnp tool_path (* Prevent destructive interactions of firstboot with PnP. *) -- 2.31.1