Proxmox VE 7.0 : comment ajouter du stockage via NVMe/TCP

À quand les baies full flash abordables ?

Un serveur permettant de virtualiser des systèmes peut embarquer des périphériques de stockage, mais ce n'est pas toujours le cas ou ils ne sont pas toujours assez nombreux. Il est donc courant d'en ajouter via le réseau et iSCSI. Mais comment faire de même avec NVMe/TCP ? Faisons le test avec Proxmox VE 7.0.

Qu'il s'agisse d'un petit serveur personnel, d'un « Home Lab » ou d'une installation professionnelle, la virtualisation exige des ressources diverses et parfois nombreuses. En effet, il faut avoir assez de cœurs CPU, de mémoire, de périphériques mais aussi de stockage pour équiper l'ensemble des machines virtuelles (VM).

NVMe/TCP : ajoutez des SSD PCIe distants à vos serveurs

Certaines sont forcément locales comme le CPU ou la mémoire (pour le moment), d'autres peuvent déjà être déportées sur le réseau comme le stockage. Historiquement, tous les hyperviseurs permettent de gérer différents « datastore », des HDD/SSD où l'on place les images système des VM, parfois depuis un partage réseau local. 

Pour des raisons de performances et de simplicité, iSCSI est très utilisé. Il s'agit d'un protocole réseau en mode bloc, permettant de mettre à disposition un périphérique de stockage sur le réseau, de l'ajouter à votre hyperviseur et de le gérer comme s'il s'agissait d'un composant local. Dans le monde professionnel, certains ont également recours à des technologies plus avancées telles que Ceph, qui dispose de son propre block storage (RBD).

Mais lorsque l'on veut profiter des débits élevés de SSD PCIe (NVMe), on passe le plus souvent par NVMe-oF. Une solution qui nécessitait encore récemment du matériel coûteux et était donc réservée aux entreprises. Mais cela n'est plus le cas via NVMe/TCP qui est accessible à tous, géré par de nombreuses distributions Linux

Nous avons donc tenté notre chance avec notre serveur HPE ProLiant DL365 Gen10 Plus v2 sous Proxmox VE 7.0.

Proxmox VE 7.0 : NVMe/TCP géré, mais pas via l'interface

Ce système peut utiliser de nombreuses solutions de stockage distantes. Dans la section Storage du « Datacenter » on peut ainsi ajouter des partages CIFS/Samba, NFS, mais aussi des périphériques via iSCSI, dont ZFS/iSCSI :

Proxmox Datastore

Mais comme vous pouvez le voir dans la capture ci-dessus, aucune solution NVMe-oF n'est clairement mise en avant ou proposée, pas plus dans la documentation. Il faut donc passer par le shell du serveur (nommé proxmoxve dans notre cas). S'il est à jour, vous pourrez vérifier que les modules nécessaires sont actifs :

cat /boot/config-`uname -r` | grep NVME

Si c'est le cas vous verrez apparaître les lignes suivantes :

CONFIG_NVME_CORE=m
CONFIG_NVME_TCP=m

Il suffit ensuite de les charger et d'installer l'outil de gestion des périphériques NVMe (retirez sudo si vous êtes root) :

sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove
sudo apt install nvme-cli

sudo modprobe nvme
sudo modprobe nvme-tcp

Pour vérifier que tout fonctionne tapez la commande suivante :

sudo nvme list

Connexion aux SSD PCIe (NVMe)

Vous verrez apparaître la liste des SSD PCIe (NVMe) de votre machine. Elle sera vide si vous n'en avez pas. Pour la suite, lancez le serveur contenant vos SSD PCIe (NVMe) et partagez-les sur le réseau via NVMe/TCP. Nous ne reviendrons pas sur ce sujet, qui a déjà fait l'objet d'un article contenant un script facilitant sa mise en place.

Dans notre cas, nous avons monté une machine équipée d'un processeur Ryzen 5 5600X avec 64 Go de mémoire sur une carte mère Gigabyte X570 Aorus Master, le tout fonctionnant sous Debian 11. Une carte Hyper M.2 d'ASUS y est configurée avec quatre SSD Samsung 970 EVO de 256 Go, chacun partagé individuellement via NVMe/TCP.

Nous y avons installé une carte réseau Intel X520-DA2 à 10 Gb/s que l'on trouve pour 150 euros environ, fonctionnant sur un port PCIe 2.0 x8 ou un PCIe 3.0 x4. Une installation permise par l'utilisation d'une carte graphique GeForce GT 710 PCIe 2.0 x1 pour profiter pleinement du  réseau et du PCIe x16 pour nos SSD.

Pour ajouter un SSD via NVMe/TCP, rien de plus simple, une commande suffit :

sudo nvme connect -t tcp -a 192.168.0.42 -s 4420 -n nvme.server.0n1

Si vous voulez simplement vérifier ceux qui sont disponibles depuis un serveur :

sudo nvme discover -t tcp -a 192.168.0.42 -s 4420

Pensez à adapter cette commande à votre IP, port et NQN (le nom qui désigne le SSD sur le réseau). Faites-le autant de fois que vous avez de SSD. Vous pouvez aussi tous les connecter d'un coup :

sudo nvme connect-all -t tcp -a 192.168.0.42 -s 4420

Une fois terminé, vous devriez voir les SSD apparaître :

sudo nvme list
sudo nvme list-subsys

Si vous voulez déconnecter un SSD ou tous ceux qui sont connectés :

sudo nvme disconnect -n nvme.server.0n1
sudo nvme disconnect-all

Gérer les SSD depuis Proxmox VE 7.0

Si tout s'est bien passé, de nouveaux SSD seront visibles dans la section consacrée aux périphériques de stockage du serveur (Disks) dans l'interface de Proxmox VE 7.0. Il pourra être géré comme n'importe quel autre, formaté pour être utilisé individuellement ou dans un pool ZFS, pouvant stocker des images de VM, de conteneurs, ISO, etc.

C'est d'ailleurs tout l'intérêt d'un partage de type bloc comme le permet NVMe/TCP. Mais il y a ici une limite : ces SSD sont considérés comme des périphériques de stockage locaux, mais pas comme des périphériques PCIe locaux. Ainsi, ils ne peuvent pas être ajoutés à une machine virtuelle en passthrough par exemple.

Si c'est ce que vous souhaitiez faire, la solution est simple : connectez le SSD via NVMe/TCP depuis le système de la machine virtuelle. Cela suppose néanmoins qu'il soit compatible et exclut Windows pour le moment. 

NVMe/TCP Proxmox VE 7.0

Automatiser la connexion des SSD au démarrage du système

Bien entendu, ajouter manuellement les SSD à chaque (re)démarrage du serveur peut être fastidieux. La solution est donc d'automatiser cette étape en ajoutant les lignes de commande pour la connexion à un script lancé à chaque fois que Proxmox est initialisé. Pour cela tapez la commande suivante :

sudo nano /etc/rc.local

Cela édite un script qui peut être chargé à chaque démarrage. Il suffit donc d'y ajouter les lignes de connexion (nvme connect -t ...) et enregistrez (CTRL+X). S'il est vide lors de l'édition, c'est qu'il faut le créer de toutes pièces. Il doit ainsi au final ressembler au script suivant à adapter selon vos besoins :

#!/bin/sh -e

modprobe nvme
modprobe nvme-tcp

nvme connect-all -t tcp -a 192.168.0.42 -s 4420

exit 0

Il faut ensuite s'assurer qu'il est bien accessible à l'utilisateur root, gérer ses droits en le rendant exécutable :

sudo chown root:root /etc/rc.local
sudo chmod 700 /etc/rc.local

Si le serveur contenant les SSD est actif, votre serveur de virtualisation s'y connectera à chaque lancement. Vous pouvez aussi très bien placer ces commandes dans un script de votre choix à lancer manuellement. Vous pouvez aussi aller plus loin en développant un service pour systemd afin de pouvoir (dé)connecter vos SSD.

Notez que cette méthode doit fonctionner avec d'autres systèmes et hyperviseurs sur base GNU/Linux.

Vous n'avez pas encore de notification

Page d'accueil
Options d'affichage
Abonné
Actualités
Abonné
Des thèmes sont disponibles :
Thème de baseThème de baseThème sombreThème sombreThème yinyang clairThème yinyang clairThème yinyang sombreThème yinyang sombreThème orange mécanique clairThème orange mécanique clairThème orange mécanique sombreThème orange mécanique sombreThème rose clairThème rose clairThème rose sombreThème rose sombre

Vous n'êtes pas encore INpactien ?

Inscrivez-vous !