在开始配置双3090Ti显卡直通之前,确保你的硬件环境满足基本要求非常重要。我遇到过不少朋友因为硬件兼容性问题导致后续步骤无法进行,白白浪费了大量时间。首先需要确认的是CPU和主板是否支持VT-d(Intel平台)或AMD-Vi(AMD平台)技术。这个功能通常在BIOS中被称为"IOMMU"或"VT-d"。
检查方法很简单,在终端运行:
bash复制egrep -c '(svm|vmx)' /proc/cpuinfo
如果输出大于0,说明CPU支持虚拟化技术。但要注意,这还不够,你还需要进入BIOS确认IOMMU功能已经开启。以我的华硕Z790-P主板为例,需要在Advanced→System Agent Configuration→VT-d选项中设置为Enabled。
另一个常见问题是PCIe插槽分配。双3090Ti这样的高端显卡通常需要占用3槽空间,建议使用主板的第一和第三PCIe x16插槽(如果有的话)。在我的配置中,两张3090Ti分别安装在01:00.0和05:00.0位置,这样它们可以运行在x8/x8模式下,避免带宽瓶颈。
成功开启IOMMU后,我们需要对系统进行详细配置。Ubuntu 22.04默认使用GRUB引导,修改/etc/default/grub文件是关键一步。这里有个小技巧:在修改前先备份原文件,避免配置错误导致系统无法启动。
bash复制sudo cp /etc/default/grub /etc/default/grub.bak
然后编辑GRUB_CMDLINE_LINUX_DEFAULT参数,添加intel_iommu=on(Intel平台)或amd_iommu=on(AMD平台)。在我的案例中,完整配置如下:
bash复制GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt"
iommu=pt参数表示只对直通设备启用IOMMU,可以稍微提升系统性能。更新GRUB配置后重启系统:
bash复制sudo update-grub
sudo reboot
重启后验证IOMMU是否生效:
bash复制dmesg | grep -i iommu
如果看到大量"Adding to iommu group"信息,说明配置成功。接下来需要确定显卡所在的IOMMU组,这对后续隔离至关重要。
当系统中存在两张完全相同的3090Ti显卡时,传统的ID屏蔽方法会同时影响两张卡,这显然不是我们想要的。经过多次尝试,我发现最可靠的方法是使用脚本动态屏蔽。
首先通过lspci确认显卡信息:
bash复制lspci -nnv | grep -i nvidia
在我的系统中输出如下:
code复制01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2203] (rev a1)
01: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)
05:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)
创建屏蔽脚本/etc/initramfs-tools/scripts/init-top/vfio.sh:
bash复制#!/bin/sh
echo "vfio-pci" > /sys/bus/pci/devices/0000:01:00.0/driver_override
echo "vfio-pci" > /sys/bus/pci/devices/0000:01:00.1/driver_override
exit 0
给脚本执行权限并更新initramfs:
bash复制sudo chmod 744 /etc/initramfs-tools/scripts/init-top/vfio.sh
sudo update-initramfs -u -k all
这个方法的巧妙之处在于它只针对特定PCI地址的设备进行操作,完美解决了同型号显卡的隔离问题。重启后使用lspci检查,应该能看到目标显卡的驱动已变为vfio-pci。
安装必要的KVM组件:
bash复制sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager ovmf
启动libvirtd服务并设置开机自启:
bash复制sudo systemctl enable --now libvirtd
创建Windows虚拟机时有几个关键点需要注意:
我推荐使用virt-manager的图形界面进行初始配置,这样不容易出错。创建完成后,可以通过编辑XML文件进一步优化配置:
xml复制<cpu mode='host-passthrough' check='none' migratable='on'>
<topology sockets='1' dies='1' cores='6' threads='2'/>
</cpu>
<features>
<hyperv mode='custom'>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='8191'/>
</hyperv>
<vmport state='off'/>
</features>
在虚拟机中安装完Windows后,首先需要安装NVIDIA官方驱动。这里有个坑要注意:最新版的NVIDIA驱动可能会检测到运行在虚拟机环境中而拒绝安装。解决方法是在虚拟机XML中添加以下隐藏标记:
xml复制<kvm>
<hidden state='on'/>
</kvm>
安装驱动后,还需要解决显示器问题。由于直通的显卡没有物理连接显示器,我们需要创建虚拟显示器。使用IDD(Indirect Display Driver)是个不错的选择:
cmd复制deviceinstaller64 install usbmmidd.inf usbmmidd
deviceinstaller64 enableidd 1
这样会在Windows中创建一个虚拟显示器。建议将其分辨率设置为3840x2160(4K)并设为主显示器,这样Parsec等远程桌面软件才能充分利用显卡的编码能力。
Parsec的默认设置可能无法充分发挥3090Ti的性能,需要进行一些调整:
在Parsec客户端设置中:
在Windows主机端:
如果遇到P2P连接问题,可以尝试以下解决方案:
对于专业应用场景,我还推荐在注册表中调整一些参数:
reg复制Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Parsec]
"encoder_bitrate"=dword:0000c350
"encoder_hardware_accelerated"=dword:00000001
"encoder_hardware_full_range"=dword:00000001
在配置过程中,我遇到过几个典型问题:
直通后宿主机无法启动:
虚拟机启动黑屏:
Parsec延迟高:
性能不如预期:
对于网络问题,一个实用的诊断命令是:
bash复制sudo tcpdump -i any -n udp port 8000-8004
这可以检查Parsec的UDP流量是否正常传输。
经过一段时间的实际使用,我发现以下几个优化可以进一步提升体验:
bash复制virsh vcpupin <domain> <vcpu> <host-cpu>
将虚拟机的vCPU绑定到特定物理核心,减少缓存失效。
bash复制sudo sysctl vm.nr_hugepages=2048
在/etc/sysctl.conf中永久设置,可以显著减少内存访问延迟。
bash复制sudo apt install linux-rt
安装实时内核可以减少调度延迟,但对系统稳定性有一定影响。
xml复制<interface type='hostdev' managed='yes'>
<source>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</source>
</interface>
对于需要极致性能的场景,还可以考虑使用Looking Glass技术实现近乎零延迟的本地显示输出。这需要额外的配置,但效果非常惊艳。