什么是 nvme 命名空间?它们如何工作?

什么是 nvme 命名空间?它们如何工作?

我最近开始支持在具有内置 nvme ssd 的设备上安装 Linux。我注意到设备文件有一个额外的数字,超出了标识驱动器号和分区号的数字。 IDE/SATA/SCSI 驱动器通常只有驱动器号和分区号。

例如:/dev/nvme0n1p2

我想知道 n1 部分是什么,经过一番搜索后,它看起来像是标识了一个 nvme“命名空间”。它的定义有点模糊:“NVMe 命名空间是一定数量的非易失性内存 (NVM),可以格式化为逻辑块。”

那么,这是否像在硬件控制器级别定义的分区,而不是在 MBR 或 GPT 分区表中定义的分区?命名空间可以跨越多个物理 NVME SSD 吗?例如,您能否创建一个命名空间,将多个 SSD 的存储集中到一个逻辑命名空间中,类似于 RAID 0?

对于使用分区表或 LVM 或可管理多个卷的文件系统(如 ZFS、Btrfs 等)无法实现的 NVME 命名空间,您会做什么?

另外,为什么命名空间编号似乎从 1 而不是 0 开始?这是否与 NVME 如何在低级别跟踪命名空间编号有关(例如,分区也从 1 开始,而不是 0,因为分区编号的标准就是这样设置的,因此 Linux 内核只使用任何分区编号)存储在磁盘上的是 - 我猜 nvme 的工作方式相同?)

答案1

在 NVM Express 及相关标准中,控制器提供对划分为一个或多个命名空间的存储的访问。可以创建和删除命名空间通过控制器,只要有空间(或者底层存储支持精简配置),并且多个控制器可以提供对共享命名空间的访问。据我所知,标准并未指定底层存储的组织方式。

然而,典型的 NVMe SSD 无法组合,因为它们各自提供自己的存储和连接到 PCI Express 端口的控制器,并且访问点是位于命名空间之上的控制器 - 因此命名空间无法将多个控制器分组(多个控制器提供对共享命名空间的访问)。最好将命名空间视为类似于企业存储(SAN 等)中使用的 SCSI LUN。

命名空间编号从 1 开始,因为这就是每个控制器命名空间标识符的工作方式。命名空间还具有更长的全局唯一标识符。

可以使用以下命令来操作命名空间nvme命令,它提供对低级 NVMe 功能的支持,包括:

  • 格式化,执行低级格式化并允许使用各种功能(安全擦除、LBA 格式选择...);
  • 附加和分离,允许控制器附加到命名空间或从命名空间分离(如果它们支持并且命名空间允许)。

在笔记本电脑或台式机 NVMe 驱动器中不会遇到连接和分离的情况。您可以将其与 NVMe 存储托架(例如 Dell EMC 销售的存储托架)一起使用,它取代了过去的 iSCSI SAN。

NVM Express 标准了解详细信息(它们相对容易阅读),以及这个 NVM Express 教程演示一个好的介绍。

答案2

来自马嘴:

主机软件希望将 NVMe SSD 分解为多个命名空间的原因有很多:逻辑隔离、多租户、安全隔离(每个命名空间加密)、出于恢复目的而写保护命名空间、过度配置以提高写入性能和耐用性等等。

您可以使用命令检查名称空间支持哪些功能nvme,例如通过:

# nvme id-ns -H /dev/nvme0n1  
NVME Identify Namespace 1
[..]
LBA Format  0 : Metadata Size: 0   bytes - Data Size: 512 bytes
                                         - Relative Performance: 0x2 Good (in use)
LBA Format  1 : Metadata Size: 0   bytes - Data Size: 4096 bytes
                                         - Relative Performance: 0x1 Better

您可以检查您的设备支持多少个命名空间,如下所示:

# nvme id-ctrl -H /dev/nvme0 | grep nn 
nn        : 1

看着NVMe 基本规范 1.4b,它将有效的 NSID 定义为大于 0:

有效 NSID 是可用于引用 NVM 子系统中存在的命名空间的可能 NSID 范围。任何 NSID 均有效,除非该 NSID 为 0h 或大于识别控制器数据结构中报告的命名空间字段数量(请参阅图 251)。 NSID FFFFFFFFh 是一个广播值,用于指定所有命名空间。无效 NSID 是任何既不是有效 NSID 也不是广播值的值。

(第 6.1.2 节有效和无效 NSID)

将 0 作为无效值的优点是您可以使用 0 来终止命名空间 ID 数组(参见第 4.10 节命名空间列表)。

相关内容