1. 确认服务器中是否安装了gpu显卡,

执行lspci -nn | grep -i nvidia,显示如下内容,说明存在GPU,如果没有lspci命令,执行yum install -y sysstat

3b:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
86:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)

2. 修改/etc/default/grub文件

向GRUB_CMDLINE_LINUX加入"intel_iommu=on modprobe.blacklist=nouveau",例如:

$ vi /etc/default/grub
# line 6: add (if AMD CPU, add [amd_iommu=on])
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on modprobe.blacklist=nouveau"
GRUB_DISABLE_RECOVERY="true"

之后执行:

grub2-mkconfig -o /boot/grub2/grub.cfg

对应efi模式引导的则执行:

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

再执行reboot重启服务器,重启后执行

dmesg | grep -E "DMAR|IOMMU"
dmesg | grep -i nouveau

检查IOMMU是否生效,nouveau是否已被禁用

3. 配置VFIO

格式为:echo "options vfio-pci ids=vendor-ID:device-ID" > /etc/modprobe.d/vfio.conf

本例子中,执行:

echo "options vfio-pci ids=10de:1db4" > /etc/modprobe.d/vfio.conf
echo 'vfio-pci' > /etc/modules-load.d/vfio-pci.conf

游戏显卡所属的设备较多,需要将一块卡所属的其他设备一起配置vfio 

之后,执行reboot重启服务,重启后,执行

$ lspci -nnk -d 10de:
3b:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
	Subsystem: NVIDIA Corporation Device [10de:1306]
	Kernel driver in use: vfio-pci
	Kernel modules: nouveau

出现:Kernel driver in use: vfio-pci说明配置正确

4. 注意:如果已经安装nvidia的驱动

需要解除绑定,相当比较麻烦,我这里直接卸载nvidia的驱动了事,执行命令为:

nvidia-uninstall
yum remove `rpm -qa|grep -i nvidia` -y
yum remove `rpm -qa|grep -i cuda` -y

如果不能卸载驱动,可以参考

https://blog.csdn.net/U201017971/article/details/78904966?utm_medium=distribute.wap_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-2-78904966.nonecase&utm_term=kvm%E6%98%BE%E5%8D%A1%E7%9B%B4%E9%80%9A

5. 安装kvm、qemu

yum install -y qemu-kvm qemu-key-tools virt-manager libvirt virt-install python-virtinst bridge-utils
wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-virt-common-1-1.el7.centos.noarch.rpm
wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-qemu-ev-1.0-4.el7.centos.noarch.rpm
rpm -ivh centos-release-virt-common-1-1.el7.centos.noarch.rpm centos-release-qemu-ev-1.0-4.el7.centos.noarch.rpm
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-QEMU-EV.repo
yum --enablerepo=centos-qemu-ev -y install qemu-kvm-ev
systemctl restart libvirtd

6. 安装OVMF

 #REPO
 vi /etc/yum.repos.d/kraxel.repo
 # create new
 [qemu-firmware-jenkins]
 name=firmware for qemu, built by jenkins, fresh from git repos
 baseurl=https://www.kraxel.org/repos/jenkins/
 enabled=0
 gpgcheck=0

 #RPM Install
 yum --enablerepo=qemu-firmware-jenkins -y install OVMF

 #check ovmf directory
 ls /usr/share/OVMF/

 #QEMU配置
 vim /etc/libvirt/qemu.conf
 nvram = [
   "/usr/share/OVMF/OVMF_CODE.secboot.fd:/usr/share/OVMF/OVMF_VARS.fd",
 ]
  
 #重启libvirtd服务
 service libvirtd restart

7. 创建网桥

如果创建虚拟机过程中遇到报错:Cannot get interface MTU on 'br0': No such device,说明br0的网桥没有创建,执行如下命令:

virsh iface-bridge eth0 br0

8. 创建虚拟机

注意:--host-device 3b:00.0中, 3b:00.0是从lspci -nn|grep -i nvidia中获得的gpu设备地址

virt-install --name=cpu_test  --boot uefi --machine q35  --virt-type=kvm --hvm --ram=8196 --vcpus=4 --network bridge=br0,model=virtio --graphics vnc,port=5916 --disk path=/data/var/kvm/images/centos7.img,size=60 --os-type=linux --cdrom=/home/CentOS-7-x86_64-DVD-1810.iso --host-device 3b:00.0 --debug

虚拟机安装完成后,进入其界面执行lspci -nn|grep -i nvidia,显示出结果,说明直通kvm虚拟机创建成功

9. ERROR CODE 43

#编辑VM XML
virsh edit win 

#修改第一行
<domain type='kvm'>
#为
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

#找到<features>节点,添加内容
<features>
... 
  <kvm>
    <hidden state='on'/>
  </kvm>
...
</features>

#找到</device>节点,在device后添加内容
<qemu:commandline>
  <qemu:arg value='-cpu'/>
  <qemu:arg value='host,hv_time,kvm=off,hv_vendor_id=null'/>
</qemu:commandline>

#重启VM
virsh destroy win
virsh start win

 

参考:https://www.jianshu.com/p/8074abc26b88

https://www.server-world.info/en/note?os=CentOS_7&p=kvm&f=10

https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

更多推荐