【完整详细教程】Ubuntu22

参考文献: 配置GPU直传kvm虚拟机 - 虚拟机GPU直通,step by step - 机械意志 ()lspci的输出简单分析 - 成蹊 - 博客园 ()PCIvia OVMF - Arch Linux 中文维基 ()Win10/11 如何开启 第二屏幕/副屏/虚拟显示器,让平板成为副屏 - 知乎 ()
首先声明,本文的背景是在两张同型号的中选择一张进行直通,在整个直通过程中,上面的参考文献给与了我很大的帮助,本篇内容是我基于他们描述完整操作后的记录,其中不乏对原文的直接摘抄,但也结合了我个人的机器情况进行了重新梳理,并进行了多次可行性验证,因为每个人的机器情况可能都大不相同,希望我的记录能给和我相同配置的同学一些帮助 。如果有不懂的命令,建议大家查一下GPT,可能理解起来会快很多 。
直通步骤: 1. 确定是否支持虚拟化:
确定本机是否支持VT-P虚拟化,一般需要主板BIOS开启VT-P 。如果不能进BIOS确认,也可以在终端里确认 。
检查CPU是否支持虚拟化,运行如下命令:
$ egrep -c '(svm|vm)' /proc/
如果显示为0,则不支持虚拟化 。
系统配置:.04.1 LTS,GPU 3090 Ti*2,CPU i7,主板 华硕Z790-P
2. 在宿主机系统中启用iommu组:
打开/etc//grub,找到E FAULT,修改为下面内容:
="quiet=on"
接着我们需要更新grub:
$ sudo -grub -u
然后重启电脑,重启完后我们需要检查iommu有没有被正确启用:
$ dmesg | grep -i iommu
如果你在输出中看到很多pci xxxx:xx:xx.x:to iommu group xx,那么恭喜你,第一步完成了 。
系统中的所有设备只能按照iommu group为单位分配给宿主机或者虚拟机 。因此如果你看到两个不相关的设备在一个group里,那也没招,你只能给这俩设备一起丢虚拟机里去 。
很可惜的是,Linux系统并不支持预留iommu group 。
iommu group是硬件实现上的分组 。在Linux的实现中,只认得各个在总线上的硬件,并挨个挨个的启动起来 。
我们要做的就是阻止Linux内核在启动时初始化某些组里的硬件 。
3. 寻找我们需要预留的iommu组:
首先确认我们显卡所在的PCIE总线和产品型号:
$ lspci -nnv | grep -i
我的电脑上输出如下:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2203] (rev a1) (prog-if 00 [VGA controller])Kernel driver in use: nvidiaKernel modules: nvidiafb, nouveau, nvidia_drm, nvidia01:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)05:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2203] (rev a1) (prog-if 00 [VGA controller])Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia05:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)
可以看到输出分成两部分,编号加设备描述 。01:00.0和01:00.1是编号通过冒号 “:” 又分成了三部分,第一个部分是PCIe的ID,第二个部分是 bus ID,第三个部分是id. id 。PCI设备的组织形式是一个树形,这表示一个可以包含多个bus,一个bus又包含了多个,一个又包含多个 。
0300 是一个用来区分不同设备的编号,网络设备、存储设备、多媒体设备、显卡都有自己的编号 。
10de:2203 这是一个厂商特有的编号,10de是 的编号( ID),所有的设备都是使用这一编号,2203 表示这是一个显卡 。
以上参考:lspci的输出简单分析 - 成蹊 - 博客园 (),可以在这个博客里继续查找自己的显卡信息 。
接下来我们需要找出我们的设备所在的iommu group:
$ sudo dmesg | grep iommu | grep 01:00.0
输出如下:
[0.536462] pci 0000:01:00.0: Adding to iommu group 17$ sudo dmesg | grep iommu | grep 05:00.0[0.536491] pci 0000:05:00.0: Adding to iommu group 20