一、测试环境:
准系统:4124GP-TNR
cpu:7T83 两颗
内存:三星 32g 3200
16根
显卡:3090
系统:Ubuntu20.04
二、安装kvm
1、sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager ovmf
2、为了能够创建和管理虚拟机,需要讲用户添加到“libvirt”和“kvm”组中。
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
三、开启iommu
1、修改/etc/default/grub,如下图:
2、更新grub文件
sudo update-grub
3、重启
sudo reboot
4、检查是否开启iommu成功
dmesg | grep -e DMAR -e IOMMU
如图所示:
四、查看是否已禁用nouveau
lsmod | grep nouveau
如此所示:
没有输出,说明已经被禁用,如果有输出,请执行如下:
(1)、禁用nouveau:命令如下:
sudo vim /etc/modprobe.d/blacklist.conf
#在最后面添加如下代码:
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
#然后保存并退出
(2)、为了保证完全禁用掉,还要在内核中直接禁用Nouveau:
命令如下:
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
这之后,更新配置试生效,命令如下:
sudo update-initramfs -u
重启:sudo reboot
五、显卡从系统上解除绑定
在解除绑定之前,如果安装了显卡驱动,则必须卸载显卡驱动,否则无法解除绑定
nvidia-smi
如果出现如图所示,说明没有安装显卡驱动
出现上图所示,说明已经安装了显卡驱动:
卸载驱动命令:
sudo /usr/bin/nvidia-uninstall
卸载完成后,重新执行nvidia-smi,确认是否卸载成功
卸载成功后,重启
1、查询显卡id地址
lspci -nn | grep NVIDIA
例子如下图:
左边的那一串数字,则是id地址,每张卡都有一个audio地址,在分配给虚拟机时,也是需要分配给虚拟机的。
2、使用libvirt进行解除绑定并配置开启自启执行命令
(1)查询设备ID:
virsh nodedev-list | grep pci
使用此命令查询的id与上面1中查询的id格式并不一样,查询其中一个设备确认是否为nvidia显卡对应id:
virsh nodedev-dumpxml pci_0000_01_00_0
如下图:
(2)、解除绑定
sudo modprobe pci_stub
sudo virsh nodedev-detach pci_0000_01_00_0
sudo virsh nodedev-detach pci_0000_01_00_1
#有多少张显卡,更换id执行多少次,每张显卡有两个id,需要两个id都解除绑定
(3)、设置自动解除绑定显卡
1、sudo vim /lib/systemd/system/rc-local.service #末尾添加:
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
#保存并退出
sudo systemctl enable rc-local.service
2、启动自启
sudo systemctl enable rc-local.service
3、编写rc.local
sudo vim /etc/rc.local
#!/bin/sh -e
sudo vim /etc/rc.local
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
#
# value on error.
# Make sure that the script will "exit 0" on success or any other
# In order to enable or disable this script just change the execution
#
#
# bits.
# By default this script does nothing.
# add your scritp here
echo "this shows rc.local is start onboot" > /usr/local/rc-local-info.log
sleep 1
sudo modprobe pci_stub
sleep 1
virsh nodedev-detach pci_0000_01_00_0
sleep 1
virsh nodedev-detach pci_0000_01_00_1
exit 0
#保存并退出,每行的virsh命令之间都隔一个sleep 1进行延迟,有多少张显卡更改id进行添加。
4、设置rc.local权限
sudo chmod -R +x /etc/rc.local
5、重启
sudo reboot
#如果已经在终端执行了解除绑定命令,可以不重启,设置rc.local是为了后面因为重启而导致显卡与系统进行了绑定,重启后,系统会重新绑定显卡。
六、创建虚拟机
1、virt-manager
下面就是进入win10安装过程,我这里就省略了,进入系统后关机
七、显卡直通虚拟机
然后apply后,开机
虚拟机中这里会有个感叹号的显示适配器,下一步就是去nvidia官网下载显卡驱动,显卡驱动安装好了后,虚拟机重启,必须重启,否则显卡无法被完全使用。
安装显卡驱动后,可以显示出显卡型号了,并且NVIDIA面板也可以打开
对此,虚拟机直通显卡测试成功。