Activer le SR-IOV sur Proxmox VE

Nous allons voir comment activer les fonctionnalités SR-IOV d'une carte réseau sur Proxmox VE.

Activer le SR-IOV sur Proxmox VE
pve proxmox proxmoxve sriov

Au sommaire :

  • 1-Qu'est-ce que le SR-IOV ?
  • 2-Prérequis
  • 3-Configuration
  • 4-Mon cas d'usage

1-Qu'est-ce que le SR-IOV ?

Single Root IOV ou SR-IOV est une spécification qui permet de partager les ressources d’un adaptateur d’entrées/sorties entre plusieurs machines virtuelles au sein d’un même serveur. Elle fait parti d'un ensemble de spécifications baptisées PCI-IOV, définies par le groupe de standardisation PCI (PCI-SIG).

Que signifie Single-Root IOV (SR-IOV)? - Definition IT de Whatis.fr
Single Root IOV ou SRIOV est une spcification qui permet de partager les ressources dun adaptateur dentressorties entre plusieurs machines virtuelles au...

2-Prérequis

Un serveur Proxmox VE et une carte réseau compatible avec cette spécification. Pour les besoins de ce tutoriel, je vais utiliser une carte réseau Intel 82576EB.

Contrôleur Gigabit Ethernet Intel® 82576EB - Caractéristiques du produit | Intel
Contrôleur Gigabit Ethernet Intel® 82576EB référence rapide avec les spécifications, les fonctionnalités et les technologies.

C'est une carte qu'on peut trouver sur Aliexpress et qui est sorti en 2008. je l'ai eu à moins de 15 euros en 2020 mais malheureusement elle à vu son prix doublé entre temps.

34.65€ 9% de réduction|Carte réseau Intel 82576EB, 1000M, PCIE, Gigabit Ethernet, RJ45 Lan, 2 Ports | AliExpress
Achetez malin, vivez mieux! Aliexpress.com

3-Configuration

Dans le terminal de PVE, localisez le périphérique avec la commande lspci (list pci).

root@pve02:~# lspci -v

Une longue liste de périphériques apparaît. Vous remarquerez deux choses :

  • À la troisième ligne en partant du bas, la carte à comme fonctionnalité le SR-IOV,
  • Le pilote utilisé se nomme "igb",

Éditez le fichier /etc/default/grub et ajoutez la la ligne "quiet intel_iommu=on iommu=pt pci=assign-busses".

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pci=assign-busses"

Puis mettez à jour le grub.

root@pve02:~# update-grub

Éditer le fichier /etc/modules et ajoutez les modules noyaux suivants pour qu'ils soient chargés au démarrage de Proxmox VE.

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Appliquez les modifications puis redémarrez le serveur.

root@pve02:~# update-initramfs -u -k all

Ensuite, créez un service nommé "sriov-NIC.service" pour pouvoir à chaque démarrage :

  • Passer le nombre de vf ((vf pour virtual functions) de 0 à 7 dans "sriov_numfs"
  • Fixer les adresses MAC des vf,
root@pve02:~# nano /etc/systemd/system/sriov-NIC.service

Ajoutez le contenu suivant en modifiant les éléments représentés par des <> selon votre configuration.

[Unit]
Description=Script to enable SR-IOV on boot

[Service]
Type=oneshot
# Starting SR-IOV
ExecStart=/usr/bin/bash -c '/usr/bin/echo <number_of_vf> > /sys/class/net/<nic_interface>/device/sriov_numvfs'
ExecStart=/usr/bin/bash -c '/usr/bin/echo <number_of_vf> > /sys/class/net/<nic_interface>/device/sriov_numvfs'
# Setting static MAC for VFs
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set <nic_interface> vf <vf_number> mac <vf_mac>'

[Install]
WantedBy=multi-user.target

Je vous donne ma configuration comme exemple. J'ai une carte réseau, deux ports physique (enp3s0f0 et enp3s0f1) et 14 vf ( (7 par port).

  • <number_of_vf> représente le nombre de vf que vous pouvez activé par port physique,
  • <nic_interface> représente l'interface réseau physique (le port),
  • <vf_number> représente le numéro de la vf (fixation de l'adresse MAC),
  • <vf_mac> représente l'adresse MAC à fixer pour la vf,

Pour trouver les adresses MAC des vf, tapez dans votre terminal la commande "ip link".

  • Activez le service,
  • Démarrez le service,
  • Et vérifiez le statut du service,
root@pve02:~# systemctl enable sriov-NIC
root@pve02:~# systemctl start sriov-NIC
root@pve02:~# systemctl status sriov-NIC

Et voilà le résultat!

Pour finir, dans /etc/network/interfaces, vous devriez trouver vos interfaces réseaux.

Ajoutez au dessus de chaque interface la ligne suivante pour que l'activation au démarrage soit automatique.

auto <vf_interface>

Cela devrait ressembler à ceci.

Redémarrez le service "networking".

root@pve02:~# systemctl restart networking.service

Vérifiez le résultat dans l'interface web. Les interfaces sont toutes en statut "autostart".

4-Mon cas d'usage

J'ai un pfSense virtualisé qui utilise les ponts vmbr1 (enp3s0f0) et vmbr2 (enp3s0f1).

J'ai tout les bénéfices de la para-virtualisation avec VirtIO comme l'usage des switch virtuels Linux Bridge et Open vSwitch avec de gros débits en interne mais aussi les inconvénients comme le déchargement matériel sur le processeur qui gère le trafic réseau à la place des cartes réseaux physique.

Les ponts utilisent donc les interfaces réseaux physique enp3s0f0 et enp3s0f1 et les machines virtuelles connectés à ces ponts sont gérés par le routeur/pare-feu virtualisé.

J'ai tout les bénéfices des SDN en soit.

Mais je peux également créer un deuxième routeur/pare-feu pfSense avec deux interfaces réseaux virtuelles comme enp3s0f0v0 (port physique enp3s0f0) pour le WAN et enp3s0f1v0 (port physique enp3s0f1) pour le LAN qui se comporte littéralement comme un véritable routeur/pare-feu physique.

Pourquoi ? Parce qu'avec SR-IOV, j'ai les bénéfices du PCI passthrough sans les inconvénients car :

  • J'ai un accès direct au périphérique physique sans passer par l'émulation ou la para-virtualisation,
  • Les performances sont supérieures,
  • C'est le périphérique physique qui gère le trafic réseau et non le processeur du serveur comme avec VirtIO,
  • Cela soulage le processeur au cas où j'utilise trop VirtIO,
  • Le périphérique physique reste toujours disponible pour d'autres machines virtuelles contrairement au PCI passthrough,

Par contre je perd l'usage des switch virtuels Linux Bridge et Open vSwitch.

Avec tout ça, il me reste encore 12 interfaces réseaux virtuelles à utiliser pour chaque machine virtuelle par exemple (c'est pas compatible avec les conteneurs).