[QEMU]NVMe 仿真

QEMU 通过 和 设备提供 NVMe 仿真。nvme
nvme-ns
nvme-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
其他命名空间
在上面概述的最简单的调用中,设备仅支持具有命名空间标识符的单个命名空间。若要支持多个命名空间和其他功能,必须使用该设备。1
nvme-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-ns
nvme-bus
nvme
1
有许多参数可用:
nsid
(默认值:0
)显式设置命名空间标识符。
uuid
(默认值:自动生成)设置命名空间的 UUID。这将在命名空间标识描述符列表中报告为“命名空间 UUID”描述符。
eui64
设置命名空间的 EUI-64。这将在命名空间标识描述符列表中报告为“IEEE 扩展唯一标识符”描述符。由于机器类型为 6.1,因此如果未提供参数,则使用非零默认值。对于较早的计算机类型,该字段默认为 0。
bus
如果定义了更多设备,则可以使用此参数将命名空间附加到特定设备(由控制器设备上的参数标识)。
nvme
nvme
id
NVM 子系统
如果控制器设备 () 链接到 NVM 子系统设备 (),则其他功能将变为可用。nvme
nvme-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-subsys
nvme-ns
shared
(默认值:自 6.2 起)on
指定命名空间将附加到子系统中的所有控制器。如果设置为 ,命名空间将保持为私有命名空间,并且一次只能附加到单个控制器。共享命名空间始终自动附加到所有控制器(当控制器热插拔时也是如此)。
off
detached
(默认值:off
)如果设置为 ,命名空间将在子系统中可用,但最初不会附加到任何控制器。将此设置为 的共享命名空间永远不会自动附加到控制器。
on
on
因此,添加
-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=off
detached=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=on
nvme-ns
可以使用其他参数配置命名空间
zoned.zone_size=SIZE
(默认值:128MiB
)定义区域大小 ()。
ZSZE
zoned.zone_capacity=SIZE
(默认值:0
)定义区域容量 ()。如果保留为默认值 (),则区域容量将等于区域大小。
ZCAP
0
zoned.descr_ext_size=UINT32
(默认值:0
)设置区域描述符扩展大小 ()。必须是 64 字节的倍数。
ZDES
zoned.cross_read=BOOL
(默认值:off
)设置为 允许读取跨越区域边界。
on
zoned.max_active=UINT32
(默认值:0
)设置活动资源的最大数量 ()。默认值 () 允许所有区域都处于活动状态。
MAR
0
zoned.max_open=UINT32
(默认值:0
)设置打开资源的最大数量 ()。默认值 () 允许打开所有区域。如果指定了,则此值必须小于或等于该值。
MOR
0
zoned.max_active
zoned.zasl=UINT8
(默认值:0
)设置“区域追加”命令的最大数据传输大小。与 类似,该值被指定为 2 的幂 (2^n),并以最小内存页大小 (CAP.MPSMIN)。默认值 () 具有此属性继承该值。
mdts
0
mdts
元数据
虚拟命名空间设备支持 LBA 元数据,其形式为单独的元数据(基于)和扩展的 LBA。MPTR
ms=UINT16
(默认值:0
)定义每个 LBA 的元数据字节数。
mset=UINT8
(默认值:0
)设置为 以启用扩展的 LBA。
1
端到端数据保护
虚拟命名空间设备支持基于 DIF 和 DIX 的保护信息(取决于 )。mset
pi=UINT8
(默认值:0
)启用指定类型(类型 、或 )的保护信息。
1
2
3
pil=UINT8
(默认值:0
)控制元数据中保护信息的位置。设置为 以将保护信息作为元数据的前八个字节进行传输。否则,保护信息将作为最后八个字节进行传输。
1
虚拟化增强功能和 SR-IOV(实验性支持)
该设备支持单根 I/O 虚拟化和共享以及虚拟化增强功能。控制器必须链接到 NVM 子系统设备 () 才能与 SR-IOV 一起使用。nvme
nvme-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