Proxmox VE 设备 PCIe 直通完全指南 🔌

本指南详细介绍在 PVE 中配置 PCIe 设备直通的方法,包括 Intel 和 AMD 平台的 IOMMU 配置,特别针对 Intel 核显 SR-IOV 功能的开启和验证。通过本指南,您可以将 GPU、网卡、NVMe 等设备直接分配给虚拟机,获得接近原生的性能体验!🚀


🧭 导航目录


✨ 功能与特点

  • 🔧 全面支持:支持 Intel 和 AMD 平台的 IOMMU 配置
  • 🖥️ 核显虚拟化:详细讲解 Intel GPU SR-IOV 虚拟化技术
  • 📊 性能优化:提供多种性能调优方案,充分发挥硬件潜力
  • 🔒 安全建议:包含安全注意事项,确保系统稳定可靠
  • 🐛 故障排除:常见问题解决方案,帮助您快速排查问题
  • 💡 实用示例:多种实际应用场景,直接套用即可

⚙️ 一、PCIe 设备直通配置

1. 配置 GRUB 启动参数

1
2
3
4
5
6
7
8
9
# 编辑 GRUB 配置启用 IOMMU 和 SR-IOV 功能
sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/c\GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream i915.enable_guc=3 i915.max_vfs=7"' /etc/default/grub

# 🔧 参数说明:
# intel_iommu=on - 启用 Intel IOMMU(AMD 平台使用 amd_iommu=on)
# iommu=pt - 标识用于直通的设备
# pcie_acs_override - 绕过 ACS 检查,解决分组问题(可能有安全风险)
# i915.enable_guc=3 - 启用 GuC 和 HuC 固件加载(0=禁用, 1=启用GuC, 2=启用HuC, 3=全部启用)
# i915.max_vfs=7 - 设置最大虚拟功能数为7(根据具体显卡调整)

2. 添加必要的内核模块

1
2
3
4
5
6
7
8
# 添加 VFIO 相关模块到自动加载列表
echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" | tee -a /etc/modules

# 📦 模块说明:
# vfio - 虚拟功能 I/O 框架
# vfio_iommu_type1 - Type1 IOMMU 支持
# vfio_pci - PCI 设备 VFIO 驱动
# vfio_virqfd - 虚拟中断处理

3. 配置 VFIO 模块选项

1
2
3
4
5
6
# 创建 VFIO 配置文件
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/vfio.conf
echo "options vfio-pci disable_vga=1" >> /etc/modprobe.d/vfio.conf

# 🎯 对于特定设备ID,可以明确指定
# echo "options vfio-pci ids=8086:4680,10de:1c03" >> /etc/modprobe.d/vfio.conf

4. 更新系统配置

1
2
3
4
5
6
7
8
9
# 更新 GRUB 配置
update-grub

# 更新 initramfs 所有内核
update-initramfs -u -k all

# 重启系统使配置生效
reboot
# 🔄 重启后配置才会完全生效

🔍 二、验证 PCIe 直通状态

1. 检查 PCIe 设备列表

1
2
3
4
5
6
7
8
9
10
# 查看所有 PCIe 设备
lspci

# 查看详细信息(包括设备ID)
lspci -nn

# 📋 示例输出:
# 00:00.0 Host bridge: Intel Corporation Device 461c [8086:461c]
# 00:02.0 VGA compatible controller: Intel Corporation AlderLake-S GT1 [8086:4680]
# 00:14.0 USB controller: Intel Corporation Device 54ed [8086:54ed]

2. 检查 IOMMU 分组

1
2
3
4
5
6
7
8
9
# 查看 IOMMU 分组情况
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/*}; n=${n%%/*}
printf 'IOMMU Group %s ' "$n"
lspci -nns "${d##*/}"
done

# 🎯 确认要直通的设备在独立的 IOMMU 组中
# 如果设备不在独立组中,可能需要使用 pcie_acs_override 参数

3. 验证 IOMMU 是否启用

1
2
3
4
5
6
7
8
9
10
11
# 检查 DMA 重映射是否启用
dmesg | grep -i iommu

# ✅ 应该显示: DMAR: IOMMU enabled

# 检查 Intel IOMMU 状态
dmesg | grep -e DMAR -e IOMMU

# 🔍 确认没有错误信息,如:
# DMAR: DRHD: handling fault status reg 3
# DMAR: [DMA Read] Request device [00:02.0] fault addr 0xfed90000

4. 检查核显 SR-IOV 状态

1
2
3
4
5
6
7
8
9
# 查看 Intel 显卡信息
lspci | grep -i vga

# 🖥️ 示例: 00:02.0 VGA compatible controller: Intel Corporation AlderLake-S GT1

# 检查虚拟功能支持
cat /sys/bus/pci/devices/0000:00:02.0/sriov_totalvfs

# 📊 显示支持的虚拟功能数量(如果是0则表示不支持或需要先启用)

🛠️ 三、高级配置选项

1. 设备黑名单配置

1
2
3
4
5
6
# 防止宿主机占用要直通的设备
echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf

# 🚫 阻止宿主机加载可能冲突的驱动

2. VFIO 驱动程序绑定

1
2
3
4
5
6
7
8
9
10
# 手动绑定设备到 VFIO 驱动
echo "8086 4680" > /sys/bus/pci/drivers/vfio-pci/new_id

# 🔧 将特定设备ID绑定到 VFIO(将 8086:4680 替换为您的设备ID)

# 解绑当前驱动(如果需要)
echo "0000:00:02.0" > /sys/bus/pci/devices/0000:00:02.0/driver/unbind

# 绑定到 VFIO
echo "0000:00:02.0" > /sys/bus/pci/drivers/vfio-pci/bind

3. SR-IOV 虚拟功能创建

1
2
3
4
5
6
7
8
9
10
# 启用 SR-IOV 虚拟功能
echo 7 > /sys/bus/pci/devices/0000:00:02.0/sriov_numvfs

# 🎯 创建7个虚拟功能(根据硬件支持调整)

# 检查虚拟功能状态
lspci | grep "Virtual Function"

# 查看每个VF的详细信息
ls /sys/bus/pci/devices/0000:00:02.0/virtfn*

⚠️ 四、故障排除

1. 常见问题解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 如果 IOMMU 没有启用,检查 BIOS 设置
# 确保 BIOS 中启用:
# - VT-d (Intel) 或 AMD-Vi (AMD)
# - SR-IOV 支持
# - Above 4G Decoding
# - SVM Mode (AMD)

# 检查内核参数是否正确应用
cat /proc/cmdline

# 🔍 确认参数包含: intel_iommu=on iommu=pt

# 如果设备不在独立IOMMU组,尝试添加:
# pcie_acs_override=downstream,multifunction

2. 模块加载检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 检查 VFIO 模块是否加载
lsmod | grep vfio

# ✅ 应该显示: vfio_pci, vfio_iommu_type1, vfio

# 检查模块参数
modinfo vfio-pci

# 手动加载模块
modprobe vfio
modprobe vfio_pci
modprobe vfio_iommu_type1

# 检查dmesg是否有错误
dmesg | grep -i vfio

3. 设备直通验证

1
2
3
4
5
6
7
8
9
# 检查设备是否由 VFIO 驱动管理
lspci -nnk | grep -i vfio

# 📋 显示由 VFIO 管理的设备列表

# 查看具体设备的驱动信息
lspci -vvv -s 00:02.0 | grep driver

# 应该显示: Kernel driver in use: vfio-pci

4. SR-IOV 特定问题

1
2
3
4
5
6
7
8
# 如果无法创建VF,检查GuC固件状态
dmesg | grep -i guc

# 检查i915驱动状态
dmesg | grep -i i915

# 可能需要更新内核或添加特定参数
# 如: i915.enable_guc=2 i915.enable_sriov=1

💡 五、应用场景示例

1. 核显直通给虚拟机

1
2
3
4
5
6
7
8
9
10
11
12
13
# 在虚拟机配置中添加直通设备
qm set 101 -hostpci0 0000:00:02.0

# 🖥️ 将核显直通给虚拟机ID 101

# 对于 SR-IOV 虚拟功能
qm set 101 -hostpci0 0000:00:02.1
qm set 102 -hostpci0 0000:00:02.2

# 🎯 将不同的虚拟功能分配给不同虚拟机

# 在虚拟机配置中启用PCIe直通选项
qm set 101 -hostpci0 0000:00:02.0,pcie=1,rombar=0,x-vga=1

2. 网卡直通配置

1
2
3
4
5
6
7
8
9
10
# 查看网卡设备
lspci | grep -i ethernet

# 🌐 示例: 01:00.0 Ethernet controller: Intel Corporation I226-V [8086:125c]

# 直通网卡到虚拟机
qm set 101 -hostpci1 0000:01:00.0

# 多队列网卡优化
qm set 101 -hostpci1 0000:01:00.0,queues=4

3. NVMe 存储直通

1
2
3
4
5
6
7
8
9
10
# 查看 NVMe 设备
lspci | grep -i nvme

# 💾 示例: 06:00.0 Non-Volatile memory controller: Silicon Motion SM2263EN [126f:2263]

# 直通 NVMe 硬盘
qm set 101 -hostpci2 0000:06:00.0

# 启用PCIe ACS override(如果NVMe不在独立IOMMU组)
# 在GRUB参数中添加: pcie_acs_override=downstream

4. 独立显卡直通

1
2
3
4
5
6
7
8
9
10
# 查看所有GPU设备
lspci | grep -i vga

# 🎮 示例: 03:00.0 VGA compatible controller: NVIDIA Corporation GP106 [10de:1c03]

# 直通独立显卡
qm set 101 -hostpci0 0000:03:00.0

# 同时直通音频设备(如果有)
qm set 101 -hostpci1 0000:03:00.1

📊 六、性能优化建议

1. CPU 隔离设置

1
2
3
4
5
6
7
8
9
10
11
# 隔离 CPU 核心用于直通设备
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&isolcpus=2-3 /' /etc/default/grub

# 🔧 隔离 CPU 2-3 用于虚拟机处理中断
# 更新后需要: update-grub && reboot

# 检查隔离的CPU
cat /sys/devices/system/cpu/isolated

# 在虚拟机配置中绑定vCPU到隔离的核
qm set 101 -cores 2 -sockets 1

2. 中断亲和性设置

1
2
3
4
5
6
7
8
9
# 设置中断亲和性(将中断绑定到特定CPU)
# 首先找到设备的中断号
grep "I226" /proc/interrupts | awk '{print $1}' | cut -d: -f1

# 然后设置亲和性(假设中断号为42,绑定到CPU2)
echo 4 > /proc/irq/42/smp_affinity

# 🎯 将网卡中断绑定到特定 CPU(4 = 2^2,表示CPU2)
# 可以使用 irqbalance 服务自动管理中断分配

3. 内存大页配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 启用大页支持(2MB大页)
echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf
sysctl -p

# 🚀 提高内存访问性能,减少TLB miss

# 检查大页状态
cat /proc/meminfo | grep Huge

# 在虚拟机配置中使用大页
qm set 101 -hugepages 1

# 对于1GB大页(需要CPU和内核支持)
echo "vm.nr_hugepages = 8" >> /etc/sysctl.conf
echo "vm.hugetlb_shm_group = 107" >> /etc/sysctl.conf # kvm组ID

4. NUMA 优化

1
2
3
4
5
6
7
8
9
10
# 检查NUMA拓扑
numactl -H

# 🔍 查看CPU和内存的NUMA节点分布

# 将虚拟机绑定到特定NUMA节点
qm set 101 -numa 1

# 确保直通设备与虚拟机vCPU在同一NUMA节点
# 使用 numactl --cpunodebind=0 --membind=0 测试性能

🔒 七、安全注意事项

1. ACS 覆盖警告

1
2
3
4
5
6
7
# pcie_acs_override 可能降低安全性
# 仅在必要时使用,并了解风险

# 🔓 安全性考虑:
# - 仅在内网环境使用ACS override
# - 定期检查系统安全更新
# - 考虑使用更安全的替代方案(如硬件支持ACS)

2. 设备隔离验证

1
2
3
4
5
6
7
8
9
# 确认直通设备完全从宿主机隔离
lspci -nnk | grep -A2 "00:02.0"

# ✅ 应该显示由 vfio-pci 驱动管理,而不是宿主机驱动

# 检查设备是否在宿主机中不可见
ls /dev/dri/ # 不应该看到直通的GPU设备

# 确保宿主机没有使用直通设备

3. 定期安全检查

1
2
3
4
5
6
7
8
9
10
11
# 检查直通设备状态
dmesg | grep -i "vfio\|iommu"

# 🔍 监控是否有错误或警告信息

# 检查安全更新
apt update && apt list --upgradable

# 定期审查直通配置
cat /etc/modprobe.d/vfio.conf
cat /etc/default/grub

4. 虚拟机隔离

1
2
3
4
5
6
7
# 确保虚拟机之间的设备隔离
# 特别是使用SR-IOV时,不同VF应该分配给不同虚拟机

# 使用不同的IOMMU组验证隔离
ls /sys/kernel/iommu_groups/

# 每个虚拟机应该使用不同IOMMU组中的设备

🎯 八、完整验证流程

1. 重启后验证步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 检查 IOMMU 状态
dmesg | grep -i iommu

# 2. 验证 VFIO 模块
lsmod | grep vfio

# 3. 检查设备分组
lspci -vvv

# 4. 确认设备驱动
lspci -nnk | grep -A2 "00:02.0"

# 5. 测试直通功能
# 创建测试虚拟机并添加直通设备

2. 性能测试命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 测试直通设备性能
# 对于网卡:
iperf3 -c target_ip -t 60 -P 4

# 对于存储:
fio --filename=/dev/nvme0n1 --rw=randread --bs=4k --iodepth=64 \
--size=1G --name=test --direct=1 --output=result.txt

# 对于显卡(在虚拟机内):
glxinfo -B | grep -E "(OpenGL|Renderer)"
vainfo # 检查VAAPI支持

# 对于SR-IOV虚拟功能:
# 在每个VF分配的虚拟机中同时运行性能测试

3. 稳定性测试

1
2
3
4
5
6
7
8
# 长时间运行测试
stress-ng --cpu 4 --io 2 --vm 1 --vm-bytes 1G --timeout 24h

# 监控系统状态
watch -n 1 'dmesg | tail -10; lspci -vvv -s 00:02.0 | grep -i "status\|error"'

# 检查是否有DMA错误或其他问题
dmesg | grep -i "dma.*error\|iommu.*error"

4. 恢复方案

1
2
3
4
5
6
7
8
9
10
# 如果配置出现问题,恢复步骤:
# 1. 从GRUB中移除直通参数
# 2. 注释或删除/etc/modules中的vfio模块
# 3. 删除/etc/modprobe.d/中的vfio配置文件
# 4. 更新grub和initramfs
# 5. 重启系统

# 备份重要配置
cp /etc/default/grub /etc/default/grub.backup
cp /etc/modules /etc/modules.backup

🚀 通过以上配置,您的 PVE 系统应该能够成功支持 PCIe 设备直通,特别是 Intel 核显的 SR-IOV 功能。记得在生产环境中进行充分测试!


📝 更新日志

  • 2024-01-15:初始版本发布
  • 2024-01-20:增加SR-IOV故障排除内容
  • 2024-02-01:补充性能优化和安全注意事项

❓ 常见问题

Q: 直通后宿主机无法正常启动怎么办?
A: 进入恢复模式,回滚配置或移除直通参数。

Q: SR-IOV 虚拟功能创建失败?
A: 检查BIOS中SR-IOV支持是否启用,尝试不同的i915.enable_guc值。

Q: 直通设备在虚拟机中无法识别?
A: 确认设备已绑定到vfio-pci驱动,检查IOMMU分组是否正确。

🔗 参考资源


快乐直通!🎉 如有问题,欢迎在评论区留言讨论。