在 PVE 7 中启用硬件直通功能

请注意,本教程已不再适用于英特尔(Intel)11代及以后的CPU的核显直通。

对于2022年以后发布的部分硬件,在操作前还请谨慎确认。

本教程是基于 PVE 7 进行编撰的,不保证在更新版本是否能成功。

对于英特尔12代CPU核显直通(SR-IOV,将核显划分成几个虚拟设备,分给多个虚拟机),请见 lala 的这篇文章:Proxmox VE iGPU直通(SR-IOV)https://lala.im/9233.html, PVE 8.2)。

就像 VMware Workstation 一样,PVE 也支持将硬件直通给虚拟机,例如网卡、硬盘、显卡、USB设备等。本篇文章将介绍如何启用 PVE 中的硬件直通功能,并为以后进行硬解做铺垫。

在进行操作之前,请先完整阅读该文章及推荐的两篇文章,如果可以,建议去谷歌搜索一下有关资料,中英文都要参阅一下。对于显卡直通的操作,存在一定的危险性,任何错误操作均有可能造成不可挽回的损失。如果给群晖进行核显或独显直通只是为了搭建流媒体服务器,Never 推荐直接在 PVE 中部署即可,无需进行核显或独显直通。

要开启硬件直通之前,需要确定机器的CPU及主板是否支持“VT-d”技术。查询CPU是否支持VT-d,Intel用户可到 https://www.intel.cn 搜索自己CPU型号,在“规格”中查阅以下两项:

若支持,则可以进行直通。AMD用户可到 https://www.amd.com 进行查询。然后,确认主板BIOS里的VT-d已开启,此处不过多进行介绍。

启用IOMMU功能

用网页端的 PVE shell 或 ssh 连接至 PVE,输入以下命令:

nano /etc/default/grub

在文档中找到 “GRUB_CMDLINE_LINUX_DEFAULT=”quiet””一行,

对于 Intel CPU 用户,将改行修改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

对于 AMD CPU 用户,将该行修改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

修改完成后,按 Ctrl+O 保存,按 Ctrl+X 退出文本编辑器。

然后输入下一行命令更新 Grub:

update-grub

加载相应的内核模块

在命令行中输入以下命令:

echo vfio >> /etc/modules
echo vfio_iommu_type1 >> /etc/modules
echo vfio_pci >> /etc/modules
echo vfio_virqfd >> /etc/modules

然后输入

update-initramfs -k all -u

来更新内核参数。然后重启 PVE

验证IOMMU是否开启成功

重启之后,在命令行输入以下命令:

dmesg | grep iommu

若有如类似于下图回显,则说明开启成功:

再输入:

find /sys/kernel/iommu_groups/ -type l

如果有类似于下图回显,就代表成功:

显卡直通

一般地,不推荐将显卡直通给特定虚拟机,有些命令执行不好会造成不可挽回的损失。建议将直通显卡的虚拟机不要勾选“开机自启动”,以便出现问题还可以用命令行救回。

依据自己显卡型号,在命令行输入以下命令:

#直通 AMD 显卡,请使用下面命令

echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf
 
#直通 Nvidia 显卡,请使用下面命令

echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
 
#直通 Intel 核显,请使用下面命令

echo "blacklist snd_hda_intel" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist snd_hda_codec_hdmi" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf 

将显卡绑定至 vfio-pci:

使用 lspci 命令,查看自己显卡的 pci id:

以上图为例,显卡的pci id为 65:00。上面的是显卡,下面的是显卡中的声卡。在直通时两者都要一起直通。接下来,输入 lspci -n 命令,查看对应pci id 的 设备 id 和 制造商 id:

以上图的 65:00 为例,65:00.0 为显卡,65:00.1 为声卡,复制两者后面的 设备id:制造商id(以上图为例,为 10de:1c03 和 10de:10f1),然后输入以下命令绑定(将<设备id1:制造商id1>和<设备id2:制造商id2>替换为自己设备里的):

echo "options vfio-pci ids=<设备id1:制造商id1>,<设备id2:制造商id2>" > /etc/modprobe.d/vfio.conf

以上图为例,则命令为:

echo "options vfio-pci ids=10de:1c03,10de:10f1" > /etc/modprobe.d/vfio.conf

执行完上述命令后,输入以下命令确定回显已设置为自己设备的两个id:

cat /etc/modprobe.d/blacklist.conf
cat /etc/modprobe.d/vfio.conf

对于 Nvidia 显卡,需要再输入一条命令更新内核:

echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf

然后输入:

update-initramfs -k all -u

随后重启 PVE。

然后开始显卡在 PVE 虚拟机里的直通,在硬件里添加“PCI 设备”,设备选择自己显卡型号,勾选 PCI-Express,注意千万不要勾选“主 GPU”。若不能勾选 PCI-Express,将机器类型更改为 q35

随后正常开机然后安装显卡驱动即可。

一般地,不推荐将显卡直通给特定虚拟机,有些命令执行不好会造成不可挽回的损失。建议将直通显卡的虚拟机不要勾选“开机自启动”,以便出现问题还可以用命令行救回。

核显直通

核显直通步骤与上述过程一样。若已完成上述步骤,请继续该部分。

本部分仅支持 Intel 5代~10代 CPU 的核显直通,处理器末尾带 F 或 P 的不带核显,无法直通。

在虚拟机的硬件中添加“PCI 设备”,设备选择自己显卡型号,其他的不做选择,点击添加。然后回到 PVE 的终端,输入以下命令查看虚拟机配置文档(将<vmid>替换为要直通的虚拟机的VMID):

nano /etc/pve/qemu-server/<VMID>.conf

在直通核显的 pci 设备(hostpciX,X为数字,其后面的pci id为核显的pci id)后修改为如下内容:

hostpciX: 0000:XX:XX.0,legacy-igd=1

其中,0000:XX:XX.X 为核显的pci id。

然后,在文档顶部添加以下内容:

args: -set device.hostpciX.x-igd-gms=1

启动机器,安装驱动即可。若无法开机,可以在 PVE 输入以下命令并移除直通的 PCI 设备:

qm set <VMID> --delete args

如果上面操作还是不行,请尝试添加vbios。关于核显直通的更多信息,另请参阅:

https://foxi.buduanwang.vip/yj/561.html

https://zhuanlan.zhihu.com/p/535623506

PVE 的硬件直通是一个道阻且长的过程,建议在非生产环境中执行,并在执行前对相关配置及系统进行备份。受系统更新及硬件迭代影响,本篇文章可能不适用于最新系统和硬件。

对于最新硬件,Never 还是交由小伙伴们自行深入研究咯~ 或许有一天你再回首这篇文章时,会说“Never 还欠费功夫”。

Digiprove sealCopyright secured by Digiprove © 2022 Never.