[QEMU]NVMe 仿真

QEMU 通過 和 設(shè)備提供 NVMe 仿真。nvme
nvme-ns
nvme-subsys
有關(guān)以下方面的具體信息,請參閱以下部分
添加 NVMe 設(shè)備、其他命名空間和?NVM 子系統(tǒng)。
配置可選功能,如控制器內(nèi)存緩沖區(qū)、簡單復(fù)制、分區(qū)命名空間、元數(shù)據(jù)和端到端數(shù)據(jù)保護,
添加 NVMe 設(shè)備
控制器仿真
QEMU 仿真 NVMe 控制器實現(xiàn)了 NVM Express 規(guī)范的 1.4 版。所有強制性功能都有一些例外和限制:
當(dāng)設(shè)備重新通電時,SMART/運行狀況日志頁面中的記帳號將重置。
不支持中斷合并,默認(rèn)情況下處于禁用狀態(tài)。
在 QEMU PCI 總線上連接 NVMe 控制器的最簡單方法是添加以下參數(shù):
-drive file=nvm.img,if=none,id=nvm-device nvme,serial=deadbeef,drive=nvm
該設(shè)備有許多可選的常規(guī)參數(shù)。這里提到了一些,但請參閱列出所有可能的參數(shù)。nvme
-device?nvme,help
max_ioqpairs=UINT32
(默認(rèn)值:64
)設(shè)置允許的最大 I/O 隊列對數(shù)。這將替換已棄用的參數(shù)。
num_queues
msix_qsize=UINT16
(默認(rèn)值:65
)設(shè)備應(yīng)支持的 MSI-X 矢量的數(shù)量。
mdts=UINT8
(默認(rèn)值:7
)設(shè)置設(shè)備的最大數(shù)據(jù)傳輸大小。
use-intel-id
(默認(rèn)值:off
)從 QEMU 5.2 開始,該設(shè)備使用 QEMU 分配的“紅帽”PCI 設(shè)備和供應(yīng)商 ID。將其設(shè)置為 可恢復(fù)到以前使用的未分配的英特爾 ID。
on
其他命名空間
在上面概述的最簡單的調(diào)用中,設(shè)備僅支持具有命名空間標(biāo)識符的單個命名空間。若要支持多個命名空間和其他功能,必須使用該設(shè)備。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
設(shè)備定義的命名空間將附加到設(shè)備創(chuàng)建的最新定義的命名空間。從 開始自動分配命名空間標(biāo)識符。nvme-ns
nvme-bus
nvme
1
有許多參數(shù)可用:
nsid
(默認(rèn)值:0
)顯式設(shè)置命名空間標(biāo)識符。
uuid
(默認(rèn)值:自動生成)設(shè)置命名空間的 UUID。這將在命名空間標(biāo)識描述符列表中報告為“命名空間 UUID”描述符。
eui64
設(shè)置命名空間的 EUI-64。這將在命名空間標(biāo)識描述符列表中報告為“IEEE 擴展唯一標(biāo)識符”描述符。由于機器類型為 6.1,因此如果未提供參數(shù),則使用非零默認(rèn)值。對于較早的計算機類型,該字段默認(rèn)為 0。
bus
如果定義了更多設(shè)備,則可以使用此參數(shù)將命名空間附加到特定設(shè)備(由控制器設(shè)備上的參數(shù)標(biāo)識)。
nvme
nvme
id
NVM 子系統(tǒng)
如果控制器設(shè)備 () 鏈接到 NVM 子系統(tǒng)設(shè)備 (),則其他功能將變?yōu)榭捎谩?code class="docutils literal notranslate">nvmenvme-subsys
NVM 子系統(tǒng)仿真允許共享命名空間和多路徑 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
這將創(chuàng)建一個具有兩個控制器的 NVM 子系統(tǒng)。將控制器鏈接到設(shè)備允許其他參數(shù):nvme-subsys
nvme-ns
shared
(默認(rèn)值:自 6.2 起)on
指定命名空間將附加到子系統(tǒng)中的所有控制器。如果設(shè)置為 ,命名空間將保持為私有命名空間,并且一次只能附加到單個控制器。共享命名空間始終自動附加到所有控制器(當(dāng)控制器熱插拔時也是如此)。
off
detached
(默認(rèn)值:off
)如果設(shè)置為 ,命名空間將在子系統(tǒng)中可用,但最初不會附加到任何控制器。將此設(shè)置為 的共享命名空間永遠(yuǎn)不會自動附加到控制器。
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
將導(dǎo)致 NSID 1 將是最初附加到兩個控制器的共享命名空間。NSID 3 將是一個專用命名空間,因為一次只能附加到單個控制器。此外,它最初不會連接到任何控制器(由于 ),也不會連接到熱插拔的控制器。shared=off
detached=on
可選功能
控制器內(nèi)存緩沖區(qū)
nvme
與控制器內(nèi)存緩沖區(qū)支持相關(guān)的設(shè)備參數(shù):
cmb_size_mb=UINT32
(默認(rèn)值:0
)這將在 BAR 2 中以偏移量零處添加給定大小的控制器內(nèi)存緩沖區(qū)。
legacy-cmb
(默認(rèn)值:off
)默認(rèn)情況下,設(shè)備使用“v1.4 方案”來支持控制器內(nèi)存緩沖區(qū)(即,CMB 最初被禁用,必須由主機顯式啟用)。將此設(shè)置為以充當(dāng) v1.3 設(shè)備 wrt。CMB。
on
簡單復(fù)制
該設(shè)備包括對 TP 4065(“簡單復(fù)制命令”)的支持??梢允褂迷S多附加設(shè)備參數(shù)來控制 Copy 命令限制:nvme-ns
mssrl=UINT16
(默認(rèn)值:128
)設(shè)置最大單源范圍長度 ()。這是每個源范圍中可以指定的最大邏輯塊數(shù)。
MSSRL
mcl=UINT32
(默認(rèn)值:128
)設(shè)置最大復(fù)制長度 ()。這是可以在 Copy 命令中指定的最大邏輯塊數(shù)(所有源范圍的總數(shù))。
MCL
msrc=UINT8
(默認(rèn)值:127
)設(shè)置最大源范圍計數(shù) ()。這是“復(fù)制”命令中可以使用的最大源范圍數(shù)。這是一個基于 0 的值。
MSRC
分區(qū)命名空間
命名空間可以按照 TP 4053 的定義進行“分區(qū)”(“分區(qū)命名空間”)。在設(shè)備上設(shè)置以將其配置為分區(qū)命名空間。zoned=on
nvme-ns
可以使用其他參數(shù)配置命名空間
zoned.zone_size=SIZE
(默認(rèn)值:128MiB
)定義區(qū)域大小 ()。
ZSZE
zoned.zone_capacity=SIZE
(默認(rèn)值:0
)定義區(qū)域容量 ()。如果保留為默認(rèn)值 (),則區(qū)域容量將等于區(qū)域大小。
ZCAP
0
zoned.descr_ext_size=UINT32
(默認(rèn)值:0
)設(shè)置區(qū)域描述符擴展大小 ()。必須是 64 字節(jié)的倍數(shù)。
ZDES
zoned.cross_read=BOOL
(默認(rèn)值:off
)設(shè)置為 允許讀取跨越區(qū)域邊界。
on
zoned.max_active=UINT32
(默認(rèn)值:0
)設(shè)置活動資源的最大數(shù)量 ()。默認(rèn)值 () 允許所有區(qū)域都處于活動狀態(tài)。
MAR
0
zoned.max_open=UINT32
(默認(rèn)值:0
)設(shè)置打開資源的最大數(shù)量 ()。默認(rèn)值 () 允許打開所有區(qū)域。如果指定了,則此值必須小于或等于該值。
MOR
0
zoned.max_active
zoned.zasl=UINT8
(默認(rèn)值:0
)設(shè)置“區(qū)域追加”命令的最大數(shù)據(jù)傳輸大小。與 類似,該值被指定為 2 的冪 (2^n),并以最小內(nèi)存頁大小 (CAP.MPSMIN)。默認(rèn)值 () 具有此屬性繼承該值。
mdts
0
mdts
元數(shù)據(jù)
虛擬命名空間設(shè)備支持 LBA 元數(shù)據(jù),其形式為單獨的元數(shù)據(jù)(基于)和擴展的 LBA。MPTR
ms=UINT16
(默認(rèn)值:0
)定義每個 LBA 的元數(shù)據(jù)字節(jié)數(shù)。
mset=UINT8
(默認(rèn)值:0
)設(shè)置為 以啟用擴展的 LBA。
1
端到端數(shù)據(jù)保護
虛擬命名空間設(shè)備支持基于 DIF 和 DIX 的保護信息(取決于 )。mset
pi=UINT8
(默認(rèn)值:0
)啟用指定類型(類型 、或 )的保護信息。
1
2
3
pil=UINT8
(默認(rèn)值:0
)控制元數(shù)據(jù)中保護信息的位置。設(shè)置為 以將保護信息作為元數(shù)據(jù)的前八個字節(jié)進行傳輸。否則,保護信息將作為最后八個字節(jié)進行傳輸。
1
虛擬化增強功能和 SR-IOV(實驗性支持)
該設(shè)備支持單根 I/O 虛擬化和共享以及虛擬化增強功能??刂破鞅仨氭溄拥?NVM 子系統(tǒng)設(shè)備 () 才能與 SR-IOV 一起使用。nvme
nvme-subsys
存在許多參數(shù)(請注意,它們可能會發(fā)生變化):
sriov_max_vfs
(默認(rèn)值:0
)指示控制器支持的最大 PCIe 虛擬功能數(shù)。指定非零值可使 NVMe 設(shè)備同時報告 SR-IOV 和 ARI(備用路由 ID 解釋)功能。虛擬功能控制器不會報告 SR-IOV。
sriov_vq_flexible
指示可分配給所有輔助控制器的靈活隊列資源的總數(shù)。隱式將主控制器的專用資源數(shù)設(shè)置為 。
(max_ioqpairs?-?sriov_vq_flexible)
sriov_vi_flexible
指示可分配給所有輔助控制器的靈活中斷資源的總數(shù)。隱式將主控制器的專用資源數(shù)設(shè)置為 。
(msix_qsize?-?sriov_vi_flexible)
sriov_max_vi_per_vf
(默認(rèn)值:0
)指示可分配給輔助控制器的虛擬中斷資源的最大數(shù)量。默認(rèn)值解析為
0
(sriov_vi_flexible?/?sriov_max_vfs)
sriov_max_vq_per_vf
(默認(rèn)值:0
)指示可分配給輔助控制器的最大虛擬隊列資源數(shù)。默認(rèn)值解析為
0
(sriov_vq_flexible?/?sriov_max_vfs)
最簡單的調(diào)用使能夠設(shè)置一個 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