随机
Enter 搜索 ↑↓ 切换 Esc 清空

pve-sata-ctrl

命令

SATA 控制器直通

pve-sata-ctrl

SATA 控制器直通

补充说明

SATA 控制器直通是将 PVE 宿主机上的整个 SATA 控制器(即 SATA AHCI 控制器 PCI 设备)直接分配给虚拟机,让虚拟机完全掌控该控制器下的所有 SATA 接口和连接的硬盘。适合需要原生 SATA 控制器功能、或需给虚拟机分配多块 SATA 硬盘的场景。

前置准备:确认硬件支持

SATA 控制器直通依赖 IOMMU 技术,需硬件和 BIOS 双重支持:

核心步骤:开启 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

操作步骤:直通 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 设备

  1. 登录 PVE 网页管理界面(默认地址:https://PVE-IP:8006
  2. 进入目标虚拟机 →「硬件」→「添加」→「PCI 设备」
  3. 选择记录的 SATA 控制器(如 00:17.0 SATA controller
  4. 勾选「所有功能」「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 触发重新扫描

关键避坑要点