kvm显卡直通

kvm显卡直通

env
ubuntu18


NvidiaRTX显卡虚拟机直通指南
1、确认BIOS里开启Vt-d功能。
egrep '(vmx|svm)' /proc/cpuinfo

2、开启iommu。


sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"modprobe.blacklist=nouveau net.ifnames=0 biosdevname=0 intel_iommu=on\ "/g' /etc/default/grub
sudo update-grub
 
echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
3、加载内核模块


printf "vfio \nvfio_iommu_type1 \nvfio_pci \nvfio_virqfd \nvhost-net" >> /etc/initramfs-tools/modules
update-initramfs -u


4、查看显卡信息
lspci -nn | grep NVI
02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106 [GeForce RTX 3060] [10de:2503] (rev a1)
02:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:228e] (rev a1)
输出值含义详细解释
02:00.002:00.1以 ”bus:slot.func“ 格式来唯一标识一个 PCI 功能设备唯一定位一个 PCI 设备的虚拟功能,可以是一个物理设备,也可以是一个多功能设备的功能设备,一个多功能设备可以最多有8个功能。总线号(bus):  从系统中的256条总线中选择一条,0–255。设备号(slot):  在一条给定的总线上选择32个设备中的一个。0–31。功能号(func):  选择多功能设备中的某一个功能,有八种功能,0–7。 PCI规范规定,功能0是必须实现的。
0300PCI 设备类型指 PCI 设备的类型,来自不同厂商的同一类设备的类型码可以是相同的。
10de供应商识别字段(Vendor ID)该字段用一标明设备的制造者。一个有效的供应商标识由 PCI SIG 来分配,以保证它的唯一性。Intel 的 ID 为 0x8086,Nvidia 的 ID 为 0x10de
2503设备识别字段(Device ID)用以标明特定的设备,具体代码由供应商来分配。本例中表示的是 GPU 图形卡的设备 ID。
a1 版本识别字段(Revision ID)用来指定一个设备特有的版本识别代码,其值由供应商提供
#查看驱动详情
lspci -vv -s 02:00.0 | grep driver
5、显卡添加到直通组
devids=""
devid_list=$(lspci -nn | grep NVIDIA | grep -v GF108 | grep -o \\[....:....\\])
for i in $devid_list
do
devids=$devids,$i
done
vfio_id=$(echo $devids| sed 's/^,//g'|sed 's:\[::g'|sed 's:\]::g')
echo options vfio-pci ids=$vfio_id >> /etc/modprobe.d/local.conf

#重启服务器或者手工卸载显卡设备
virsh nodedev-detach pci_0000_02_00_0
virsh nodedev-detach pci_0000_02_00_1
 
#验证
lspci -vv -s 02:00.0 | grep driver
lspci -vv -s 02:00.1 | grep driver

Kernel driver in use: vfio-pci 即为正常



6、添加显卡到虚拟机
方式一:
通过图形化virt-manager 添加PCI设备。

方式二:
通过xml文件配置

<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</source>
<alias name='hostdev0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' multifunction='on'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
</source>
</hostdev>

tips

1、隐藏vm状态:否则显卡驱动安装过程中自检会报错ERROR CODE 43,驱动不允许安装在虚拟机上(windows必须设置)。

<features>
<kvm>
<hidden state='on'/>
</kvm>
</features>

2、编辑VM XML
将<domain type='kvm'>
修改为
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

3、注入信息
找到</device>节点,在device后添加内容
<qemu:commandline>
<qemu:arg value='-cpu'/>
<qemu:arg value='host,kvm=off,hv_vendor_id=1234567890ab,hv_vapic,hv_time,hv_relaxed,hv_spinlocks=0x1fff,-hypervisor'/>
</qemu:commandline>
Avatar photo
igoZhang

互联网应用,虚拟化,容器

评论已关闭。