pve-sata-disk
单硬盘直通
补充说明
单硬盘直通是将 PVE 宿主机上的某一块物理 SATA 硬盘直接分配给虚拟机,让虚拟机获得接近原生的存储性能,同时不影响 PVE 系统盘和其他硬盘。适合需要虚拟机内直接操控物理硬盘的场景(如虚拟机内安装独立系统、数据直存物理盘、NAS 硬盘直通等)。
前置准备:确认硬件支持与硬盘信息
1. 硬件要求
单硬盘直通无需完整的 IOMMU 分组支持(与控制器直通不同),但 IOMMU 仍需启用:
- CPU 要求:
- Intel CPU:4 代酷睿及以上(或 B75 及以上芯片组),支持 VT-d 技术
- AMD CPU:Ryzen 系列及以上(或对应芯片组),支持 AMD-Vi 技术
- BIOS 设置:
- 开机按 Del/F2 进入 BIOS
- 在「高级」→「CPU 配置」中启用 VT-d(Intel)/ AMD-Vi(AMD)
2. 查看并记录硬盘 ID(关键步骤)
通过硬盘唯一 ID 配置直通(避免盘符漂移导致直通失效):
ls -l /dev/disk/by-id/ | grep ata
示例输出:
lrwxrwxrwx 1 root root 9 5月 4 10:00 ata-WDC_WD2500BEVT-22ZCT0_WD-WXHZ08044989 -> ../../sdb
记录 ata- 开头的完整 ID(如 ata-WDC_WD2500BEVT-22ZCT0_WD-WXHZ08044989),后续步骤需使用。
核心步骤:开启 PVE 的 IOMMU 硬件直通
IOMMU 是硬件直通的基础,需配置 GRUB 并加载内核模块:
1. 编辑 GRUB 配置文件
nano /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT 行,按 CPU 类型修改:
Intel CPU(添加 intel_iommu=on):
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
AMD CPU(添加 amd_iommu=on):
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"
2. 更新 GRUB 并加载内核模块
更新 GRUB 配置:
update-grub
编辑内核模块配置文件:
nano /etc/modules
添加以下必需模块:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
重启 PVE 系统使配置生效:
reboot
3. 验证 IOMMU 是否启用成功
重启后执行:
dmesg | grep -i iommu
- 成功标识:输出含
IOMMU enabled(Intel)或AMD-Vi: IOMMU enabled(AMD) - 若未输出,检查 BIOS 中 VT-d / AMD-Vi 是否启用,或 GRUB 配置是否正确
操作步骤:直通单个硬盘
1. 直通硬盘到虚拟机
执行以下命令(替换占位符):
qm set <VM_ID> --sata<X> /dev/disk/by-id/<硬盘ID>
<VM_ID>:目标虚拟机的 ID(如 100)<X>:SATA 控制器编号(从 0 开始,如 sata0、sata1)<硬盘ID>:上一步记录的ata-开头的硬盘唯一 ID
示例:给 ID 为 100 的虚拟机添加硬盘到 sata0 接口:
qm set 100 --sata0 /dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXHZ08044989
2. 验证直通
启动虚拟机,在虚拟机内执行:
lsblk
fdisk -l
应能看到直通的物理硬盘。
恢复单硬盘直通给宿主机
如需将直通给虚拟机的硬盘归还给 PVE 宿主机:
1. 查看当前硬盘挂载位置
qm config <VM_ID> | grep sata
示例输出:
sata0: /dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXHZ08044989,size=250G
2. 关机和移除硬盘
# 关闭虚拟机
qm stop <VM_ID>
# 移除硬盘(将 <X> 替换为实际接口编号,如 0)
qm set <VM_ID> --sata<X> none
示例:
qm set 100 --sata0 none
3. 在宿主机上重新挂载(可选)
移除后硬盘在宿主机上处于未挂载状态。如需挂载使用:
# 查看硬盘设备名
ls -l /dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXHZ08044989
# 挂载到宿主机的目录(将 sdx 替换为实际盘符)
mount /dev/sdX /mnt/你的目录
如果宿主机上之前有 ZFS 池或其他存储,硬盘会重新被 PVE 存储系统识别:
# 重新扫描 SCSI 总线
echo "- - -" > /sys/class/scsi_host/host0/scan
# ZFS 导入池(如果硬盘之前属于 ZFS 池)
zpool import
故障排查与避坑指南
常见错误
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
执行 qm set 后虚拟机内看不到硬盘 |
硬盘 ID 错误 / 盘符漂移 | 重新执行 ls -l /dev/disk/by-id/ 确认硬盘 ID,使用 ID 而非盘符 |
| 直通后虚拟机无法启动 | IOMMU 未启用 | 验证 IOMMU(dmesg | grep -i iommu),确认 GRUB 和 BIOS 配置正确 |
| 移除硬盘后宿主机不识别 | 系统未重新扫描 | 执行 echo "- - -" > /sys/class/scsi_host/host0/scan 或重启 |
关键避坑要点
- 始终使用
/dev/disk/by-id/下的硬盘 ID 配置直通,而非/dev/sdX盘符 - 直通前建议备份虚拟机重要数据
- 恢复操作前确保虚拟机已完全关机(
qm stop),而非仅重启 - 移除硬盘后若盘符发生变化,通过
ls -l /dev/disk/by-id/确认对应关系