Linux

什麼是 nvme 命名空間?它們是如何工作的?

  • June 5, 2021

我最近開始支持安裝在具有內置 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 功能的支持,包括:

  • 格式化,執行低級格式化並允許使用各種功能(安全擦除、LBA 格式選擇…);
  • 附加和分離,它允許控制器附加到命名空間或從命名空間分離(如果它們支持它並且命名空間允許它)。

在筆記型電腦或台式機 NVMe 驅動器中不會遇到連接和分離的情況。您可以將它與 Dell EMC 銷售的 NVMe 儲存托架一起使用,它取代了過去的 iSCSI SAN。

有關詳細資訊,請參閱NVM Express 標準(它們相對容易閱讀),以及此 NVM Express 教程展示文稿以獲得很好的介紹。

引用自:https://unix.stackexchange.com/questions/520231