请注意,本教程已不再适用于英特尔(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://zhuanlan.zhihu.com/p/535623506
PVE 的硬件直通是一个道阻且长的过程,建议在非生产环境中执行,并在执行前对相关配置及系统进行备份。受系统更新及硬件迭代影响,本篇文章可能不适用于最新系统和硬件。
对于最新硬件,Never 还是交由小伙伴们自行深入研究咯~ 或许有一天你再回首这篇文章时,会说“Never 还欠费功夫”。
Copyright secured by Digiprove © 2022 Never.
执行update-initramfs -k all -u之后。产生日志,不知道会不会有什么影响
update-initramfs: Generating /boot/initrd.img-5.15.30-2-pve
Running hook script ‘zz-proxmox-boot’..
Re-executing ‘/etc/kernel/postinst.d/zz-proxmox-boot’ in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
没关系的,忽略即可。但是还是要说一下,本篇已经很久没更新了,建议搜寻一下其他教程合并操作。