基于Hyper-V GPU-PV的半虚拟化GPU虚拟机方案
2023-2-9
| 2024-9-13
字数 1679阅读时长 5 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
Sep 13, 2024 03:11 PM
 

GPU Virtualization

最早是在Windows Sandbox中接触到这个基于WDDM的半虚拟化方案:
 
如下是在Hyper-V虚拟机中启用GPU-PV的步骤:

Add GPU to VM

说明:
  • 查找gpu_path:
    • eg: \\?\PCI#VEN_10DE&DEV_1B81&SUBSYS_36FC1458&REV_A1#4&c55b2a1&0&0008#{064092b3-625e-43bf-9eb5-dc845897dd59}\GPUPARAV
       
      如果有多个GPU,配合设备管理器进行查找
      notion image
      Tips: 一般intel核显的硬件id中包含8086,可以方便排除
  • vm就是虚拟机的名称
     
    如果不需要该GPU了,使用以下命令删除
     
    增强脚本参考:

    Copy GPU driver to VM

    在添加好GPU后,默认在Windows的虚拟机中还不能驱动,需要从宿主机拷贝驱动。可以参考Easy-GPU-PV的脚本:
     
     
    也可以使用如下合并后的脚本
     

    Streaming

    默认会包括以下几个虚拟显示器(Virtual Display)
    notion image
    • Hyper-v video: VM默认自带的VD
    • Remote Display Adapter: 使用增强会话功能时创建的VD, 可以比较方便更改分辨率. 走RDP协议
    • USB Mobile Monitor: 安装如下虚拟桌面后的VD
     
    但是如果使用(第三方)串流的话, 还需要额外安装:
    • 虚拟桌面:
      • 因为原始的Hyper-v video功能比较少, 分辨率固定为1024x768 (虽然可以使用第三方软件修改). 所以推荐使用第三方的虚拟桌面
      • https://www.amyuni.com/downloads/usbmmidd_v2.zip
      • 需要写一个脚本来开机创建一个VD
        • 开机脚本可以在创建后, 使用win下的“任务计划程序”设置为开机以管理员身份运行
     
    最终采用的方案: Sunshine (Server)+Moonlight (Client)

    Moonlight

    Moonlight is an unofficial third-party open-source client for the NVIDIA SHIELD streaming software that comes included with GeForce Experience.
    Note: 主要moonlight只是一个客户端, 不提供串流主机的服务
    但是因为Nvidia与2023/02停止支持gamestream服务,所以可以使用第三方Sunshine实现host端串流服务:
     
    为支持手柄, 还需要在VM中安装ViGEmBus
     
    使用教程:
    windows下安装后, 会以service的形式静默运行, 不需要再额外打开sunshine程序.
    此时使用web进行管理: https://localhost:47990
     
    端口转发:
    • TCP 47984, 47989, 48010
    • UDP 47998, 47999, 48000, 48002, 48010
    notion image
    有关端口转发的具体操作见下

    Network

    Hyper-V的网络(虚拟交换机)分为3类
    • 专用(Private): 仅允许虚拟机之间互联, 不能访问宿主机
    • 内部(Internal): 允许虚拟机和宿主机互联, 使用一个独立网段
      • Note: 自己创建的该类虚拟交换机默认不包含DHCP服务, 需要自己对每台虚拟机和host对应虚拟网卡设备设置ip等信息;
      • 此外自己创建的该类虚拟交换机默认也不开启NAT功能, 因此虚拟机无法通过设置该网络而访问外部网络.
    • 外部(External): 将虚拟机看作局域网中一个独立的设备, 由宿主机外的路由器进行管理
     
    Hyper-V默认存在一个虚拟交换机Default Switch:
    • Internal类型, 外加DHCP和NAT.
    • 默认使用/20 网段, eg:
    notion image
     

    Port Forwarding

    最好先创建一个单独的Internal Switch, 并添加给VM. 因为默认的Default Switch每次重启会变动ip
    步骤(需要在管理员权限的shell下完成):
    1. Make a new Hyper-V Internal Switch(这一步也可以在Hyper-V的GUI中完成)
      1. Set up a new IP address/subnet(eg: 192.168.14.0/24) for the Hyper-V host on the new adapter
          • Note: 这里是通过接口名称-InterfaceAlias来确定对应adapter (对应名称为vEthernet (xxx))
          • 也可以通过-InterfaceIndex来指定.
          • 二者都可以通过命令Get-NetAdapter进行查看
            • notion image
      1. Set up a NAT Network on the new subnet
      1. 在VM上添加该switch, 并手动设置ip (因为不包含DHCP)
      1. Set up a port-forward on the NAT Network to the VM (e.g. TCP 1443 -> 192.168.14.100:443)
        1. Tips: 对同一个端口的TDP和UDP需要单独指定

      Enhanced Session

    2. 工具
    3. Windows中VHDX讲解OpenWRT IPv6 & NAT6
      Loading...