我最近开始支持安装在具有内置 nvme ssds 的设备上的 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 的工作方式相同?)
在 NVM Express 和相关标准中,控制器可以访问划分为一个或多个命名空间的存储。只要有空间(或底层存储支持精简配置),就可以通过控制器创建和删除命名空间,并且多个控制器可以提供对共享命名空间的访问。据我所知,标准并未指定底层存储的组织方式。
然而,典型的 NVMe SSD 不能组合,因为它们每个都提供自己的存储和连接到 PCI Express 端口的控制器,并且访问点是控制器,在命名空间之上——因此命名空间不能对多个控制器进行分组(多个控制器可以提供对共享命名空间的访问)。最好将命名空间视为类似于企业存储(SAN 等)中使用的 SCSI LUN。
命名空间编号从 1 开始,因为这是每个控制器命名空间标识符的工作方式。命名空间也有更长的、全球唯一的标识符。
命名空间可以使用该
nvme
命令进行操作,该命令提供对低级 NVMe 功能的支持,包括:在笔记本电脑或台式机 NVMe 驱动器中不会遇到连接和分离的情况。您可以将它与 Dell EMC 销售的 NVMe 存储托架一起使用,它取代了过去的 iSCSI SAN。
有关详细信息,请参阅NVM Express 标准(它们相对容易阅读),以及此 NVM Express 教程演示文稿以获得很好的介绍。
从马口中:
您可以使用命令检查命名空间支持的功能
nvme
,例如通过:您可以像这样检查您的设备支持多少个命名空间:
查看NVMe Base Specification 1.4b,它将有效 NSID 定义为大于 0:
(第 6.1.2 节有效和无效 NSID)
将 0 作为无效值的好处是您可以使用 0 来终止命名空间 ID 数组(参见第 4.10 节命名空间列表)。