开启直通
开启直通功能
可以通过两种方式开启直通功能:
- 手工修改
- 用 pvetools 工具帮忙
准备工作
主板bios设置
必须先在主板 bios 中开启 cpu 的 VD-T 支持和虚拟化支持。
VD-T不支持就无法直通。intel 要 b75 以上芯片组才支持。也就是需要从 intel 4代酷睿处理器开始才支持。
虚拟机设置
在创建虚拟机时,芯片组一定要q35 。因为Q35,才能 PCIE 直通,否则就是 PCI 直通。
手工
开启 iommu
vi /etc/default/grub
修改 GRUB_CMDLINE_LINUX_DEFAULT,增加 intel_iommu=on 。使用 intel_iommu=on 后,开机会有内核crash,可以尝试加一个 iommu=pt。这样就是:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=disable intel_iommu=on iommu=pt pcie_acs_override=downstream pci=realloc=off"
备注: 安装完成后的默认值是
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=disable"
解释:
pcie_acs_override=downstream
pci=realloc=off
修改完成之后,更新 grub:
update-grub
设置虚拟化驱动
vi /etc/modules
增加以下内容:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
备注: 安装完成后的默认值是空,仅有少量注释。
升级并更新配置:
update-initramfs -u -k all
之后重启机器。
pvetools
使用 pvetools 就简单了,只要在 pvetools 的菜单中选择 “配置PCI硬件直通” -》“配置开启物理机硬件直通支持”。
完成后重启机器。
检验
检验 iommu 是否开启
dmesg | grep -e DMAR -e IOMMU
正确开启时的输出会类似如下:
[ 0.000000] Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA
[ 0.033632] ACPI: DMAR 0x00000000BC4B0870 0000B8 (v01 INTEL HSW 00000001 INTL 00000001)
[ 0.033687] ACPI: Reserving DMAR table memory at [mem 0xbc4b0870-0xbc4b0927]
[ 0.066765] DMAR: IOMMU enabled
[ 0.186968] DMAR: Host address width 39
[ 0.186972] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[ 0.186988] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap c0000020660462 ecap f0101a
[ 0.186996] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[ 0.187006] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008020660462 ecap f010da
[ 0.187012] DMAR: RMRR base: 0x000000bc1d8000 end: 0x000000bc1e4fff
[ 0.187017] DMAR: RMRR base: 0x000000bf000000 end: 0x000000cf1fffff
[ 0.187024] DMAR-IR: IOAPIC id 8 under DRHD base 0xfed91000 IOMMU 1
[ 0.187030] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[ 0.187034] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.188070] DMAR-IR: Enabled IRQ remapping in x2apic mode
[ 0.634998] DMAR: No ATSR found
[ 0.635001] DMAR: No SATC found
[ 0.635004] DMAR: IOMMU feature pgsel_inv inconsistent
[ 0.635008] DMAR: IOMMU feature sc_support inconsistent
[ 0.635011] DMAR: IOMMU feature pass_through inconsistent
[ 0.635014] DMAR: dmar0: Using Queued invalidation
[ 0.635026] DMAR: dmar1: Using Queued invalidation
[ 0.720415] DMAR: Intel(R) Virtualization Technology for Directed I/O
[ 14.512740] i915 0000:00:02.0: [drm] DMAR active, disabling use of stolen memory
可以看到 “DMAR: IOMMU enabled” / “DMAR: Intel(R) Virtualization Technology for Directed I/O” 的字样,说明 IOMMU 开启成功。
执行命令:
dmesg | grep 'remapping'
如果看到类似如下 “Enabled IRQ remapping in x2apic mode” 内容,也说明 IOMMU 开启成功:
[ 0.187034] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.188070] DMAR-IR: Enabled IRQ remapping in x2apic mode
或者执行
dmesg | grep iommu
如果能看到类似内容,也说明 IOMMU 开启成功:
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.2.16-3-pve root=/dev/mapper/pve-root ro quiet intel_pstate=disable intel_iommu=on iommu=pt pcie_acs_override=downstream pci=realloc=off
[ 0.066508] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.2.16-3-pve root=/dev/mapper/pve-root ro quiet intel_pstate=disable intel_iommu=on iommu=pt pcie_acs_override=downstream pci=realloc=off
[ 0.558404] iommu: Default domain type: Passthrough (set via kernel command line)
[ 0.719593] pci 0000:00:02.0: Adding to iommu group 0
[ 0.719693] pci 0000:00:00.0: Adding to iommu group 1
[ 0.719725] pci 0000:00:01.0: Adding to iommu group 2
[ 0.719755] pci 0000:00:01.1: Adding to iommu group 3
......
[ 0.720223] pci 0000:05:00.0: Adding to iommu group 17
[ 0.720252] pci 0000:06:00.0: Adding to iommu group 18
[ 0.720278] pci 0000:08:00.0: Adding to iommu group 19
还可以执行命令
find /sys/kernel/iommu_groups/ -type l
如果能看到很多直通组,说明开启成功:
/sys/kernel/iommu_groups/17/devices/0000:05:00.0
/sys/kernel/iommu_groups/7/devices/0000:00:1c.0
/sys/kernel/iommu_groups/15/devices/0000:02:00.0
/sys/kernel/iommu_groups/5/devices/0000:00:16.0
......
/sys/kernel/iommu_groups/19/devices/0000:08:00.0
/sys/kernel/iommu_groups/9/devices/0000:00:1c.3