如何使用三星 PM1733/1735 NVMe SSD 设置 SR-IOV

How to setup SR-IOV with Samsung PM1733/1735 NVMe SSD

三星 PM1733/1735 NVMe SSD 声明支持 SR-IOV。并且希望用PM1735 SSD搭建一个NVMe SR-IOV环境。我的 SSD 的开发说明是 /dev/nvme1.

但是,我尝试使用如下命令 echo 4 > /sys/class/nvme/nvme1/device/sriov_numvfs.

dmesg 信息包含

[ 1239.732278] nvme nvme2: pci function 0000:86:00.1
[ 1239.732359] nvme 0000:86:00.1: enabling device (0000 -> 0002)
[ 1239.732365] pci 0000:86:00.2: [144d:a824] type 00 class 0x010802
[ 1239.733053] iommu: Adding device 0000:86:00.2 to group 164
[ 1239.733402] nvme nvme3: pci function 0000:86:00.2
[ 1239.733473] pci 0000:86:00.3: [144d:a824] type 00 class 0x010802
[ 1239.733477] nvme 0000:86:00.2: enabling device (0000 -> 0002)
[ 1239.734117] iommu: Adding device 0000:86:00.3 to group 165
[ 1239.734485] nvme nvme4: pci function 0000:86:00.3
[ 1239.734557] pci 0000:86:00.4: [144d:a824] type 00 class 0x010802
[ 1239.734782] nvme 0000:86:00.3: enabling device (0000 -> 0002)
[ 1239.735066] iommu: Adding device 0000:86:00.4 to group 166
[ 1239.735352] nvme nvme5: pci function 0000:86:00.4
[ 1239.735631] nvme 0000:86:00.4: enabling device (0000 -> 0002)
[ 1270.289730] nvme nvme2: Device not ready; aborting initialisation
[ 1270.289794] nvme nvme2: Removing after probe failure status: -19
[ 1270.293724] nvme nvme4: Device not ready; aborting initialisation
[ 1270.293727] nvme nvme5: Device not ready; aborting initialisation
[ 1270.293732] nvme nvme5: Removing after probe failure status: -19
[ 1270.293783] nvme nvme4: Removing after probe failure status: -19
[ 1270.297647] nvme nvme3: Device not ready; aborting initialisation
[ 1270.297703] nvme nvme3: Removing after probe failure status: -19

lspci | grep Non可以找到

86:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a824
86:00.1 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a824
86:00.2 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a824
86:00.3 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a824
86:00.4 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a824

是否正确创建了 VF?

另一个问题是如何将命名空间与 VF 绑定。我使用 nvme-cli/dev/nvme 创建名称空间,但如何将这些名称空间与 VF 绑定?

您可能需要查看 nvme 规范 1.4(第 320 页,第 8.5 节“虚拟化增强”)。我猜你还需要配置VQ和VI)。

使用 nvme cli 命令 nvme virt-mgmt 分配 VQ 和 VI,并启用该控制器并将该 vf 导出到 vm。

示例命令 nvme list-secondary /dev/nvme1n1 --> 所有辅助控制器列表的输出

nvme virt-mgmt /dev/nvme1n1 -c 1 -r 0 -n 2 --> 为二级控制器1分配2个VQ

nvme virt-mgmt /dev/nvme1n1 -c 1 -r 1 -n 2 --> 为二级控制器1分配2个VI

nvme virt-mgmt /dev/nvme1n1 -c -a 9 --> 启用辅助控制器 1

nvme list-secondary /dev/nvme1n1 --> 检查第一个条目是否已更新,现在显示为在线。

现在将此 vf 导出到 vm。

首先使用 nvme create 命令创建 nvme 命名空间,然后使用 nvme attach-ns 附加到控制器,创建单个或多个命名空间,然后创建 VF 并尝试导出。

将 VF 导出到 VM。

安装virt-manager并在virt-manager中安装Guest OS(centos或unbuntu等..),我用的是Ubuntu。你也可以参考 - https://help.ubuntu.com/community/KVM/VirtManager

现在,您有 VF 和 VM。

要导出,select任何访客OS select 在新 window 和 select PCI 中打开并 select 添加硬件选项并添加 VF 0000:86:00.1/2/3/4 设备之一 运行 嘉宾 OS。 在 lsblk 中你会发现一个字符设备 /dev/nvme0 和块设备 /dev/nvme0n1 现在你可以在块设备 运行 上找到 fio

维塔利-卡赫玛

您仍会在主机中看到 VF 的“初始化中止”。

设置好VI和VQ以及在线变量后,就可以导出VF给Guest了OS/hypervisor。在 Guest OS 中,您可以在 OS 启动完成后立即检查是否已生成 nvme 块设备。