VFIO直通显卡折腾记录

20210309更新

 

整了一块RX 6800,但linux mint 20.1(ubuntu 20.04)下面怎么也挖不了矿,就想到了KVM虚拟机+显卡直通的方案,将显卡分配给虚拟机里的win10来挖矿。

主要硬件配置:

CPU:R9 3950X

主板:MSI B550M MORTAR WIFI

显卡:RX 6800(虚拟机) + RX 5700XT(主机)

硬盘:SM961(NVMe,虚拟机)(虚拟机系统装进NVMe后不久直接炸了,改用主机上的从vmdk转来的qcow2虚拟硬盘)+ SA530(SATA,主机)

主要参考资料:

mathiashueber.com

mechanical-consciousness.com

首先查询资料得知这个主板支持IOMMU,BIOS设置里将其Enabled。

接下来配置内核参数,编辑/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt"

然后update-grub,重启后输入dmesg | grep AMD-Vi,确认开启了IOMMU。

接下来是查找待分配的硬件ID。使用这个脚本:

#!/bin/bash
# change the 999 if needed
shopt -s nullglob
for d in /sys/kernel/iommu_groups/{0..999}/devices/*; do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
done;

输出一大堆东西。我将其保存至一个文件以便查找。以下是文件节选:

IOMMU Group 14 01:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller SM961/PM961 [144d:a804]

IOMMU Group 18 2d:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Device [1002:73bf] (rev c3)

IOMMU Group 19 2d:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Device [1002:ab28]

IOMMU Group 20 2d:00.2 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD/ATI] Device [1002:73a6]

IOMMU Group 21 2d:00.3 Serial bus controller [0c80]: Advanced Micro Devices, Inc. [AMD/ATI] Device [1002:73a4]

加粗部分就是要分配给虚拟机的硬件ID。将其加入内核启动参数:

GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt kvm.ignore_msrs=1 vfio-pci.ids=144d:a804,1002:73bf,1002:ab28,1002:73a6,1002:73a4"

这里的kvm.ignore_msrs=1,第一个参考资料说是win10 1803以上才需要的参数。

(小插曲,之前修改内核启动参数后,重启卡住,进不了图形界面,所幸还能ssh;更新了一下bios,结果好了!甚至IOMMU分组都变多了)

 

接下来是创建虚拟机。使用红帽公司virt-manager在图形界面下创建,很方便。

f:id:pikakolendo:20210305101635p:plain

f:id:pikakolendo:20210305101709p:plain

这一步选择windows 10也行。

f:id:pikakolendo:20210305101937p:plain

f:id:pikakolendo:20210305101955p:plain

内存和CPU随意分配。由于我是直接给虚拟机分配物理硬盘,“为虚拟机启用存储”跳过。

f:id:pikakolendo:20210305102506p:plain

概述:

f:id:pikakolendo:20210305102655p:plain

CPU:

f:id:pikakolendo:20210305102735p:plain

添加硬件:

f:id:pikakolendo:20210305102852p:plain

在这里按照之前脚本输出的硬件ID,把要分配的PCI设备分配给虚拟机。然后取消勾选“ROM栏”。只有NVMe直通需要取消勾选“ROM栏”(实际上是ROM BAR的拙劣翻译)。

f:id:pikakolendo:20210305103101p:plain

然后点回“概况”,手动编辑xml,在<features>里面加入:

<hyperv>
<vendor_id state="on" value="101"/>
</hyperv>
<kvm>
<hidden state="on"/>
</kvm>

否则不能从显卡连接的显示器输出(参考链接)。如果仅仅当一个挖矿工具系统使用的话,没必要设置这玩意,否则SPICE会出问题,鼠标指针会消失。

装完系统和驱动后就能愉快挖矿啦!

但是有一个恼火的问题(AMD Reset Bug),虚拟机关机后再开机,显卡无法使用!必须重启主机!好消息!6800系并没有reset bug!之前出问题是因为少分配了两个东西,参见这个视频把那两个跟显卡关联的东西分配上去就好了。