pve-sata-ctrl
SATA 控制器直通
补充说明
SATA 控制器直通是将 PVE 宿主机上的整个 SATA 控制器(即 SATA AHCI 控制器 PCI 设备)直接分配给虚拟机,让虚拟机完全掌控该控制器下的所有 SATA 接口和连接的硬盘。适合需要原生 SATA 控制器功能、或需给虚拟机分配多块 SATA 硬盘的场景。
前置准备:确认硬件支持
SATA 控制器直通依赖 IOMMU 技术,需硬件和 BIOS 双重支持:
- CPU 要求:
- Intel CPU:4 代酷睿及以上(或 B75 及以上芯片组),支持 VT-d 技术
- AMD CPU:Ryzen 系列及以上(或对应芯片组),支持 AMD-Vi 技术
- BIOS 设置:
- 开机按 Del/F2 进入 BIOS
- 在「高级」→「CPU 配置」中启用 VT-d(Intel)/ AMD-Vi(AMD)
- 部分主板需同时启用「PCIe 热插拔」或「IOMMU 控制器」
核心步骤:开启 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"
(可选)若后续直通失败,可追加分组优化参数:
# Intel 示例(追加后)
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pcie_acs_override=downstream,multifunction"
# AMD 示例(追加后)
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on pcie_acs_override=downstream,multifunction"
2. 更新 GRUB 并加载内核模块
更新 GRUB 配置:
update-grub
编辑内核模块配置文件:
nano /etc/modules
添加以下必需模块:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
重启 PVE 系统使配置生效:
reboot
3. 验证 IOMMU 是否启用成功
重启后执行以下命令,确认 IOMMU 已激活:
dmesg | grep -i iommu
- 成功标识:输出含
IOMMU enabled(Intel)或AMD-Vi: IOMMU enabled(AMD) - 若未输出,检查 BIOS 中 VT-d / AMD-Vi 是否真的启用,或 GRUB 配置是否正确
操作步骤:直通 SATA 控制器
1. 查看 SATA 控制器的 PCI 地址
lspci | grep SATA
示例输出:
00:17.0 SATA controller: Intel Corporation Alder Lake-N SATA AHCI Controller
记下 PCI 地址(如 00:17.0),后续步骤需使用。
2. 确认控制器不属于 PCI 拆分绑定
某些 SATA 控制器与其他设备在同一 PCI 拆分组,直通前需确认拆分情况:
lspci -s 00:17.0 -vvv | grep -i "IOMMU group"
若拆分组中包含非必要的非直通设备,需在 GRUB 中添加 pcie_acs_override=downstream,multifunction 参数。
3. 通过 PVE 网页端添加 PCI 设备
- 登录 PVE 网页管理界面(默认地址:
https://PVE-IP:8006) - 进入目标虚拟机 →「硬件」→「添加」→「PCI 设备」
- 选择记录的 SATA 控制器(如
00:17.0 SATA controller) - 勾选「所有功能」「ROM-Bar」「PCI-Express」
- 部分旧控制器需取消「PCI-Express」
- 若虚拟机无法启动,尝试取消「ROM-Bar」
4. 验证直通
启动虚拟机,在虚拟机内执行:
lspci | grep SATA
lsblk
应能看到 SATA 控制器及连接的硬盘。
恢复 SATA 控制器给宿主机
如需将直通给虚拟机的 SATA 控制器归还给 PVE 宿主机:
1. 关机并移除 PCI 设备
# 关闭虚拟机(将 <VM_ID> 替换为实际虚拟机 ID)
qm stop <VM_ID>
# 移除 SATA 控制器 PCI 直通(将 <PCI_ADDRESS> 替换为如 00:17.0 的地址)
qm set <VM_ID> -delete -hostpci<X>
<X> 为 PCI 设备序号,可通过以下命令查看:
qm config <VM_ID> | grep hostpci
示例输出:
hostpci0: 00:17.0,pcie=1,rombar=1
则移除命令为:
qm set <VM_ID> -delete hostpci0
2. 重启宿主机
移除后重启 PVE 宿主机,让系统重新接管 SATA 控制器:
reboot
3. 验证恢复
重启后检查 SATA 控制器是否已被宿主机重新识别:
lspci | grep SATA
ls -l /dev/disk/by-id/ | grep ata
宿主机应能重新看到该控制器下的所有硬盘。
故障排查与避坑指南
常见错误
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 直通后虚拟机无法启动 | IOMMU 未启用 / PCI 分组冲突 | 验证 IOMMU 是否启用(dmesg | grep -i iommu),添加 pcie_acs_override 参数 |
| PVE 根目录变为只读 | 误直通了系统盘所在的 SATA 控制器 | 强制重启 PVE,删除虚拟机的 SATA 控制器直通配置,将系统盘连接到独立 SATA 控制器 |
| 直通后性能低下 | 未启用 PCI-Express 模式 | 编辑虚拟机的 SATA 控制器直通配置,勾选「PCI-Express」选项 |
| 恢复后宿主机无法识别硬盘 | 重启不彻底 / 内核未重新扫描 | 执行 echo "- - -" > /sys/class/scsi_host/host0/scan 触发重新扫描 |
关键避坑要点
- 若 PVE 系统盘连接在该 SATA 控制器上,直通后 PVE 会失去对系统盘的控制,导致系统无法启动
- 解决方案:将 PVE 系统安装在 NVMe 硬盘或独立的 SATA 控制器
- 直通后,该控制器下的所有 SATA 硬盘都会被虚拟机独占,PVE 无法访问
- 恢复操作前请确保虚拟机已完全关机(
qm stop),而非仅重启