<?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-04-17T06:11:42Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.40.0</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 (''NVMe-oF'') est un protocole permettant d'attacher un volume ''NVMe'' (un ''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 (''NVMe-oF'') est un protocole permettant d'attacher un volume ''NVMe'' (un ''SSD PCIe'') via le réseau (à l'image du [[Iscsi|iSCSI]]). Cette technologie a l'avantage, en plus de sa simplicité de mise en service, d'avoir des performances de dingue. En effet, le ''NVMe-of'' s’appuie sur le ''Remote Direct Memory Access'' (''RDMA'') ''over Converged Ethernet'' (''RCoE''). Il encapsule donc des trames ''Infiniband'' sur de l'''Ethernet'' en exploitant les spécificités d'accès direct à la mémoire de l'hôte. Il en résulte des temps d'accès très proche d'une connexion standard au bus ''PCIe'' mais depuis le réseau... Ceci induit toutefois inconvénient d'obliger le recours à un matériel prenant en charge le ''RDMA''. 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'utilise deux ordinateurs équipés d'une carte réseau ''Mellanox Connectx 3'' 10Gbe chacun et connectés par l'intermédiaire d'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 ''LAN''. Le couple ''IP/port'' définit plus loin dans la partie serveur ne sert que d'identifiant à la communication ''Infiniband''. Le protocole ''IP'' n'est jamais utilisé avec ''RDMA'' 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;
* '''NVMe''': [https://fr.wikipedia.org/wiki/NVMe Non-Volatile Memory express] est un protocole réservé aux périphériques de stockage exploitant un bus ''PCI express'' et destiné aux volumes ''Solid State Drive'' (''SSD'') en lieu et place du [https://fr.wikipedia.org/wiki/Serial_ATA Serial Advanced Technology Attachment] (''SATA''). 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;
* '''RDMA''': l'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'un hôte distant sans passer par le noyau de celui-ci (c'est l'adaptateur réseau qui communique avec la mémoire). Les informations n’étant pas copiées entre la mémoire d'application et les tampons de données du système d'exploitation (ainsi que toute fonction comme le pare-feu ou la ''QoS''), une mise en réseau à haut débit et à faible latence est rendue possible&lt;br /&gt;
* '''RCoE''': l'accès direct à la mémoire à distance sur ''Ethernet'' convergent ou [https://en.wikipedia.org/wiki/RDMA_over_Converged_Ethernet RDMA over Converged Ethernet] est un protocole de niveau 2 ''OSI'' permettant l'accès direct à la mémoire à distance (''RDMA'') sur un réseau Ethernet. Cette opération est rendue possible en encapsulant une trame de transport ''Infiniband'' sur l'''Ethernet''.&lt;br /&gt;
* '''Sous système''': un sous système ''NVM'' (''subsystem''), est un groupe définissant les paramètres du partage ''NVMe'' (contrôleur, port, type d'interface, espace de nom...). C'est l'ensemble de la configuration pour un ''SSD'' donné. Il y a donc un sous système par disque à partager en ''NVMe-oF''&lt;br /&gt;
* '''Espace de noms''': la notion d'[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'adresser un ensemble de blocs logiques dans un groupe accessible au logiciel hôte (pilote ''NVMe''). Elle présente au système une décomposition du support de stockage en autant de volume que d'espaces définis. Cela permet de segmenter un ''SSD'' afin d'en réserver des fractions pour divers usages comme l'isolation logique, le [https://fr.wikipedia.org/wiki/Multi-tenant multi-tenant], l'isolation de sécurité (chiffrement par espace de noms), la protection en écriture d'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'endurance en écriture). Sous Linux, ils apparaissent chacun avec un identifiant unique dans les périphériques. Par exemple, ''/dev/nvme0n1'' concerne le contrôleur ''0'' et l'espace de noms ''1'')&lt;br /&gt;
&lt;br /&gt;
=Partie serveur=&lt;br /&gt;
Le serveur est également appelé &amp;quot;cible&amp;quot; (''target'').&lt;br /&gt;
&lt;br /&gt;
==Mise en œuvre==&lt;br /&gt;
Une cible ''NVMe-oF'' se configure en créant un sous système lié à un ''SSD''. En plus du module noyau gérant le ''NVMe'' (chargé de base), il faudra activer celui gérant le sujet de cette documentation.&lt;br /&gt;
&lt;br /&gt;
'''Activation des modules noyau'''&lt;br /&gt;
&lt;br /&gt;
 modprobe nvmet-rdma&lt;br /&gt;
&lt;br /&gt;
''Note: le module gérant le NVMe s'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'est pas chargé automatiquement.''&lt;br /&gt;
&lt;br /&gt;
'''Création d'un sous système'''&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;
'''Création de l'espace de noms dans le sous système'''&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;
'''Arborescence à ce stade'''&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;
'''Création d'un port'''&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;
'''Activation du partage'''&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;
''Note: pour désactiver momentanément le partage, il suffit de supprimer ce lien.''&lt;br /&gt;
&lt;br /&gt;
'''Arborescence à ce stade'''&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'é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;
''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'interdit.''&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; (''initiator'').&lt;br /&gt;
&lt;br /&gt;
==Connexion à la cible==&lt;br /&gt;
'''Activation du module et installation'''&lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'activer le module noyau suivant:&lt;br /&gt;
 modprobe nvme-rdma&lt;br /&gt;
&lt;br /&gt;
et d'installer le paquet permettant la gestion du ''NVMe'':&lt;br /&gt;
 apt install nvme-cli&lt;br /&gt;
&lt;br /&gt;
Pour voir les périphériques ''NVMe'' reconnus pas le système:&lt;br /&gt;
 nvme list&lt;br /&gt;
&lt;br /&gt;
''Note: le disque partage n’apparaît pas.''&lt;br /&gt;
&lt;br /&gt;
'''Connexion à la cible'''&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'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>