我在PVE中跑了个TrueNAS系统,不过之前一直是通过软SCSI控制器把硬盘一块块映射到虚拟机里面去的,虽然这样能用,但这样一个问题是有性能开销,truenas也不能直接对硬盘进行最直接的控制,另一个问题是换盘的时候都要重新执行映射指令,很麻烦。
于是我想着还是得实现真正的直通才行,要实现对虚拟机来说能让硬盘即插即用最干脆的方法还是直接把整个SATA控制器映射进去,我刚好有个插在主板m.2插槽上的PCIE转SATA扩展卡,扩出来5个SATA口。
注意主板上的SATA控制器是不可以映射到虚拟机里的,一个原因是其iommu分组一定会绑定主板芯片组里其它兼职的部分无法分开,另一个原因是如果你的PVE系统盘在主板上的SATA接口上或者在通过芯片组的m.2接口上(通常是远离CPU的那个m.2接口),会导致pve启动不了。
这篇文章的主要部分就是以上我踩的坑,分享出来给同样遇到问题的人参考一下,下面是跟着AI的指导操作的步骤。
编辑PVE的配置文件,设置在PVE主机中屏蔽需要直通硬件的驱动:
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT中添加intel_iommu=on(Intel)或amd_iommu=on(AMD)以及iommu=pt。 - 如果你发现扩展卡和别的设备被捆绑在一个组里,可以添加
pcie_acs_override=downstream,multifunction。 - 我这个AMD平台的示例:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction
- 编辑
/etc/modules,确保里面包含:vfio vfio_iommu_type1 vfio_pci vfio_virqfd
- 执行
proxmox-boot-tool refresh,然后重启PVE。 - 重启后执行以下命令检查 IOMMU 分组
for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*}; printf '%s\t%s\n' "$n" "$(lspci -nns ${d##*/})"; done | sort -n如果此时你要直通的设备还是和其他设备共用一个组号,那么要考虑更换直通CPU的插槽,换插槽也没用就是没有办法了。
- 在刚才命令执行后你还会获得一个PCI地址,就在你设备所在行开头的那一串,类似:26:00.0,然后就要执行
lspci -n -s 26:00.0查看你的设备ID(这里面的PCI地址替换成你自己设备的那个),我的设备id返回的是这个样式的:197b:0585。 - 接下来要用vfio驱动接管你的设备,防止设备被ahci驱动接管。
- 在
/etc/modprobe.d/vfio.conf中添加以下内容:options vfio-pci ids=你的设备ID - 在
/etc/modprobe.d/pve-blacklist.conf中添加:softdep ahci pre: vfio-pci - 执行
update-initramfs -u -k all。 - 重启 PVE,重启后执行
lspci -k -s 你的设备PCI地址,检查是否有Kernel driver in use: vfio-pci,有的话就是驱动成功被接管了。
- 在
- 然后就可以在虚拟机设置里添加PCIE设备了,编辑PCIE设备时选择“原始设备”,在里面选择你的SATA控制器,“所有功能”的选项不用勾,然后勾上”Rom-Bar”和”PCI-Express”保存即可。
完成以上步骤直通SATA控制器就设置好了,然后可以打开虚拟机。
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。