欢迎光临散文网 会员登陆 & 注册

[QEMU]NVMe 仿真

2022-07-20 17:55 作者:-小白之家-  | 我要投稿

QEMU 通过 和 设备提供 NVMe 仿真。nvmenvme-nsnvme-subsys

有关以下方面的具体信息,请参阅以下部分

  • 添加 NVMe 设备、其他命名空间和 NVM 子系统。

  • 配置可选功能,如控制器内存缓冲区、简单复制、分区命名空间、元数据和端到端数据保护,

添加 NVMe 设备

控制器仿真

QEMU 仿真 NVMe 控制器实现了 NVM Express 规范的 1.4 版。所有强制性功能都有一些例外和限制:

  • 当设备重新通电时,SMART/运行状况日志页面中的记帐号将重置。

  • 不支持中断合并,默认情况下处于禁用状态。

在 QEMU PCI 总线上连接 NVMe 控制器的最简单方法是添加以下参数:

-drive file=nvm.img,if=none,id=nvm-device nvme,serial=deadbeef,drive=nvm

该设备有许多可选的常规参数。这里提到了一些,但请参阅列出所有可能的参数。nvme-device nvme,help

  • max_ioqpairs=UINT32(默认值:64)

  • 设置允许的最大 I/O 队列对数。这将替换已弃用的参数。num_queues

  • msix_qsize=UINT16(默认值:65)

  • 设备应支持的 MSI-X 矢量的数量。

  • mdts=UINT8(默认值:7)

  • 设置设备的最大数据传输大小。

  • use-intel-id(默认值:off)

  • 从 QEMU 5.2 开始,该设备使用 QEMU 分配的“红帽”PCI 设备和供应商 ID。将其设置为 可恢复到以前使用的未分配的英特尔 ID。on

其他命名空间

在上面概述的最简单的调用中,设备仅支持具有命名空间标识符的单个命名空间。若要支持多个命名空间和其他功能,必须使用该设备。1nvme-ns

-device nvme,id=nvme-ctrl-0,serial=deadbeef-drive file=nvm-1.img,if=none,id=nvm-1-device nvme-ns,drive=nvm-1-drive file=nvm-2.img,if=none,id=nvm-2-device nvme-ns,drive=nvm-2

设备定义的命名空间将附加到设备创建的最新定义的命名空间。从 开始自动分配命名空间标识符。nvme-nsnvme-busnvme1

有许多参数可用:

  • nsid(默认值:0)

  • 显式设置命名空间标识符。

  • uuid(默认值:自动生成)

  • 设置命名空间的 UUID。这将在命名空间标识描述符列表中报告为“命名空间 UUID”描述符。

  • eui64

  • 设置命名空间的 EUI-64。这将在命名空间标识描述符列表中报告为“IEEE 扩展唯一标识符”描述符。由于机器类型为 6.1,因此如果未提供参数,则使用非零默认值。对于较早的计算机类型,该字段默认为 0。

  • bus

  • 如果定义了更多设备,则可以使用此参数将命名空间附加到特定设备(由控制器设备上的参数标识)。nvmenvmeid

NVM 子系统

如果控制器设备 () 链接到 NVM 子系统设备 (),则其他功能将变为可用。nvmenvme-subsys

NVM 子系统仿真允许共享命名空间和多路径 I/O 等功能。

-device nvme-subsys,id=nvme-subsys-0,nqn=subsys0-device nvme,serial=deadbeef,subsys=nvme-subsys-0-device nvme,serial=deadbeef,subsys=nvme-subsys-0

这将创建一个具有两个控制器的 NVM 子系统。将控制器链接到设备允许其他参数:nvme-subsysnvme-ns

  • shared(默认值:自 6.2 起)on

  • 指定命名空间将附加到子系统中的所有控制器。如果设置为 ,命名空间将保持为私有命名空间,并且一次只能附加到单个控制器。共享命名空间始终自动附加到所有控制器(当控制器热插拔时也是如此)。off

  • detached(默认值:off)

  • 如果设置为 ,命名空间将在子系统中可用,但最初不会附加到任何控制器。将此设置为 的共享命名空间永远不会自动附加到控制器。onon

因此,添加

-drive file=nvm-1.img,if=none,id=nvm-1-device nvme-ns,drive=nvm-1,nsid=1-drive file=nvm-2.img,if=none,id=nvm-2-device nvme-ns,drive=nvm-2,nsid=3,shared=off,detached=on

将导致 NSID 1 将是最初附加到两个控制器的共享命名空间。NSID 3 将是一个专用命名空间,因为一次只能附加到单个控制器。此外,它最初不会连接到任何控制器(由于 ),也不会连接到热插拔的控制器。shared=offdetached=on

可选功能

控制器内存缓冲区

nvme与控制器内存缓冲区支持相关的设备参数:

  • cmb_size_mb=UINT32(默认值:0)

  • 这将在 BAR 2 中以偏移量零处添加给定大小的控制器内存缓冲区。

  • legacy-cmb(默认值:off)

  • 默认情况下,设备使用“v1.4 方案”来支持控制器内存缓冲区(即,CMB 最初被禁用,必须由主机显式启用)。将此设置为以充当 v1.3 设备 wrt。CMB。on

简单复制

该设备包括对 TP 4065(“简单复制命令”)的支持。可以使用许多附加设备参数来控制 Copy 命令限制:nvme-ns

  • mssrl=UINT16(默认值:128)

  • 设置最大单源范围长度 ()。这是每个源范围中可以指定的最大逻辑块数。MSSRL

  • mcl=UINT32(默认值:128)

  • 设置最大复制长度 ()。这是可以在 Copy 命令中指定的最大逻辑块数(所有源范围的总数)。MCL

  • msrc=UINT8(默认值:127)

  • 设置最大源范围计数 ()。这是“复制”命令中可以使用的最大源范围数。这是一个基于 0 的值。MSRC

分区命名空间

命名空间可以按照 TP 4053 的定义进行“分区”(“分区命名空间”)。在设备上设置以将其配置为分区命名空间。zoned=onnvme-ns

可以使用其他参数配置命名空间

  • zoned.zone_size=SIZE(默认值:128MiB)

  • 定义区域大小 ()。ZSZE

  • zoned.zone_capacity=SIZE(默认值:0)

  • 定义区域容量 ()。如果保留为默认值 (),则区域容量将等于区域大小。ZCAP0

  • zoned.descr_ext_size=UINT32(默认值:0)

  • 设置区域描述符扩展大小 ()。必须是 64 字节的倍数。ZDES

  • zoned.cross_read=BOOL(默认值:off)

  • 设置为 允许读取跨越区域边界。on

  • zoned.max_active=UINT32(默认值:0)

  • 设置活动资源的最大数量 ()。默认值 () 允许所有区域都处于活动状态。MAR0

  • zoned.max_open=UINT32(默认值:0)

  • 设置打开资源的最大数量 ()。默认值 () 允许打开所有区域。如果指定了,则此值必须小于或等于该值。MOR0zoned.max_active

  • zoned.zasl=UINT8(默认值:0)

  • 设置“区域追加”命令的最大数据传输大小。与 类似,该值被指定为 2 的幂 (2^n),并以最小内存页大小 (CAP.MPSMIN)。默认值 () 具有此属性继承该值。mdts0mdts

元数据

虚拟命名空间设备支持 LBA 元数据,其形式为单独的元数据(基于)和扩展的 LBA。MPTR

  • ms=UINT16(默认值:0)

  • 定义每个 LBA 的元数据字节数。

  • mset=UINT8(默认值:0)

  • 设置为 以启用扩展的 LBA。1

端到端数据保护

虚拟命名空间设备支持基于 DIF 和 DIX 的保护信息(取决于 )。mset

  • pi=UINT8(默认值:0)

  • 启用指定类型(类型 、或 )的保护信息。123

  • pil=UINT8(默认值:0)

  • 控制元数据中保护信息的位置。设置为 以将保护信息作为元数据的前八个字节进行传输。否则,保护信息将作为最后八个字节进行传输。1

虚拟化增强功能和 SR-IOV(实验性支持)

该设备支持单根 I/O 虚拟化和共享以及虚拟化增强功能。控制器必须链接到 NVM 子系统设备 () 才能与 SR-IOV 一起使用。nvmenvme-subsys

存在许多参数(请注意,它们可能会发生变化):

  • sriov_max_vfs(默认值:0)

  • 指示控制器支持的最大 PCIe 虚拟功能数。指定非零值可使 NVMe 设备同时报告 SR-IOV 和 ARI(备用路由 ID 解释)功能。虚拟功能控制器不会报告 SR-IOV。

  • sriov_vq_flexible

  • 指示可分配给所有辅助控制器的灵活队列资源的总数。隐式将主控制器的专用资源数设置为 。(max_ioqpairs - sriov_vq_flexible)

  • sriov_vi_flexible

  • 指示可分配给所有辅助控制器的灵活中断资源的总数。隐式将主控制器的专用资源数设置为 。(msix_qsize - sriov_vi_flexible)

  • sriov_max_vi_per_vf(默认值:0)

  • 指示可分配给辅助控制器的虚拟中断资源的最大数量。默认值解析为0(sriov_vi_flexible / sriov_max_vfs)

  • sriov_max_vq_per_vf(默认值:0)

  • 指示可分配给辅助控制器的最大虚拟队列资源数。默认值解析为0(sriov_vq_flexible / sriov_max_vfs)

最简单的调用使能够设置一个 VF 控制器并分配管理队列、IO 队列和 MSI-X 中断。

-device nvme-subsys,id=subsys0-device nvme,serial=deadbeef,subsys=subsys0,sriov_max_vfs=1, sriov_vq_flexible=2,sriov_vi_flexible=1

配置功能正常的 NVMe 辅助控制器所需的最少步骤包括:

  • 从主控制器中取消绑定灵活资源

nvme virt-mgmt /dev/nvme0 -c 0 -r 1 -a 1 -n 0 nvme virt-mgmt /dev/nvme0 -c 0 -r 0 -a 1 -n 0* perform a Function Level Reset on the primary controller to actually  release the resources echo 1 > /sys/bus/pci/devices/0000:01:00.0/reset* enable VF echo 1 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs* assign the flexible resources to the VF and set it ONLINE nvme virt-mgmt /dev/nvme0 -c 1 -r 1 -a 8 -n 1 nvme virt-mgmt /dev/nvme0 -c 1 -r 0 -a 8 -n 2 nvme virt-mgmt /dev/nvme0 -c 1 -r 0 -a 9 -n 0* bind the NVMe driver to the VFecho 0000:01:00.1 > /sys/bus/pci/drivers/nvme/bind


[QEMU]NVMe 仿真的评论 (共 条)

分享到微博请遵守国家法律