<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://doc.ycharbi.fr/index.php?action=history&amp;feed=atom&amp;title=Nvme-of_-_linux</id>
	<title>Nvme-of - linux - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ycharbi.fr/index.php?action=history&amp;feed=atom&amp;title=Nvme-of_-_linux"/>
	<link rel="alternate" type="text/html" href="https://doc.ycharbi.fr/index.php?title=Nvme-of_-_linux&amp;action=history"/>
	<updated>2026-06-10T07:13:44Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://doc.ycharbi.fr/index.php?title=Nvme-of_-_linux&amp;diff=1185&amp;oldid=prev</id>
		<title>Ycharbi : Page créée avec « Category:Réseaux_linux Category:RDMA  Le Non-Volatile Memory express over Fabric (&#039;&#039;NVMe-oF&#039;&#039;) est un protocole permettant d&#039;attacher un volume &#039;&#039;NVMe&#039;&#039; (un &#039;&#039;SSD... »</title>
		<link rel="alternate" type="text/html" href="https://doc.ycharbi.fr/index.php?title=Nvme-of_-_linux&amp;diff=1185&amp;oldid=prev"/>
		<updated>2020-10-07T17:25:54Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « &lt;a href=&quot;/index.php/Cat%C3%A9gorie:R%C3%A9seaux_linux&quot; title=&quot;Catégorie:Réseaux linux&quot;&gt;Category:Réseaux_linux&lt;/a&gt; &lt;a href=&quot;/index.php/Cat%C3%A9gorie:RDMA&quot; title=&quot;Catégorie:RDMA&quot;&gt;Category:RDMA&lt;/a&gt;  Le Non-Volatile Memory express over Fabric (&amp;#039;&amp;#039;NVMe-oF&amp;#039;&amp;#039;) est un protocole permettant d&amp;#039;attacher un volume &amp;#039;&amp;#039;NVMe&amp;#039;&amp;#039; (un &amp;#039;&amp;#039;SSD... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Réseaux_linux]]&lt;br /&gt;
[[Category:RDMA]]&lt;br /&gt;
&lt;br /&gt;
Le Non-Volatile Memory express over Fabric (&amp;#039;&amp;#039;NVMe-oF&amp;#039;&amp;#039;) est un protocole permettant d&amp;#039;attacher un volume &amp;#039;&amp;#039;NVMe&amp;#039;&amp;#039; (un &amp;#039;&amp;#039;SSD PCIe&amp;#039;&amp;#039;) via le réseau (à l&amp;#039;image du [[Iscsi|iSCSI]]). Cette technologie a l&amp;#039;avantage, en plus de sa simplicité de mise en service, d&amp;#039;avoir des performances de dingue. En effet, le &amp;#039;&amp;#039;NVMe-of&amp;#039;&amp;#039; s’appuie sur le &amp;#039;&amp;#039;Remote Direct Memory Access&amp;#039;&amp;#039; (&amp;#039;&amp;#039;RDMA&amp;#039;&amp;#039;) &amp;#039;&amp;#039;over Converged Ethernet&amp;#039;&amp;#039; (&amp;#039;&amp;#039;RCoE&amp;#039;&amp;#039;). Il encapsule donc des trames &amp;#039;&amp;#039;Infiniband&amp;#039;&amp;#039; sur de l&amp;#039;&amp;#039;&amp;#039;Ethernet&amp;#039;&amp;#039; en exploitant les spécificités d&amp;#039;accès direct à la mémoire de l&amp;#039;hôte. Il en résulte des temps d&amp;#039;accès très proche d&amp;#039;une connexion standard au bus &amp;#039;&amp;#039;PCIe&amp;#039;&amp;#039; mais depuis le réseau... Ceci induit toutefois inconvénient d&amp;#039;obliger le recours à un matériel prenant en charge le &amp;#039;&amp;#039;RDMA&amp;#039;&amp;#039;. Oubliez donc le contrôleur réseau intégré à votre carte mère ainsi que toute les cartes additionnelles grand publique...&lt;br /&gt;
&lt;br /&gt;
Pour cette documentation j&amp;#039;utilise deux ordinateurs équipés d&amp;#039;une carte réseau &amp;#039;&amp;#039;Mellanox Connectx 3&amp;#039;&amp;#039; 10Gbe chacun et connectés par l&amp;#039;intermédiaire d&amp;#039;un commutateur Cisco 3560CX-12PD-S (une connexion direct entre les deux machines revient au même).&lt;br /&gt;
&lt;br /&gt;
{{info| Les deux machines doivent impérativement faire partie du même &amp;#039;&amp;#039;LAN&amp;#039;&amp;#039;. Le couple &amp;#039;&amp;#039;IP/port&amp;#039;&amp;#039; définit plus loin dans la partie serveur ne sert que d&amp;#039;identifiant à la communication &amp;#039;&amp;#039;Infiniband&amp;#039;&amp;#039;. Le protocole &amp;#039;&amp;#039;IP&amp;#039;&amp;#039; n&amp;#039;est jamais utilisé avec &amp;#039;&amp;#039;RDMA&amp;#039;&amp;#039; et donc le routage ne peut fonctionner.}}&lt;br /&gt;
&lt;br /&gt;
=Définitions=&lt;br /&gt;
Avant de commencer, nous allons définir quelques termes afin de savoir où nous mettons les pieds.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;NVMe&amp;#039;&amp;#039;&amp;#039;: [https://fr.wikipedia.org/wiki/NVMe Non-Volatile Memory express] est un protocole réservé aux périphériques de stockage exploitant un bus &amp;#039;&amp;#039;PCI express&amp;#039;&amp;#039; et destiné aux volumes &amp;#039;&amp;#039;Solid State Drive&amp;#039;&amp;#039; (&amp;#039;&amp;#039;SSD&amp;#039;&amp;#039;) en lieu et place du [https://fr.wikipedia.org/wiki/Serial_ATA Serial Advanced Technology Attachment] (&amp;#039;&amp;#039;SATA&amp;#039;&amp;#039;). Exploitant la bande passante de celui-ci et utilisant des instructions adaptés aux mémoires flashs, il est bien plus performant que ce dernier&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;RDMA&amp;#039;&amp;#039;&amp;#039;: l&amp;#039;accès direct à la mémoire à distance ou [https://en.wikipedia.org/wiki/Remote_direct_memory_access Remote Direct Memory Access] permet de donner accès à la mémoire d&amp;#039;un hôte distant sans passer par le noyau de celui-ci (c&amp;#039;est l&amp;#039;adaptateur réseau qui communique avec la mémoire). Les informations n’étant pas copiées entre la mémoire d&amp;#039;application et les tampons de données du système d&amp;#039;exploitation (ainsi que toute fonction comme le pare-feu ou la &amp;#039;&amp;#039;QoS&amp;#039;&amp;#039;), une mise en réseau à haut débit et à faible latence est rendue possible&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;RCoE&amp;#039;&amp;#039;&amp;#039;: l&amp;#039;accès direct à la mémoire à distance sur &amp;#039;&amp;#039;Ethernet&amp;#039;&amp;#039; convergent ou [https://en.wikipedia.org/wiki/RDMA_over_Converged_Ethernet RDMA over Converged Ethernet] est un protocole de niveau 2 &amp;#039;&amp;#039;OSI&amp;#039;&amp;#039; permettant l&amp;#039;accès direct à la mémoire à distance (&amp;#039;&amp;#039;RDMA&amp;#039;&amp;#039;) sur un réseau Ethernet. Cette opération est rendue possible en encapsulant une trame de transport &amp;#039;&amp;#039;Infiniband&amp;#039;&amp;#039; sur l&amp;#039;&amp;#039;&amp;#039;Ethernet&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sous système&amp;#039;&amp;#039;&amp;#039;: un sous système &amp;#039;&amp;#039;NVM&amp;#039;&amp;#039; (&amp;#039;&amp;#039;subsystem&amp;#039;&amp;#039;), est un groupe définissant les paramètres du partage &amp;#039;&amp;#039;NVMe&amp;#039;&amp;#039; (contrôleur, port, type d&amp;#039;interface, espace de nom...). C&amp;#039;est l&amp;#039;ensemble de la configuration pour un &amp;#039;&amp;#039;SSD&amp;#039;&amp;#039; donné. Il y a donc un sous système par disque à partager en &amp;#039;&amp;#039;NVMe-oF&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Espace de noms&amp;#039;&amp;#039;&amp;#039;: la notion d&amp;#039;[https://nvmexpress.org/resources/nvm-express-technology-features/nvme-namespaces/ espaces de noms NVMe] (à ne pas confondre avec les [https://en.wikipedia.org/wiki/Linux_namespaces espaces de noms Linux]) permet d&amp;#039;adresser un ensemble de blocs logiques dans un groupe accessible au logiciel hôte (pilote &amp;#039;&amp;#039;NVMe&amp;#039;&amp;#039;). Elle présente au système une décomposition du support de stockage en autant de volume que d&amp;#039;espaces définis. Cela permet de segmenter un &amp;#039;&amp;#039;SSD&amp;#039;&amp;#039; afin d&amp;#039;en réserver des fractions pour divers usages comme l&amp;#039;isolation logique, le [https://fr.wikipedia.org/wiki/Multi-tenant multi-tenant], l&amp;#039;isolation de sécurité (chiffrement par espace de noms), la protection en écriture d&amp;#039;un espace de noms à des fins de récupération ou encore le [https://www.kingston.com/france/fr/ssd/overprovisioning sur-provisionnement] (pour améliorer les performances et l&amp;#039;endurance en écriture). Sous Linux, ils apparaissent chacun avec un identifiant unique dans les périphériques. Par exemple, &amp;#039;&amp;#039;/dev/nvme0n1&amp;#039;&amp;#039; concerne le contrôleur &amp;#039;&amp;#039;0&amp;#039;&amp;#039; et l&amp;#039;espace de noms &amp;#039;&amp;#039;1&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
=Partie serveur=&lt;br /&gt;
Le serveur est également appelé &amp;quot;cible&amp;quot; (&amp;#039;&amp;#039;target&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
==Mise en œuvre==&lt;br /&gt;
Une cible &amp;#039;&amp;#039;NVMe-oF&amp;#039;&amp;#039; se configure en créant un sous système lié à un &amp;#039;&amp;#039;SSD&amp;#039;&amp;#039;. En plus du module noyau gérant le &amp;#039;&amp;#039;NVMe&amp;#039;&amp;#039; (chargé de base), il faudra activer celui gérant le sujet de cette documentation.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Activation des modules noyau&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 modprobe nvmet-rdma&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Note: le module gérant le NVMe s&amp;#039;active avec la commande &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;modprobe nvme&amp;lt;/source&amp;gt; si celui ci n&amp;#039;est pas chargé automatiquement.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Création d&amp;#039;un sous système&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 mkdir /sys/noyau/config/nvmet/subsystems/toto&lt;br /&gt;
 echo 1 &amp;gt; /sys/noyau/config/nvmet/subsystems/toto/attr_allow_any_host&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Création de l&amp;#039;espace de noms dans le sous système&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 mkdir /sys/noyau/config/nvmet/subsystems/toto/namespaces/1&lt;br /&gt;
 echo -n /dev/nvme0n1 &amp;gt; /sys/noyau/config/nvmet/subsystems/toto/namespaces/1/device_path&lt;br /&gt;
 echo 1 &amp;gt; /sys/noyau/config/nvmet/subsystems/toto/namespaces/1/enable&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Arborescence à ce stade&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 tree /sys/noyau/config/nvmet/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/sys/noyau/config/nvmet/&lt;br /&gt;
├── hosts&lt;br /&gt;
├── ports&lt;br /&gt;
└── subsystems&lt;br /&gt;
    └── toto&lt;br /&gt;
        ├── allowed_hosts&lt;br /&gt;
        ├── attr_allow_any_host&lt;br /&gt;
        ├── attr_serial&lt;br /&gt;
        ├── attr_version&lt;br /&gt;
        └── namespaces&lt;br /&gt;
            └── 1&lt;br /&gt;
                ├── ana_grpid&lt;br /&gt;
                ├── buffered_io&lt;br /&gt;
                ├── device_nguid&lt;br /&gt;
                ├── device_path&lt;br /&gt;
                ├── device_uuid&lt;br /&gt;
                └── enable&lt;br /&gt;
&lt;br /&gt;
7 répertoires, 9 fichiers&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Création d&amp;#039;un port&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Cette étape permet de définir les paramètres de connexion à la cible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir /sys/noyau/config/nvmet/ports/1&lt;br /&gt;
echo &amp;quot;ipv4&amp;quot; &amp;gt; /sys/noyau/config/nvmet/ports/1/addr_adrfam&lt;br /&gt;
echo &amp;quot;rdma&amp;quot; &amp;gt; /sys/noyau/config/nvmet/ports/1/addr_trtype&lt;br /&gt;
# Adresse du serveur&lt;br /&gt;
echo 192.168.1.32 &amp;gt; /sys/noyau/config/nvmet/ports/1/addr_traddr&lt;br /&gt;
echo 4420 &amp;gt; /sys/noyau/config/nvmet/ports/1/addr_trsvcid&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Activation du partage&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 ln -s /sys/noyau/config/nvmet/subsystems/toto/ /sys/noyau/config/nvmet/ports/1/subsystems/&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Note: pour désactiver momentanément le partage, il suffit de supprimer ce lien.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Arborescence à ce stade&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 tree /sys/noyau/config/nvmet/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/sys/noyau/config/nvmet/&lt;br /&gt;
├── hosts&lt;br /&gt;
├── ports&lt;br /&gt;
│   └── 1&lt;br /&gt;
│       ├── addr_adrfam&lt;br /&gt;
│       ├── addr_traddr&lt;br /&gt;
│       ├── addr_treq&lt;br /&gt;
│       ├── addr_trsvcid&lt;br /&gt;
│       ├── addr_trtype&lt;br /&gt;
│       ├── ana_groups&lt;br /&gt;
│       │   └── 1&lt;br /&gt;
│       │       └── ana_state&lt;br /&gt;
│       ├── param_inline_data_size&lt;br /&gt;
│       ├── referrals&lt;br /&gt;
│       └── subsystems&lt;br /&gt;
│           └── toto -&amp;gt; ../../../../nvmet/subsystems/toto&lt;br /&gt;
└── subsystems&lt;br /&gt;
    └── toto&lt;br /&gt;
        ├── allowed_hosts&lt;br /&gt;
        ├── attr_allow_any_host&lt;br /&gt;
        ├── attr_serial&lt;br /&gt;
        ├── attr_version&lt;br /&gt;
        └── namespaces&lt;br /&gt;
            └── 1&lt;br /&gt;
                ├── ana_grpid&lt;br /&gt;
                ├── buffered_io&lt;br /&gt;
                ├── device_nguid&lt;br /&gt;
                ├── device_path&lt;br /&gt;
                ├── device_uuid&lt;br /&gt;
                └── enable&lt;br /&gt;
&lt;br /&gt;
13 répertoires, 16 fichiers&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le volume est acccible via le réseau.&lt;br /&gt;
&lt;br /&gt;
==Suppression du sous système==&lt;br /&gt;
Pour revenir à l&amp;#039;état initial et donc supprimer notre sous système, il faut effectuer les quelques étapes suivantes:&lt;br /&gt;
&lt;br /&gt;
 rm -f /sys/noyau/config/nvmet/ports/1/subsystems/toto&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Note: il ne faut surtout pas mettre le dernier &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;/&amp;lt;/source&amp;gt; à la fin du répertoire &amp;quot;toto&amp;quot; sinon la commande &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;rm&amp;lt;/source&amp;gt; refusera de le supprimer. De plus, le paramètre &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;-r&amp;lt;/source&amp;gt; ne doit pas être précisé car le noyau l&amp;#039;interdit.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 rmdir /sys/noyau/config/nvmet/ports/1/&lt;br /&gt;
 rmdir /sys/noyau/config/nvmet/subsystems/toto/namespaces/1/&lt;br /&gt;
 rmdir /sys/noyau/config/nvmet/subsystems/toto/&lt;br /&gt;
&lt;br /&gt;
Le déchargement du module noyau peut se faire de la façon suivante mais se fera de toute façon au redémarrage:&lt;br /&gt;
&lt;br /&gt;
 rmmod nvmet-rdma&lt;br /&gt;
&lt;br /&gt;
Il ne reste plus aucune trace de notre partage.&lt;br /&gt;
&lt;br /&gt;
=Partie cliente=&lt;br /&gt;
Le client est aussi appelé &amp;quot;initiateur&amp;quot; (&amp;#039;&amp;#039;initiator&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
==Connexion à la cible==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Activation du module et installation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d&amp;#039;activer le module noyau suivant:&lt;br /&gt;
 modprobe nvme-rdma&lt;br /&gt;
&lt;br /&gt;
et d&amp;#039;installer le paquet permettant la gestion du &amp;#039;&amp;#039;NVMe&amp;#039;&amp;#039;:&lt;br /&gt;
 apt install nvme-cli&lt;br /&gt;
&lt;br /&gt;
Pour voir les périphériques &amp;#039;&amp;#039;NVMe&amp;#039;&amp;#039; reconnus pas le système:&lt;br /&gt;
 nvme list&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Note: le disque partage n’apparaît pas.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Connexion à la cible&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 nvme connect -t rdma -a 192.168.1.32 -s 4420 -n toto&lt;br /&gt;
&lt;br /&gt;
Un nouveau listage montre le disque fraîchement ajouté:&lt;br /&gt;
 nvme list&lt;br /&gt;
&lt;br /&gt;
Il est visible et utilisable au niveau blocs comme s&amp;#039;il était branché directement à la carte mère:&lt;br /&gt;
 lsblk&lt;br /&gt;
&lt;br /&gt;
==Déconnexion de la cible==&lt;br /&gt;
 nvme disconnect -n toto&lt;br /&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
 nvme disconnect -d /dev/nvme0n1&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* Vidéo de la [https://academy.mellanox.com/en/videos/ Mellanox Academy] sur le sujet: https://vimeo.com/222075518 mise en cache [https://{{SERVERNAME}}/fichiers/réseaux/rdma/nvme-of/NVMe-oF_Configuration.mp4 ici]&lt;br /&gt;
* Documentation de [https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/8/html/ Red Hat]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/pdf/managing_storage_devices/managing-storage-devices.pdf mise en cache [https://{{SERVERNAME}}/fichiers/réseaux/rdma/nvme-of/Red_Hat_Enterprise_Linux-8-Managing_storage_devices-en-US.pdf ici]&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
</feed>