系统环境
Proxmox VE 7.4-3

TL;DR

将HBA卡通过Passthrough分配给VM后,宿主机会丧失对该设备的控制权,
在取消Passthrough后,需要在宿主机重新加载驱动并扫描设备。

这个问题发生在什么场景?

近期看机械盘价格比较低购入了一些大容量盘准备提升一下存储密度。
在收到货以后想着把HBA卡直通给VM进行测试会方便些,于是按常规操作在添加了PCI Passthrough

添加PCI Passthrough

在VM内将这些硬盘测试完后,我将这个直通设备从VM配置中移除,
这时候问题来了: 宿主机找不到这些硬盘了。。。

怎么解决这个问题?

1. 确定设备ID以及当前驱动状态

lspci -k
...
81:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS2308 PCI-Express Fusion-MPT SAS-2 (rev 05)
    Subsystem: Broadcom / LSI 9207-8i SAS2.1 HBA
    Kernel driver in use: vfio-pci
    Kernel modules: mpt3sas
...

这里的 81:00.0 是设备的ID,后面会用到。
同时可以发现当前驱动是 vfio-pci,这意味着设备仍然被 VFIO 保留,因此宿主机无法访问这个HBA卡下的硬盘。
在确定问题后,我们卸载这个驱动并重新绑定正确驱动。

2. 卸载驱动及重新绑定

获取IOMMU组

使用上一步获取的设备ID,找到对应的IOMMU组。

find /sys/kernel/iommu_groups/ -type l | grep "81:00.0"
/sys/kernel/iommu_groups/108/devices/0000:81:00.0

这里的 108 就是IOMMU组的ID,不过不用单独记录,
直接把输出的完整路径复制下来就行。

卸载 vfio 驱动

这里直接利用上一步获取的路径进行操作。

echo "0000:81:00.0" | sudo tee /sys/kernel/iommu_groups/108/devices/0000:81:00.0/driver/unbind

正常输出设备ID。

0000:81:00.0

重新绑定驱动

路径中的 mpt3sas 是驱动名, 注意根据你的实际情况自行调整。

echo "0000:81:00.0" | sudo tee /sys/bus/pci/drivers/mpt3sas/bind

正常输出设备ID

0000:81:00.0

再次查看设备驱动状态

lspci -k

可以发现之前的 vfio-pci 已经被替换为 mpt3sas 了。

81:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS2308 PCI-Express Fusion-MPT SAS-2 (rev 05)
	Subsystem: Broadcom / LSI 9207-8i SAS2.1 HBA
	Kernel driver in use: mpt3sas
	Kernel modules: mpt3sas

重新扫描磁盘

这里偷个懒,直接去PVE的WebUI中进行操作~
重载完成后就可以看到HBA卡下连接的磁盘了。

reload-disk