使用场景

有虚拟机需要使用原始硬盘(例如 TrueNAS 获取 S.M.A.R.T. 信息与硬盘休眠)时,我们不仅可以直通硬盘给虚拟机,还可以尝试直通 SATA 控制器给虚拟机。

警告

请确保您的 PVE 系统没有被安装在机械硬盘或是 SATA 控制器下的硬盘里,否则操作后可能导致 PVE 无法开机!

若您确保自己的直通操作不会干扰到宿主机系统,那么请接着往下看。

开启直通

开启 VT-d

Intel 平台需要 b75 以上芯片组(酷睿 4 代以上)

与 VT-X 不同,VT-X 是虚拟化功能,而 VT-d 是 I/O 虚拟化功能。

AMD 平台是 iommu 或者叫 SRIVO(部分 OEM 主板的称法)

开启 iommu

我们编辑 /etc/default/grub 文件。可以使用 vi 或 nano,顺手就好。

找到如下配置项:

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

Intel 平台请修改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

AMD 平台请修改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

如果你需要显卡直通,建议在cmdline再加一句video=vesafb:off video=efifb:off video=simplefb:off,加了之后,pve重启进内核后停留在一个画面,这是正常情况

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt video=vesafb:off video=efifb:off video=simplefb:off"

更新 Grub

使用命令更新:

update-grub

加载相应内核模块

依次执行以下命令:

echo vfio >> /etc/modules
echo vfio_iommu_type1 >> /etc/modules
echo vfio_pci >> /etc/modules
echo vfio_virqfd >> /etc/modules

更新内核参数:

update-initramfs -k all -u

重启宿主机

reboot

验证

重启后于终端输入:

dmesg | grep iommu

若输出类似内容则成代表成功:

[ 1.341100] pci 0000:00:00.0: Adding to iommu group 0
[ 1.341116] pci 0000:00:01.0: Adding to iommu group 1
[ 1.341126] pci 0000:00:02.0: Adding to iommu group 2
[ 1.341137] pci 0000:00:14.0: Adding to iommu group 3
[ 1.341146] pci 0000:00:17.0: Adding to iommu group 4

再输入:

find /sys/kernel/iommu_groups/ -type l

若出现很多直通组则代表成功。无内容反之。

最后,选择需要设置的虚拟机,点击 硬件 > 添加 > PCI设备 > 选择 SATA Controller(SATA 控制器),最后点击“添加”把 SATA Controller(SATA 控制器)添加给相应的系统后,完成重启,PVE硬件直通的设置就生效了。

如果您在添加硬件没有找到 SATA Controller 字样,请接着往下看

我们执行:

lspci

会看到一堆输出。里面应当包含了 SATA Controller。例如我的是 11:00.0。输出示例如下:

...
11:00.0 SATA controller: Advanced Micro Devices, Inc. [AMD] 600 Series Chipset SATA Controller (rev 01)
...

您可以根绝输出内容来判断自己应当如何设置直通。

巨人的肩膀

感谢互联网上无私分享知识的人。我们也是站在前人的肩膀上,才看得见天际线,才够得到星辰。

Proxmox VE 设置硬盘直通_pve硬盘直通-CSDN博客

pve 在amd平台开启sata硬件直通, 且使fnos硬盘自动休眠 - 简书

我在此由衷感谢以上文章的贡献。