Was sind NVME-Namespaces? Wie arbeiten Sie?

17

Ich habe kürzlich damit begonnen, Linux zu unterstützen, das auf Geräten mit integrierten nvme-SSDs installiert ist. Ich bemerkte, dass die Gerätedateien eine zusätzliche Nummer hatten, die über eine Nummer hinausging, die die Laufwerksnummer und die Partitionsnummer angibt. IDE / SATA / SCSI-Laufwerke haben normalerweise nur einen Laufwerksbuchstaben und eine Partitionsnummer.

Zum Beispiel: / dev / nvme0n1p2

Ich habe mich gefragt, was der n1-Teil war, und nach einigem Suchen sieht es so aus, als würde er einen nvme-Namespace identifizieren. Die Definitionen dafür waren vage: "Ein NVMe-Namespace ist eine Menge nichtflüchtigen Speichers (NVM), der in logische Blöcke formatiert werden kann."

Handelt es sich also um eine Partition, die auf der Ebene des Hardware-Controllers und nicht in einer MBR- oder GPT-Partitionstabelle definiert ist? Kann ein Namespace mehrere physische NVME-SSDs umfassen? Können Sie beispielsweise einen Namespace erstellen, der den Speicher mehrerer SSDs in einem einzigen logischen Namespace zusammenfasst, ähnlich wie bei RAID 0?

Was würden Sie mit einem NVME-Namespace tun, den Sie mit Partitionstabellen oder LVM oder einem Dateisystem, das mehrere Volumes verwalten kann (wie ZFS, Btrfs usw.), nicht bereits erreichen können?

Warum beginnt die Namespace-Nummerierung anscheinend bei 1 statt bei 0? Hat dies nur etwas damit zu tun, wie NVME die Namespace-Nummern auf einer niedrigen Ebene verfolgt (z. B. beginnen Partitionen auch bei 1 und nicht bei 0, da auf diese Weise der Standard für Partitionsnummern festgelegt wurde und der Linux-Kernel nur die Partitionsnummer verwendet das ist auf der festplatte gespeichert - ich denke nvme funktioniert genauso?)

JeffFromOhio
quelle

Antworten:

17

In NVM Express und verwandten Standards gewähren Controller Zugriff auf Speicher, der in einen oder mehrere Namespaces unterteilt ist. Namespaces können über den Controller erstellt und gelöscht werden , sofern Platz für sie vorhanden ist (oder der zugrunde liegende Speicher Thin Provisioning unterstützt), und mehrere Controller können Zugriff auf einen freigegebenen Namespace gewähren. Wie der zugrunde liegende Speicher organisiert ist, ist, soweit ich das beurteilen kann, nicht vom Standard vorgegeben.

Typische NVMe-SSDs können jedoch nicht kombiniert werden, da sie jeweils einen eigenen Speicher und Controller an einem PCI Express-Port bereitstellen und der Zugriffspunkt der Controller über Namespaces ist. Daher kann ein Namespace nicht mehrere Controller gruppieren (mehrere Controller können das Zugriff auf einen freigegebenen Namespace gewähren). Es ist besser, sich Namespaces wie SCSI-LUNs vorzustellen, wie sie in Unternehmensspeichern (SANs usw.) verwendet werden.

Die Namespace-Nummerierung beginnt bei 1, da die Namespace-IDs pro Controller auf diese Weise funktionieren. Namespaces haben auch längere, global eindeutige Bezeichner.

Namespaces können mit dem nvmeBefehl bearbeitet werden, der Unterstützung für NVMe-Funktionen auf niedriger Ebene bietet, einschließlich:

  • Formatierung, die ein Low-Level-Format ausführt und die Verwendung verschiedener Funktionen ermöglicht (sicheres Löschen, Auswahl des LBA-Formats ...);
  • Anfügen und Trennen, wodurch Controller an einen Namespace angehängt oder von diesem getrennt werden können (sofern dies von ihnen unterstützt wird und der Namespace dies zulässt).

Das An- und Abkoppeln ist in NVMe-Laufwerken für Laptops oder Desktops nicht zu finden. Sie können es mit NVMe-Speicherschächten verwenden, die beispielsweise von Dell EMC vertrieben werden und die iSCSI-SANs der Vergangenheit ersetzen.

Weitere Informationen finden Sie in den NVM Express-Standards (sie sind relativ einfach zu lesen) und in dieser Tutorial-Präsentation zu NVM Express, die eine gute Einführung bietet .

Stephen Kitt
quelle
Ich habe festgestellt, dass der Linux-Befehl 'nvme' nicht nur das Löschen / Erstellen von Namespaces unterstützt, sondern auch Konzepte zum Anhängen / Trennen und Formatieren eines Namespaces enthält (was von der Formatierungsoperation eines in den Namespace schreibenden Dateisystems getrennt zu sein scheint). Können Sie Angaben zu diesen Vorgängen machen?
JeffFromOhio
3
Siehe meine aktualisierte Antwort.
Stephen Kitt