文章目录[隐藏]
介绍
PCI直通允许您在VM内部使用物理PCI设备(图形卡,网卡)(仅限KVM虚拟化)。如果您“PCI passthrough”设备,该设备将不再可用于主机。
注意:PCI passthrough是Proxmox VE中的一项实验性功能
要启用硬件直通的话先要确保硬件支持VT-D和VT-X,CPU必须支持硬件虚拟化(为了使用 kvm)和 IOMMU(为了使用 VGA 直通)并保证主板中相关功能的开启
添加CPU支持,开启iommu
- IOMMU 是 Intel VT-d 和 AMD-Vi 的通用名称。
- VT-d 指的是直接输入/输出虚拟化(Intel Virtualization Technology for Directed I/O),不应与VT-x(x86平台下的Intel虚拟化技术,Intel Virtualization Technology)混淆。VT-x 可以让一个硬件平台作为多个“虚拟”平台,而 VT-d 提高了虚拟化的安全性、可靠性和 I/O 性能。
设置完之后最好重新启动一下
reboot
查询网卡信息
lspci | grep -i ethernet
显示
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@pve:~# lspci | grep -i ethernet
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-LM
01:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
01:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
01:00.2 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
01:00.3 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 16)
root@pve:~#
Intel CPU
修改grub
- 编辑文件/etc/default/grub
- 修改行“GRUB_CMDLINE_LINUX_DEFAULT=“quiet”
- 使其为“GRUB_CMDLINE_LINUX_DEFAULT=“quiet intel_iommu=on”
- 使用update-grub更新
- 验证其有效性,从命令行运行“dmesg | grep -e DMAR -e IOMMU”。如果没有输出,则出现问题。极有可能是bios设置的问题,需要启动cpu的vt-x支持。
vi /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet"
修改为 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
update-grub
dmesg | grep -e DMAR -e IOMMU
AMD CPU
修改grub
- 编辑文件/etc/default/grub
- 修改行“GRUB_CMDLINE_LINUX_DEFAULT=“quiet”
- 使其为“GRUB_CMDLINE_LINUX_DEFAULT=“quiet amd_iommu=on”
- 使用update-grub更新
- 验证其有效性,从命令行运行“dmesg | grep -e DMAR -e IOMMU”。如果没有输出,则出现问题。极有可能是bios设置的问题,需要启动cpu的vt-x支持。
vi /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet"
修改为 GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"
update-grub
dmesg | grep -e DMAR -e IOMMU
新增所需模块
修改文件/etc/modules,加入如下的行
vi /etc/modules
vfio vfio_iommu_type1 vfio_pci vfio_virqfd
执行命令来更新initramfs
update-initramfs -u -k all.
添加PCI设备
命令模式添加
- 使用命令找到网卡PCI的地址,地址应采用以下形式:01:00.0
- 打开文件进行手工添加
- 集群:/etc/pve/nodes/你的集群名称/qemu-server/虚拟机id.conf
- PCI:/etc/pve/qemu-server/vmid.conf
- PCIE: /etc/pve/qemu-server/.conf
查找网卡ID
lspci | grep net
或者
lspci
添加PCI
vi /etc/pve/qemu-server/vmid.conf
添加一个pci地址:
hostpci0: 01:00.0
添加多个pci地址方式1:
hostpci0: 01:00.0;01:00.1
添加多个pci地址方式2:
hostpci0: 01:00.0
hostpci1: 01:00.1
添加统称所有pci地址,自动传递所有功能:
hostpci0: 01:00
添加PCIE
vi /etc/pve/qemu-server/111.conf
machine: q35
hostpci0: 01:00.0,pcie=1
web页面模式添加
硬件->添加,选择PCI设备->选择,完成
如需更改为PCIE,可设置机器为q35
如果添加了PCI设备开启虚拟机正常使用那后面的就不需要看了
如果添加了PCI设备无法开启虚拟机的话需要允许不安全的中断
- 先验证IOMMU是否有效
- 再查看IOMMU是否可以中断重映射
- 后启用中断重映射,允许不安全的中断
验证IOMMU有效
要让pci passthrough正常工作,您需要为您的pci设备提供专用的iommu组
find / sys / kernel / iommu_groups / -type l
输入命令后有相关东西输出,则表示正常
如果没有则需要进行IOMMU中断重映射,只有每个IOMMU都支持中断重映射,才会启用中断重映射。
IOMMU中断重映射
没有中断重映射就不可能使用PCI passthrough。
对于KVM用户,设备分配将失败,出现’Failed to assign device "[device name]"的错误,即“无法分配设备”[设备名称]“:操作不允许”错误,并且’未找到中断重映射硬件,将设备传递到非特权域是不安全的。
不支持中断重映射的系统:
- 所有使用AMD处理器和芯片组的系统都支持AMD I / O虚拟化(AMD-Vi)。这种硬件具有中断重映射支持; 但是,上游尚未提供软件支持。
- 所有使用英特尔处理器和芯片组的系统都支持英特尔定向I / O虚拟化技术(VT-d),但不支持中断重映射。新的处理器和芯片组提供了中断重映射支持。要确定您的系统是否支持中断重映射:
查看中断重映射
- 运行“dmesg | grep ecap”命令。
- 在IOMMU行上,“ecap”之后的十六进制值表示是否支持中断重映射。如果该值的最后一个字符是8,9,a,b,c,d,e或f,则支持中断重映射。例如,“ecap 1000”表示没有中断重映射支持。“ecap 10207f”表示中断重映射支持,因为最后一个字符是“f”。
启用中断重映射
- 官方文档是这个
If your system doesn’t support interrupt remapping,
you can allow unsafe interrupts with:
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
- 或者添加驱动黑名单
vi /etc/modprobe.d/pve-blacklist.conf
文件里面添加一行
options vfio_iommu_type1 allow_unsafe_interrupts=1
来启用不安全的中断
之后就可以通过图形化界面执行PCIE设备的直通操作了