ProxmoxVE显卡直通配置

笔记 · 今天 · 2 人浏览

1、前言

啊~ 久违的写备忘时刻。我什么时候才能不忘掉之前做的操作啊摔!!!

最近搞了一台联想的HR650X服务器,想着作为新的计算中心跑点项目,80个框框不用浪费,话说他是真费电啊,随便带点负载就200瓦。

神特么的内存什么时候价格能降下去!!现在16G 200+是什么玩意儿,这玩意儿之前就几十块来着!

2、环境准备

Proxmox版本:9.2.2

直通显卡:GTX1050ti

客户机版本:Windows 11

3、初始配置

首先,为了能够直通设备给客户机,我们需要禁止宿主机访问该设备,以保证该设备能够完全被客户机独占,同时要在宿主系统中启用IOMMU直通,也就是所谓的硬件直通,这是一切的基础。

3.1、修改IOMMU代理方式

在PVE中,检查是否有IOMMU启用的方式很简单。

dmesg | grep -i iommu

#输出如下
root@server:~# dmesg | grep -i iommu
[    0.335107] DMAR-IR: IOAPIC id 12 under DRHD base  0xc5ffc000 IOMMU 6
#注意:下面这一行代表iommu工作在代理模式,同样可以进行直通,但性能略有影响。
[    1.738440] iommu: Default domain type: Translated
[    1.738440] iommu: DMA domain TLB invalidation policy: lazy mode
#注意:通常需要iommu=pt内核参数来使用pass-through域类型,稍后会进行修改

可以看到IOMMU现在为开着的状态,但工作模式不对,为了使虚拟机不再使用我们要直通的设备,需要更改下模式。

编辑/etc/default/grub文件,添加内核启动参数

root@server:~# nano /etc/default/grub

# If you change this file or any /etc/default/grub.d/*.cfg file,
# run 'update-grub' afterwards to update /boot/grub/grub.cfg.
# For full documentation of the options in these files, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`( . /etc/os-release && echo ${NAME} )`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

找到GRUB_CMDLINE_LINUX_DEFAULT这一行,根据CPU类型改为以下内容

#INTEL CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

#AMD CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

然后更新grub并重启系统。

update-grub
reboot

等待系统重启之后,再次查看下IOMMU的工作状态

root@server:~# dmesg | grep -i -e DMAR -e IOMMU -e AMD-Vi
.....
[    1.899627] pci 0000:d7:16.0: Adding to iommu group 157
[    1.899831] pci 0000:d7:16.4: Adding to iommu group 157
[    1.900039] pci 0000:d7:17.0: Adding to iommu group 158
[    2.015975] DMAR: Intel(R) Virtualization Technology for Directed I/O #代表已经启用IOMMU

3.2、禁止宿主机占用指定设备

首先,编辑Linux模块文件,以解除宿主机对显卡的占用。

root@server:~# nano /etc/modules

# /etc/modules is obsolete and has been replaced by /etc/modules-load.d/.
# Please see modules-load.d(5) and modprobe.d(5) for details.
#
# Updating this file still works, but it is undocumented and unsupported.

# Generated by sensors-detect on Tue Jun 30 20:16:42 2026
# Chip drivers
coretemp

在文件末尾追加

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

然后,需要获取被直通显卡的设备ID,执行如下命令

root@server:~# lspci -nn | grep -i nvidia

#输出示例
af:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] [10de:1c82] (rev a1)
af:00.1 Audio device [0403]: NVIDIA Corporation GP107GL High Definition Audio Controller [10de:0fb9] (rev a1)

记录下显卡和显卡自带声卡的设备id 10de:1c8210de:0fb9,然后创建一个vfio配置文件

root@server:~# nano /etc/modprobe.d/vfio.conf
#写入以下行使vfio接管pci对应设备

options vfio-pci ids=10de:1c82,10de:0fb9

还需要屏蔽开源的 nouveau 驱动和官方的 nvidia 驱动

echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_modeset" >> /etc/modprobe.d/blacklist.conf

然后更新内核并重启系统

update-initramfs -u -k all
reboot

3.2、验证隔离状态

配置完成后,检查当前显卡正在使用的是哪个驱动,看下是否仍然被宿主机所使用。

root@server:~# lspci -nnk | grep -A 3 -i nvidia
af:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] [10de:1c82] (rev a1)
        Subsystem: ZOTAC International (MCO) Ltd. Device [19da:2463]
        Kernel driver in use: vfio-pci
        Kernel modules: nvidiafb, nouveau, nova_core
af:00.1 Audio device [0403]: NVIDIA Corporation GP107GL High Definition Audio Controller [10de:0fb9] (rev a1)
        Subsystem: ZOTAC International (MCO) Ltd. Device [19da:2463]
        Kernel driver in use: vfio-pci
        Kernel modules: snd_hda_intel

注意看:Kernel driver in use: vfio-pci 内核驱动已经变成了vfio,也就是说目前宿主机不再使用该设备了。这样就可以直通给虚拟机使用。

PVE 显卡直通