Hyper-V PCIE设备直通教程
注:本文是为了已经咕了将近半年的LTO磁带使用教程而作,之前一直有时间和各方面条件的限制。最近还在进行试验,以后不仅会写教程,还会将LTO磁带存储用于直播录像的上传后留档等。

环境:Intel S2400SC2平台,HP的HBA卡和LTO4磁带机。host系统是Windows Server 2019 Datacenter w/ GUI,虚拟机系统是刚装的Debian testing。
目的:将HBA卡挂载至虚拟机,以方便在GNU/Linux环境下使用LTO磁带设备。但理论上本文方法适用于所有支持的PCIE设备,包括显卡。之后也会测试其他类型的设备,测试结果更新在动态。
首先在host系统中,按下Win + X -> M打开设备管理器,找到要挂载的PCIE设备。

先点击上方工具栏的向下的白色箭头(禁用设备),将目标设备从host上禁用。

确认禁用后,我们发现接在HBA卡上的"磁带驱动器"也一并消失了,说明操作成功。同时设备图标上显示向下箭头,工具栏对应位置图标变为向上的绿色箭头(启用设备)。

接下来我们双击打开目标设备的属性对话框,定位到"详细信息"选项卡,选择属性"位置路径"以查看其内容。

复制以"PCIEROOT"开头的一项备用。

接下来打开Hyper-V管理器,打开目标虚拟机的设置。将"自动停止操作"由默认的"保存"(保存虚拟机状态)改为"关闭"(关闭来宾操作系统),当然你非要改成"关闭电源"(强行关闭虚拟机)应该也可以,就是。。

接下来以管理员身份打开PowerShell,执行两条cmdlet:
Dismount-VMHostAssignableDevice -LocationPath "{目标设备的位置路径}" -Force
Add-VMAssignableDevice -LocationPath "{目标设备的位置路径}" -VMName "{目标虚拟机名}"

注意不要漏掉参数的半角双引号,因为`#`在PowerShell中代表注释。执行过程中应该没有任何输出,“没有消息就是好消息”。
这两条cmdlet的作用可从字面意思得知:将目标设备从host上强制卸载,然后挂载在指定虚拟机上。PowerShell的cmdlet设计上真的很不错,有RESTful API内味了。(就是命令太长对手动输入不友好。。
接下来回到Hyper-V管理器,启动目标虚拟机。然后可以ssh上去检查一下。

可以看到HBA卡、磁带机、磁带均被正确识别。
接下来是将设备挂载回host的步骤。
关闭目标虚拟机。以管理员身份打开PowerShell,执行两条cmdlet:
Remove-VMAssignableDevice -LocationPath "{目标设备的位置路径}" -VMName "{目标虚拟机名}"
Mount-VMHostAssignableDevice -LocationPath "{目标设备的位置路径}"

作用不言而喻:将目标设备从指定虚拟机上卸载,然后挂载在host上。
接下来回到设备管理器,启用目标设备即可。