直通设备跨宿主重启
能得到什么
设备归虚拟机所有,由虚拟机自己的驱动操作。NAS 看到的是真实的硬盘:SMART、写缓存、真实的错误,而不是一块虚拟盘。
- 设备按厂商、型号和序列号登记,不按插槽。换个插槽照常用;换了一块盘,不会被误交出去,要用它的虚拟机不启动,并写明原因。
- 登记的设备在开机时就被留住,宿主自己的驱动没机会先挂上。宿主永远不会导入 NAS 虚拟机的 ZFS 池。
- 一个设备只归一台虚拟机,第二台来要会被拒绝。
- 小于一页的 BAR 也能直通,比如 Intel C62x 的 SATA 控制器;原版 bhyve 会拒绝。
为什么宿主重启时它不停
IOMMU(Intel VT-d)由不会重启的 keel hypervisor 管理。宿主重启期间,设备的 DMA 映射一直有效,手上的 I/O 照常做完;只是中断先被屏蔽,暂存在设备里,等虚拟机恢复时再送进去。新的宿主接管设备时不复位它。
对照:ESXi 的 DirectPath 和 Hyper-V 的 DDA 都不能挂起带直通设备的虚拟机。
实测
- 拿着整块 NVMe 的 NAS 虚拟机,不停地 fsync 写盘:宿主重启 4 次,每次暂停 21–23 秒,无错误。
- 重负载,4 个写加 1 个读,写入约 600–700 MB/s:宿主重启 10 次,无超时、无复位,ZFS scrub 0 错误。
- 一台虚拟机同时带 NVMe 和板载 SATA 控制器:宿主重启 5 次,两个设备都正常。
- 板载 AHCI 接上硬盘直通:虚拟机里写入的数据读回来校验一致,scrub 0 错误。
- 设备在使用中被模拟拔掉:宿主不受影响,虚拟机被标记为丢了设备。
累计 14 次宿主重启没有出错之后,整块设备直通的虚拟机在宿主重启时默认挂起,而不是关机。
限制
- 中断重映射还没开。理论上虚拟机里的驱动可以发出不该有的中断。家里和小办公室的虚拟机都是自己人的,暂时可以接受。
- 需要 RMRR 的设备还不能直通。
- 这类虚拟机的快照只包括 keelOS 管的磁盘,直通控制器后面的盘不在里面;带内存的快照也做不了:设备自己的内部状态存不下来。
- HBA 卡还没测。