Je suis sûr que beaucoup ont entendu parler de NVM Express , ou simplement de NVMe . Au départ, ce n'étaient que des lecteurs rapides pour moi. Ensuite, j'ai réalisé que c'était l'interface pour connecter ces lecteurs. Puis il a commencé à comprendre NVMe comme un protocole de transfert de données sur le bus PCIe. Et pas seulement un protocole, mais un protocole spécialement conçu pour les disques SSD!
Petit à petit, je me suis rendu compte qu'il s'agissait d'une spécification complète . Et c'est parti ... Combien de fonctionnalités intéressantes d'utilisation, il s'avère, existent dans NVMe. Combien de choses ont été inventées ... C'était même un peu offensant qu'une telle couche d'informations soit passée par moi.
Alors, qu'est-ce que NVMe exactement? Regardons de plus près.
Tout a commencé avec l' interface SATA . En fait, avant cela, il y avait beaucoup d'autres interfaces - SCSI, UltraSCSI, ATA, PATA et autres, mais ce sont des choses d'autrefois. Dans cet article, nous ne considérerons que les interfaces actuellement pertinentes.
La vitesse de transfert des données via l'interface SATA atteint 560 Mo / s, ce qui est largement suffisant pour les disques HDD dont les performances varient de 90 à 235 Mo / s (il existe quelques prototypes dont la vitesse atteint 480 Mo / s ). Mais cela ne suffit pas pour les disques SSD, leurs performances atteignent déjà maintenant de 3000 à 3500 Mo / s. L'interface SAS ne fonctionnera pas non plus, sa vitesse maximale n'est que de 1200 Mo / s.
Afin de réaliser tout le potentiel des disques SSD, de grands esprits ont décidé d'utiliser l' interface PCIe . Maintenant, il vous permet de transférer des données à des vitesses de 8 à 32 Go / s. Pour unifier la connexion des SSD aux interfaces PCIe, la spécification NVMe a été développée. De la même manière que la spécification pour la connexion de clés USB-Flash a été créée en temps voulu.
Nous ne démonterons pas complètement NVMe. Dans cet article, je souhaite partager avec vous une fonctionnalité qui m'a beaucoup intéressé: les espaces de noms NVMe ou les espaces de noms .
Espérons que parmi les lecteurs, certains sont intéressés par l'exploration de cette technologie. Les commentaires des utilisateurs expérimentés seront les bienvenus. Et si vous, comme moi, commencez tout juste à comprendre le sujet, je vous recommande de lire la série d'articles sur l'histoire du SSD. À un moment donné, elle m'a aidé à tasser et à trier beaucoup de déchets dans ma tête.
Plus proche de NVMe
NVMe sur Linux
Je partirai de loin. Pour étudier et rechercher des informations sur les espaces de noms, j'ai été invité par la question: "Pourquoi les disques NVMe sous Linux sont-ils appelés ainsi?"
Tout le monde est habitué à étiqueter les disques sous Linux en tant que périphériques blocs. Ce sont des descripteurs de fichiers qui fournissent une interface pour interagir avec des périphériques physiques ou virtuels. Et ces appareils n'ont pas de nom aléatoire, mais assez strict, contenant des informations. Regardons la sortie suivante de devfs :
root@thinkpad-e14:~$ ls -l /dev/ | grep -E "nvme" crw------- 1 root root 241, 0 25 22:04 nvme0 brw-rw---- 1 root disk 259, 0 25 22:04 nvme0n1 brw-rw---- 1 root disk 259, 1 25 22:04 nvme0n1p1 brw-rw---- 1 root disk 259, 2 25 22:04 nvme0n1p2 brw-rw---- 1 root disk 259, 3 25 22:04 nvme0n1p3
Tous les périphériques NVMe connectés à la machine de production sont répertoriés ici. Considérez le périphérique bloc / dev / nvme0n1p1 . La partie nvme , assez curieusement, est utilisée pour les périphériques NVMe. Le numéro suivant indique le numéro de série du contrôleur de disque , qui est responsable de toutes les opérations effectuées avec le lecteur. Le p1 de fin indique le numéro de partition sur le disque. Enfin, la partie qui mérite notre attention est n1. C'est le numéro de l'espace.
Pour plus de simplicité, vous pouvez également faire une analogie avec les SSD ordinaires:
/ dev / sda - analogique de / dev / nvme0n1
/ dev / sda1 - analogique de / dev / nvme0n1p1
Faites attention au périphérique / dev / nvme0. Ceci est un contrôleur NVMe. C'est un appareil de caractère. Ainsi, nous pouvons nous y référer en envoyant certaines commandes, que nous utiliserons plus loin.
Espace de noms vs partition
Vous vous demandez peut-être: en quoi l'espace de noms est-il différent de la partition? Abandonnons toutes les fonctionnalités et avantages de NVMe Namespace. La partition est une partition de disque au niveau de l'hôte . L'espace de noms est une section au niveau du contrôleur . Autrement dit, l'espace de noms est une sorte d' espace logique avec lequel l'hôte fonctionne comme un périphérique bloc.
Un autre niveau de partitionnement ajoute de la flexibilité à l'organisation du système de stockage, ce qui permet l'utilisation de diverses technologies visant à augmenter la fiabilité, les performances et la sécurité des données. Nous les examinerons plus tard.
Paramètres du contrôleur NVMe
Toutes les opérations de données sont gérées par un contrôleur NVMe spécial. De plus, dans sa mémoire, il stocke des métadonnées sur lui-même et la structure interne des informations: numéro de série, modèle, toutes sortes de paramètres de disque, espaces qui lui sont attribués, format de données, etc.
Je propose de les examiner au microscope. Pour ce faire, j'ai envoyé une commande spéciale au contrôleur, en réponse à laquelle il a renvoyé les métadonnées. J'expliquerai comment faire cela plus tard, mais pour l'instant, jetez-y un œil. Comme il y a beaucoup de données, je ne les ai pas entièrement insérées, mais il faut savoir que les paramètres dont je parlerai plus tard existent réellement :
{ "vid" : 5197, "ssvid" : 5197, "sn" : "00000000000000", "mn" : "00000000000000000000000000", "fr" : "7L1QFXV7", "rab" : 2, "ieee" : 9528, "cmic" : 0, "mdts" : 9, "cntlid" : 5, "ver" : 66304, "rtd3r" : 100000, "rtd3e" : 8000000, "oaes" : 512, "ctratt" : 0, "rrls" : 0, "crdt1" : 0, "crdt2" : 0, "crdt3" : 0, "oacs" : 23, "tnvmcap" : 256060514304, "unvmcap" : 0, ... }
Les métadonnées sont stockées dans le contrôleur sous la forme d'une séquence d'octets dans l'ordre de haut en bas, je vais donc adhérer au format d'enregistrement suivant:
[intervalle en octets (format Big-Endian)] / nom du paramètre / décryptage.
Un exemple pour mieux comprendre. L'enregistrement suivant signifie que de 71 à 64 octets, la valeur du paramètre fr est stockée , ce qui correspond à la révision du micrologiciel :
[71:64] / fr / révision du micrologiciel.
[23: 4] / sn / numéro de série. Contient le numéro de série du contrôleur.
[63:24] / mn / numéro de modèle. Contient le numéro de modèle ou le numéro de pièce.
[71:64] / fr / révision du firmware.Contient le numéro de révision du micrologiciel du contrôleur.
[257: 256] / oacs / prise en charge facultative de la commande admin. Indique la présence de commandes et de fonctions de contrôleur supplémentaires. Il se compose de 16 bits, dont chacun est responsable d'une commande spécifique. Si le bit est 1, alors le contrôleur permet:
- [15:10] - réservé;
- [9] - obtenir le statut LBA;
- [8] - accéder à la "Doorbell Buffer Config" ;
- [7] - pour gérer la virtualisation ("Virtualization Management") ;
- [6] - utilisez les commandes NVMe-Mi Recieve et NVMe-Mi Send ("NVMe Management Interface" );
- [5] - utiliser des directives ("Directives") ;
- [4] — («Self-Test Commands»);
- [3] — («Namespace Management»);
- [2] — ( «Firmware Commit» «Firmware Download»);
- [1] — («NVM Format»);
- [0] — («Security Send», «Security Receive»).
Dans cet article, nous n'aborderons que les fonctions liées aux espaces de noms, à savoir «Gestion des espaces de noms» et «Format NVM» . Si vous êtes intéressé par des détails sur d'autres fonctionnalités, vous pouvez vous référer à la spécification NVM Express Revision 1.4 .
Paramètres d'espace NVMe
Regardons maintenant les métadonnées des espaces NVMe:
{ "nsze" : 500118192, "ncap" : 500118192, "nuse" : 233042000, "nsfeat" : 0, "nlbaf" : 0, "flbas" : 0, "mc" : 0, "dpc" : 0, "dps" : 0, "nmic" : 0, "rescap" : 0, ... ] }
[7: 0] / nsze / taille de l'espace de noms. Il s'agit de la quantité maximale d'espace dans les blocs logiques. Dans ce cas - 500118192 blocs de 512 octets, qui sont d'ailleurs indiqués dans la sortie blockdev :
root@thinkpad-e14:~$ sudo blockdev --getsz /dev/nvme0n1 500118192
[15: 8] / ncap / capacité de l'espace de noms . Il s'agit du nombre de blocs logiques actuellement alloués à l'espace de stockage.
[23:17] / nuse / utilisation de l'espace de noms. Il s'agit du nombre de blocs logiques actuellement occupés par les données.
Notez que les options nsze et ncap sont égales. Quel est l'intérêt de spécifier le volume maximum et le volume actuellement alloué? Cela signifie-t-il que pour le moment, il peut y avoir moins alloué que disponible? Oui!
Le fait est que les espaces de noms prennent en charge la technologie Thin Provisioning . ... Cela signifie que seule une fraction du volume spécifié est allouée à l'espace. L'autre partie restera dans le pool partagé et sera allouée à cet espace ou à d'autres à la demande: lorsque le volume alloué est plein ou lorsqu'un seuil critique est atteint. En général, cette technologie permet une utilisation plus efficace des ressources de stockage. Plus de détails et plus clairement avec cette technologie peuvent être trouvés dans cet article .
Dans notre situation, nsze et ncap sont égaux, car l'espace a été créé sans le support de la distribution fine. Cet espace sur le disque ressemblera à ceci:
ncap et nsize pointeront vers un espace total一 . Dans le cas de l'utilisation de la distribution légère sur le disque, l'espace ressemblera à ceci:
Ici, nsze indique le volume maximum, nca p - l'alloué, et nuse dans les deux cas ne montre que ce qui est occupé. Lorsque la valeur de nuse atteint ncap , la ncap augmente, mais pas plus de nsze .
Il convient de noter que pour prendre en charge cette technologie, une configuration appropriée de l'espace de noms est requise, ainsi que la prise en charge de la distribution légère du côté du contrôleur.
[24:24] / nsfeat / namespace fonctionnalités.Ce paramètre est particulièrement intéressant. Il indique la présence de fonctionnalités supplémentaires de l'espace. Il se compose de 8 bits (ils sont également répertoriés en Big Endian), chacun étant responsable d'une fonction spécifique. Si la valeur du bit est 1, la fonction est active, 0 - pas:
- [7: 5] - réservé;
- [4: 4] - prise en charge de champs supplémentaires pour optimiser les E / S ;
- [3: 3] - désactiver la réutilisation du champ NGUID ;
- [2: 2] - prise en charge des blocs supprimés et non écrits («attributs de contexte») ;
- [1: 1] - prise en charge de champs supplémentaires pour l'enregistrement atomique ("opérations atomiques") ;
- [0: 0] - prise en charge de la distribution fine .
[26:26] / flbas / taille lba formatée . Ce paramètre pointe vers une structure LBA. Se compose également de 8 bits:
- [7: 5] - réservé;
- [4: 4] - si mis à 1: indique que les métadonnées seront stockées à la fin du bloc; avec une valeur de 0: les métadonnées sont transférées dans un tampon séparé ;
- [3: 0] - vous permet de sélectionner l'un des 16 formats LBA possibles.
[29:29] / dps / paramètres de type de protection des données de bout en bout . Indique le type de protection des données de bout en bout. Se compose de 8 bits:
- [7: 4 ] - réservé;
- [3: 3] - indique le type de transfert de métadonnées;
- [2: 0] - indique la présence d'une protection des données et son type.
[30:30] / nmic / namespace multi-chemin et capacités de partage d'espaces de noms . Ce champ indique la prise en charge des fonctionnalités liées à l'accès multiple aux espaces de noms:
- [7: 1] - réservé;
- [0: 0] - une valeur de 1 indique que cet espace est public (espace de noms public) et peut communiquer avec plusieurs contrôleurs , et une valeur de 0 indique que l'espace est privé (espace de noms privé) et n'est lié qu'à un seul .
Ceci conclut votre bref aperçu des paramètres. Leur nombre est énorme, ce qui permet de configurer très finement les espaces de noms pour diverses tâches, ce que nous examinerons à la fin de l'article. Une description détaillée de chaque paramètre se trouve dans la spécification NVM Express Revision 1.4 .
Espaces publics et privés
L'article a déjà mentionné des termes tels que les espaces publics et les espaces privés . Mais je n'ai pas clarifié leur signification, je considère donc nécessaire de leur consacrer un peu de temps.
L'une des étapes de la création d'un espace consiste à l'attribuer à un contrôleur NVMe. L'accès à l'espace se fera via le contrôleur auquel il est affecté. Mais l'espace peut être attribué non seulement à un contrôleur - privé, mais aussi à plusieurs contrôleurs - public.
Si un espace privé peut être qualifié d'ordinaire, puisque rien d'intéressant ne peut en être fait, alors un espace public vous permet d'utiliser une opportunité telle que l' espace de noms multi-chemin...
Interopérabilité avec NVMe
Passons à la question de l'interaction avec les périphériques NVMe: comment envoyer diverses commandes au contrôleur, créer des espaces de noms, les formater, etc. Pour cela, il existe un utilitaire dans le monde Linux - nvme-cli. Avec son aide, vous pouvez effectuer ces opérations.
liste nvme
Pour lister les périphériques NVMe, il n'est pas nécessaire d'accéder aux devfs de cette manière:
root@thinkpad-e14:~$ ls /dev/ | grep "nvme" nvme0 nvme0n1 nvme0n1p1 nvme0n1p2 nvme0n1p3
Ou utilisez lspci pour savoir ce qui est connecté à la machine:
root@thinkpad-e14:~$ lspci | grep -E "NVMe|Non-Volatile" 07:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a809
Il suffit d'utiliser la commande nvme list :
root@thinkpad-e14:~$ nvme list -o json { "Devices" : [ { "NameSpace" : 1, "DevicePath" : "/dev/nvme0n1", "Firmware" : "9L1QFXV7", "Index" : 0, "ModelNumber" : "SAMSUNG MZALQ256HAJD-000L1", "ProductName" : "Non-Volatile memory controller: Samsung Electronics Co Ltd Device 0xa809", "SerialNumber" : "00000000000000", "UsedBytes" : 38470483968, "MaximumLBA" : 500118192, "PhysicalSize" : 256060514304, "SectorSize" : 512 } ] }
J'ai sorti les informations au format JSON à titre d'exemple . Comme vous pouvez le voir, non seulement une liste des appareils est affichée ici, mais également diverses informations à leur sujet. Je pense que certains des attributs (par exemple, DevicePath ou ModelNumbe r) n'ont pas besoin de commentaires, je ne fais donc attention qu'à quelques-uns:
- Index - numéro du contrôleur;
- UsedBytes La quantité d'espace utilisée en octets.
- PhysicalSize - la quantité maximale d'espace en octets;
- SectorSize - LBA ou format de bloc logique - le plus petit bloc de données adressable;
- MaximumLBA est le nombre maximal de blocs logiques.
nvme id-ctrl, nvme id-ns
Plus tôt dans l'article, pour obtenir des métadonnées sur un appareil, j'ai envoyé la commande Identify au contrôleur . Pour cela, j'ai utilisé la commande nvme id-ctrl pour identifier le contrôleur:
root@thinkpad-e14:~$ nvme id-ctrl /dev/nvme0
Et nvme id-ns pour identifier l'espace:
root@thinkpad-e14:~$ nvme id-ns /dev/nvme0n1
Notez que vous devez spécifier un périphérique - un contrôleur ou un espace de noms.
nvme create-ns, nvme delete-ns
Les espaces de noms sont créés en plusieurs étapes. Vous devez d'abord le façonner. Pour ce faire, utilisez la commande nvme create-ns :
root@thinkpad-e14:~$ nvme create-ns /dev/nvme0 --nsze 1875385008 --ncap 1875385008 --flbas 0 --nmic 1 --dps 0 create-ns: Success, created nsid:1
Vous connaissez déjà les arguments donnés à cette commande. Nous les avons examinés dans la section "Paramètres NVMe Space".
Pour supprimer un espace, utilisez la commande nvme delete-ns :
root@thinkpad-e14:~$ nvme delete-ns /dev/nvme0n1 delete-ns: Success, deleted nsid:1
nvme attach-ns, nvme detach-ns
La deuxième étape de la création d'espaces NVMe consiste à lier l'espace généré au contrôleur. Pour ce faire, utilisez la commande nvme attach-ns :
root@thinkpad-e14:~$ nvme attach-ns /dev/nvme0 --namespace-id 1 --controllers 1 attach-ns: Success, nsid:1
Avec cette commande, nous lions l'espace avec l'identificateur 1 au contrôleur / dev / nvme0 . Notez également l'argument --controllers . Cela répertorie les ID des contrôleurs NVMe auxquels l'espace peut être mappé. Cet argument est facultatif et est utilisé lors de la création d'espaces publics.
Pour une raison quelconque, la numérotation des contrôleurs commence à 1, c'est-à-dire que le contrôleur / dev / nvme0 a un identificateur de 1, qui est spécifié dans l'argument --controllers. J'espère que cela vous aidera à éviter de perdre du temps à rechercher l'erreur suivante:
root@thinkpad-e14:~$ nvme attach-ns /dev/nvme0 --namespace-id 1 --controllers 0 NVMe Status:CONTROLLER_LIST_INVALID: The controller list provided is invalid(211c)
Pour délier l'espace, utilisez la commande nvme detach-ns :
root@thinkpad-e14:~$ nvme detach-ns /dev/nvme0n1 --namespace-id 1 --controllers 1 detach-ns: Success, nsid:1
L'espace disparaît alors de la liste des périphériques bloqués et devient inutilisable. Vous devez également spécifier uniquement les contrôleurs dont vous souhaitez découpler l'espace dans l'argument --controllers.
réinitialisation nvme
Une fois qu'un espace a été lié à un contrôleur, il peut généralement être utilisé pour le travail. Cependant, il arrive que le contrôleur ne puisse pas voir l'espace. Dans ce cas, il doit être redémarré - utilisez la commande nvme reset .
format nvme
S'il est nécessaire de changer le format LBA d'un espace, la commande nvme format vient à la rescousse :
root@thinkpad-e14:~$ nvme format /dev/nvme0n1 --lbaf 0 Success formatting namespace:1
L'argument --lbaf indique le format LBA.
Cependant, cette commande peut également être utilisée pour effacer en toute sécurité des données sur un lecteur NVMe:
root@thinkpad-e14:~$ nvme format /dev/nvme0n1 --ses 1 -r Success formatting namespace:1
L'argument --ses indique le niveau de coulis:
- 1 - supprimer toutes les données;
- 2 - supprimer les données cryptées.
L'argument -r indique que le contrôleur redémarrera après un coulis sûr.
Application
Il existe de nombreuses utilisations possibles des espaces. Ils sont principalement utilisés pour augmenter les performances, la redondance et sont utilisés dans les systèmes de stockage, mais il existe des cas d'utilisation plus banals.
Zone de réserve
Commençons par une pratique d'utilisation assez courante. La zone de réserve, ou zone de réserve, a été inventée avant même NVMe. Il s'agit d'un espace spécial sur le SSD qui est utilisé par le contrôleur lui-même pour les opérations internes et n'est pas disponible pour l'hôte.
En modifiant la taille des espaces, nous pouvons également modifier la taille de la zone de repli. Le fait est que tout le volume du disque est égal à la somme des volumes de tous les espaces et du volume de la zone de secours:
En conséquence, si nous réduisons le volume total des espaces, le volume restant ira en faveur de la zone de réserve.
Si vous souhaitez en savoir plus sur la zone de sauvegarde, vous pouvez vous référer à cet article .
Chiffrement et isolement
Les disques NVMe prennent en charge les SED OPAL . De plus, différentes clés de chiffrement sont utilisées pour chaque espace de noms.
Le contrôleur fournit également une protection en écriture. Il existe trois niveaux:
- lecture seule jusqu'au prochain redémarrage;
- lecture seule jusqu'au prochain redémarrage après la désactivation de la fonction de protection en écriture;
- en lecture seule tout au long du travail.
Il est souvent utilisé dans les PC fixes et mobiles. Par exemple, un chargeur de démarrage peut être placé dans un espace en lecture seule pour éviter de l'endommager. D'autres données importantes peuvent être protégées de la même manière.
Utilisation multiple
Comme mentionné précédemment, les espaces sont des partitions au niveau du contrôleur qui sont visibles par l'hôte final en tant que périphérique distinct. Est-il possible de diviser un grand disque NVMe en plusieurs espaces privés, chacun étant ensuite alloué à différents hôtes? Peut! Et en utilisant le protocole réseau NVMe-oF (NVMe Over Fabrics) , ces espaces peuvent être alloués non seulement aux hôtes virtuels, mais aussi aux hôtes physiques.
Avec cette utilisation du lecteur, le schéma de partitionnement ressemblera à ceci:
Le contrôleur NVMe s'assurera que les espaces sont isolés les uns des autres: les données seront stockées dans des zones séparées du lecteur, chaque hôte aura sa propre file d'attente d'E / S. Cependant, la zone de réserve , ou les zones de réserve , seront toujours partagées.
Espace de noms multi-chemins et partage d'espace de noms
Le partage d'espace de noms, ou espaces de noms publics, signifie qu'un ou plusieurs hôtes peuvent partager un espace via deux contrôleurs ou plus.
Pourquoi est-ce? La figure montre un diagramme de l'utilisation des espaces publics. Oui, intéressant: nous pouvons accéder à l'espace NS B via le contrôleur NVMe 1 et le contrôleur NVMe 2. Mais je ne vois aucune utilité à cela ... jusqu'à ce que le diagramme ressemble à ceci:
Ici, nous voyons que les contrôleurs sont sur des hôtes complètement différents et nous avons plusieurs chemins indépendants vers les données: via les contrôleurs hôtes Host A (contrôleurs bleus) et Host B (contrôleurs violets). Maintenant, cela peut être utilisé pour la redondance ou pour augmenter les performances: si le chemin bleu est fortement chargé, nous suivrons le chemin violet.
Cette approche vous permet d'organiser des systèmes de stockage définis par logiciel flexibles et hautement fiables à partir de plates-formes de serveurs conventionnelles à l'aide de NVMe-oF.
Résultat
Les espaces de noms NVMe
Dans cet article, nous n'avons pas couvert tous les aspects et subtilités de l'utilisation des espaces de noms. Il s'est avéré plutôt une critique ou une connaissance. Cependant, j'espère que cela vous aidera à vous lancer dans une étude plus approfondie de la technologie si vous le souhaitez.
Épilogue
Lors de la rédaction de cet article, j'ai été confronté à
- Les lecteurs Samsung 970 EVO / 970 EVO Plus avec le micrologiciel 2b2qexe7 / 2b2qexm7 n'implémentent pas les commandes de réinitialisation et de formatage;
- Les lecteurs Samsung 970 EVO / 970 EVO Plus avec le micrologiciel 2b2qexe7 / 2b2qexm7 n'implémentent pas la gestion de l'espace à l'aide des commandes create-ns, delete-ns, detach-ns, atach-ns;
- Les lecteurs Samsung PM991 avec le micrologiciel 9L1QFXV7 ont un bogue en raison duquel le redémarrage du contrôleur à l'aide de la commande de réinitialisation entraîne une erreur;
- Les lecteurs Samsung PM991 avec le micrologiciel 9L1QFXV7 ont un bogue en raison duquel le formatage de l'espace à l'aide de la commande format entraîne une erreur;
- Les lecteurs Samsung PM991 dotés du micrologiciel 9L1QFXV7 n'implémentent pas la gestion de l'espace à l'aide des commandes create-ns, delete-ns, detach-ns, atach-ns.
Je suis sûr que les disques du segment des entreprises sont exempts de ces problèmes, mais tout le monde ne peut pas se permettre d'acheter de tels composants, alors étudiez en détail les disques et les manuels correspondants lors de l'achat. Et s'il est possible d'examiner les disques avant d'acheter et de voir les paramètres du contrôleur NVMe, assurez-vous de l'utiliser.
Sources utiles
- SSD: appareil, composants et principes de fonctionnement
- Présentation rapide de NVM Express
- Spécification NVMe 1.4
- Espaces de noms NVMe
- Base NVM Express — Part One
- NVMe Command Line Interface (NVMe-CLI)
- NVMe Over Fabrics