整个部署过程花了四五天终于部署好了,操作过程记录下,其实只差一步一直没找到相关资料,所以搞了这么多天,再做一遍估计也就2-3小时就能弄好
建议安装kvm宿主机使用ubuntu20.04,省去了配置vifo的麻烦,20.04已经将这个加载到内核,无需做额外配置
我的虚拟机都是安装centos7
1.首先是设置bios
以下两个就需要启用,其中第一个Above 4G decoding这个是我的最终问题,最后找到了启用了直通就成功了,后面就是虚拟化VT开启
Above 4G decoding - Enable Intel Virtualization Technology for Directed I/O (VT-d) - Enable
2.宿主机配置操作
确认内核是否支持iommu
cat /proc/cmdline | grep iommu
iommu有两大功能:
控制设备DMA地址映射到机器物理地址(DMAR)
中断重映射(IntreMap)
若没有输出结果,添加intel_iommu=on到grub的启动参数
sudo vi /etc/default/grub GRUB_CMDLINE_LINUX="intel_iommu=on" #添加intel_iommu=on
然后使配置生效,然后重启宿主机
update-grub
重启宿主机以后查看iommu配置生否生效
dmesg | grep IOMMU [ 0.125551] DMAR: IOMMU enabled
查看pci设备信息
lspci -nn | grep NVIDIA 03:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1f03] (rev a1) 03:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10f9] (rev a1)
查看驱动
lspci -vv -s 03:00.0 | grep driver Kernel driver in use: nouveau lspci -vv -s 03:00.1 | grep driver Kernel driver in use: snd_hda_intel
用默认显卡驱动
禁用nouveau、snd_hda_intel
将其添加到/etc/modprobe.d/blacklist.conf文件最后
vi /etc/modprobe.d/blacklist.conf blacklist nouveau blacklist snd_hda_intel
保存退出后重启宿主机,此时独立显卡将从宿主机解绑,屏幕将设置不了分辨率,很大
接着我们使用GPU直通到虚拟机
我们通过之前使用lspci命令查到的GPU 的BDF是03:00.0,03:00.1是音频设备,也需要一并直通到虚拟机,下面1)和2)步需要获取03_00_0和03_00_1的总线、槽位和功能信息
1).然后我们通过这个可以获取到GPU的完整标识符
virsh nodedev-list --cap pci| grep 03_00_0 #返回 pci_0000_03_00_0
2).然后可以通过这个标识符获取图形处理器的域、总线、槽位和功能信息
virsh nodedev-dumpxml pci_0000_03_00_0| egrep 'domain|bus|slot|function' <domain>0</domain> <bus>3</bus> <slot>0</slot> <function>0</function> <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
3).接着我们通过上述的信息修改kvm虚拟机信息,其中第二个地址元素,在操作系统中为GPU设置固定PCI设备BDF
virsh edit vm-name
添加如下信息上面查到的0、3、0、0填写到下面对应的domain,bus,slot,function里面,然后后面一行的address上面也说了是固定PCI设备的BDF可以自己定义,下面一共两组hostdev,第一组是GPU显卡,第二组GPU音频,两个都需要直通到虚拟机,如果只直通显卡可能出现未知问题
<hostdev mode='subsystem' type='pci' managed='yes'> <driver name='vfio'/> <source> <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> </source> <alias name='hostdev0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <driver name='vfio'/> <source> <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/> </source> <alias name='hostdev1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/> </hostdev>
接着我们启动虚拟机,进入虚拟机
首先安装下依赖
yum install gcc make kernel-devel kernel-headers -y
然后安装GPU驱动,如果在虚拟机中也是提示GPU卡被占用,如下错误提示
ERROR: The Nouveau kernel driver is currently in use by your system. This driver is incompatible with the NVIDIA driver, and must be disabled before proceeding. Please consult the NVIDIA driver README and your Linux distribution's documentation for details on how to correctly disable the Nouveau kernel driver.
需要禁用下虚拟机里面的nouveau
vi /etc/modprobe.d/blacklist.conf #这个文件没有就新建 #添加如下内容 blacklist nouveau options nouveau modeset=0
如果安装驱动的时候提示内核相关的找不到,提示如下图,安装时添加内核指向的参数
./NVIDIA-Linux-x86_64-510.73.05.run --kernel-source-path=/usr/src/kernels/3.10.0-957.12.1.el7.x86_64
问题记录
之前没有开启4G decoding报这个错误
dmesg | grep NVRM [drm] [nvidia-drm] [GPU ID 0x00000003] Loading driver [drm] Initialized nvidia-drm 0.0.0 20160202 for 0000:00:03.0 on minor 1 NVRM: GPU 0000:00:03.0: RmInitAdapter failed! (0x24:0x72:1417) NVRM: GPU 0000:00:03.0: rm_init_adapter failed, device minor number 0 NVRM: GPU 0000:00:03.0: RmInitAdapter failed! (0x24:0x72:1417) NVRM: GPU 0000:00:03.0: rm_init_adapter failed, device minor number 0
最后附上我的虚拟机xml文件
参考:
https://docs.nvidia.com/grid/5.0/grid-vgpu-user-guide/index.html#using-gpu-pass-through-red-hat-el-kvm
https://blog.51cto.com/zaa47/2596875?ivk_sa=1024320u
https://blog.csdn.net/dwj1979/article/details/123876437