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:1c82 和 10de: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
reboot3.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,也就是说目前宿主机不再使用该设备了。这样就可以直通给虚拟机使用。