我需要将7块物理硬盘(包括4块1TB和2块2TB)直通给运行在Proxmox VE上的虚拟机VM101,该虚拟机运行的是飞牛系统。在尝试配置过程中,遇到了核心问题:虽然已配置了PCIe设备直通,但系统提示无法重置某些PCI设备,且部分硬盘在宿主机上仍可见,表明直通未完全生效。
问题定位与初步排查
首先,我使用lsblk命令检查当前硬盘状态:
bash
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,MODEL
结果显示所有目标硬盘(sda-sdg)都处于空闲状态,无分区,但它们仍然被宿主机识别。这说明直通配置尚未完全生效。
接着,我检查了虚拟机VM101的配置:
bash
qm config 101
输出显示配置中仅有一个64GB的虚拟磁盘,没有包含任何物理硬盘或PCI设备直通项。这意味着我的直通配置尚未应用。
硬盘连接拓扑分析
为了准确配置直通,我需要确定每块硬盘连接到哪个SATA控制器。通过以下命令获取详细信息:
bash
for disk in sda sdb sdc sdd sde sdf sdg; do
udevadm info -q path -n /dev/$disk | xargs -I {} udevadm info -q property -p {} | grep -E "(ID_PATH|ID_BUS)"
done
输出结果清晰地展示了硬盘与控制器的对应关系:
- 控制器00:11.4 :连接
sda,sdb,sdc,sdd - 控制器00:1f.2 :连接
sde,sdf,sdg
这两个控制器分别属于不同的IOMMU组(24和31),因此可以独立直通。
IOMMU与驱动状态验证
我确认了系统已启用IOMMU,这是硬件直通的前提:
bash
dmesg | grep -i iommu
输出显示DMAR: IOMMU enabled,且内核命令行包含intel_iommu=on iommu=pt,证明IOMMU已正确启用。
接下来,我检查两个控制器的驱动绑定状态:
bash
lspci -k | grep -A2 "SATA controller"
输出显示两个控制器均被ahci驱动占用,这是直通前必须解除的状态。
直通配置实施
我决定采用控制器级直通方案,将两个控制器都直通给VM101。首先,我修改了虚拟机配置文件:
bash
vim /etc/pve/nodes/VUModule/qemu-server/101.conf
在hostpci0: 0000:03:00之后添加:
hostpci1: 0000:00:11.4
hostpci2: 0000:00:1f.2
保存后,我创建了一个脚本用于解除驱动绑定:
bash
#!/bin/bash
echo "解除SATA控制器驱动绑定..."
if [ -d /sys/bus/pci/devices/0000:00:11.4/driver ]; then
echo 0000:00:11.4 > /sys/bus/pci/devices/0000:00:11.4/driver/unbind
fi
if [ -d /sys/bus/pci/devices/0000:00:1f.2/driver ]; then
echo 0000:00:1f.2 > /sys/bus/pci/devices/0000:00:1f.2/driver/unbind
fi
lspci -k | grep -A1 -B1 "SATA controller"
执行此脚本后,我再次检查控制器状态,发现ahci驱动已不再绑定。
启动与验证
在确保VM101已停止后,我启动了虚拟机:
bash
qm start 101
尽管出现Cannot reset device警告,但虚拟机成功进入运行状态。
最后,我运行了验证脚本:
bash
/root/check_passthrough.sh
输出显示:
- 宿主机
lsblk不再列出目标硬盘(sda-sdg) VM101配置中包含两个新的hostpci条目- SATA控制器已脱离
ahci驱动
结论
通过WisdomSSH提供的逐层排查能力,我成功解决了硬盘直通中的关键问题。整个过程的关键在于:
- 准确识别硬盘与控制器的物理连接关系
- 验证IOMMU功能正常并确认驱动已解除
- 采用控制器级直通而非单个硬盘直通,提高效率
- 使用脚本化方式保证操作一致性
最终,所有7块物理硬盘均已成功直通至飞牛系统,宿主机无法再访问这些存储资源,实现了预期的隔离与性能优化。