Dell Enterprise SONiC et Hyper-V WSFC : iSCSI, MPIO et Cluster Shared Volumes
Article 3/3 — Série déploiement SONiC sur Dell PowerSwitch S5212F-ON
Les switches sont configurés, le cluster network PowerStore est opérationnel, les VLANs iSCSI sont en place. Il est temps de connecter les serveurs Hyper-V au fabric de stockage.
Cet article ferme la boucle : configuration des ports hôtes côté switch, paramétrage iSCSI et MPIO côté Windows, présentation des LUNs depuis PowerStore Manager, et montage des premiers CSV dans le cluster WSFC. On part d'un cluster WSFC existant — la création du cluster n'est pas couverte ici.
Architecture finale

Chaque nœud Hyper-V dispose de deux NICs iSCSI dédiées — une par fabric. Ces NICs ne font pas partie du teaming SET utilisé pour le trafic VM. C'est un point fondamental sur lequel nous reviendrons.
Étape 1 — Configuration des ports hôtes côté switch
Pourquoi des NICs iSCSI dédiées et pas de SET
L'initiateur iSCSI Microsoft opère au niveau du kernel, en dessous du vSwitch Hyper-V. Il ne voit pas les NICs virtuelles d'un teaming SET — il accède directement aux interfaces physiques. Mettre les NICs iSCSI dans un SET provoquerait des conflits de sessions et un comportement MPIO imprévisible.
La règle est absolue : les NICs iSCSI sont des interfaces physiques dédiées, hors de tout teaming.
Ports hôtes sur SW-01 (Fabric A — VLAN 100)
sonic-cli
configure terminal
! HV-NODE01 NIC iSCSI-A
interface Eth 1/5
description HV-NODE01-iSCSI-FabricA
switchport access vlan 100
spanning-tree portfast
mtu 9216
no shutdown
! HV-NODE02 NIC iSCSI-A
interface Eth 1/6
description HV-NODE02-iSCSI-FabricA
switchport access vlan 100
spanning-tree portfast
mtu 9216
no shutdown
end
write memory
Ports hôtes sur SW-02 (Fabric B — VLAN 200)
sonic-cli
configure terminal
! HV-NODE01 NIC iSCSI-B
interface Eth 1/5
description HV-NODE01-iSCSI-FabricB
switchport access vlan 200
spanning-tree portfast
mtu 9216
no shutdown
! HV-NODE02 NIC iSCSI-B
interface Eth 1/6
description HV-NODE02-iSCSI-FabricB
switchport access vlan 200
spanning-tree portfast
mtu 9216
no shutdown
end
write memory
Ports iSCSI data PowerStore
On complète également les ports data de la PowerStore, laissés en suspens dans l'article 2.
Sur SW-01 (Node A → Fabric A) :
sonic-cli
configure terminal
interface Eth 1/3
description PS-NodeA-iSCSI-FabricA
switchport access vlan 100
spanning-tree portfast
mtu 9216
no shutdown
end
write memory
Sur SW-02 (Node B → Fabric B) :
sonic-cli
configure terminal
interface Eth 1/3
description PS-NodeB-iSCSI-FabricB
switchport access vlan 200
spanning-tree portfast
mtu 9216
no shutdown
end
write memory
Jumbo Frames sur les SVIs iSCSI
La MTU doit être cohérente de bout en bout — port physique, SVI, et interface PowerStore. Une incohérence sur un seul segment provoque de la fragmentation silencieuse et effondre les débits sans message d'erreur explicite.
Sur SW-01 et SW-02 :
sonic-cli
configure terminal
interface Vlan 100
mtu 9216
interface Vlan 200
mtu 9216
end
write memory
Sur Enterprise SONiC, la MTU Jumbo est 9216. Côté Windows et PowerStore Manager, on configure 9000 (payload). Les deux sont cohérents — le delta correspond aux headers Ethernet.
Étape 2 — Configuration des NICs iSCSI côté Windows
Toutes les commandes suivantes sont à exécuter en PowerShell administrateur sur chaque nœud Hyper-V.
Identifier les NICs iSCSI
Get-NetAdapter | Sort-Object Name | Format-Table Name, InterfaceDescription, LinkSpeed, Status
Identifiez les deux NICs dédiées à l'iSCSI. Renommez-les explicitement pour éviter toute confusion :
Rename-NetAdapter -Name "Ethernet 3" -NewName "iSCSI-FabricA"
Rename-NetAdapter -Name "Ethernet 4" -NewName "iSCSI-FabricB"
Configurer les adresses IP iSCSI
Les NICs iSCSI ont des adresses sur leurs VLANs respectifs. Pas de gateway sur ces interfaces — le trafic iSCSI reste local au VLAN, pas de routage inter-VLAN souhaité.
# Fabric A — VLAN 100
New-NetIPAddress -InterfaceAlias "iSCSI-FabricA" `
-IPAddress "192.168.10.20" `
-PrefixLength 24
# Fabric B — VLAN 200
New-NetIPAddress -InterfaceAlias "iSCSI-FabricB" `
-IPAddress "192.168.20.20" `
-PrefixLength 24
Adaptez les adresses IP selon votre plan d'adressage. HV-NODE01 utilisera par exemple.20, HV-NODE02 utilisera.21.
Configurer la MTU Jumbo Frames
# MTU 9000 sur les NICs iSCSI (payload, cohérent avec MTU 9216 côté switch)
Set-NetAdapterAdvancedProperty -Name "iSCSI-FabricA" `
-RegistryKeyword "*JumboPacket" -RegistryValue 9014
Set-NetAdapterAdvancedProperty -Name "iSCSI-FabricB" `
-RegistryKeyword "*JumboPacket" -RegistryValue 9014
Désactiver les fonctionnalités inutiles sur les NICs iSCSI
Les NICs iSCSI n'ont pas besoin d'être accessibles depuis l'extérieur. On désactive le Client DNS et la déclaration de route par défaut pour éviter que le trafic de gestion emprunte ces interfaces :
# Désactiver l'enregistrement DNS sur les NICs iSCSI
Set-DnsClient -InterfaceAlias "iSCSI-FabricA" -RegisterThisConnectionsAddress $false
Set-DnsClient -InterfaceAlias "iSCSI-FabricB" -RegisterThisConnectionsAddress $false
# Désactiver NetBIOS sur les NICs iSCSI
$adapters = Get-WmiObject Win32_NetworkAdapterConfiguration |
Where-Object { $_.Description -match "iSCSI" }
foreach ($adapter in $adapters) {
$adapter.SetTcpipNetbios(2)
}
Étape 3 — Installation et configuration de MPIO
Le Multipath I/O (MPIO) est le composant Windows qui gère plusieurs chemins physiques vers un même LUN. Sans MPIO, Windows voit plusieurs disques distincts pour un même LUN — ce qui provoquerait une corruption de données. MPIO consolide ces chemins en un seul disque logique et gère le load balancing et le failover de façon transparente.
Installation de MPIO
# Installation du composant MPIO
Install-WindowsFeature -Name Multipath-IO -IncludeManagementTools
# Vérification
Get-WindowsFeature -Name Multipath-IO
Un redémarrage est requis après l'installation de MPIO.
Déclarer la PowerStore comme matériel supporté
MPIO doit être informé du matériel Dell PowerStore pour appliquer les bons paramètres :
# Ajouter le support PowerStore dans MPIO
New-MSDSMSupportedHW -VendorId "DellEMC" -ProductId "PowerStore"
# Vérification
Get-MSDSMSupportedHW
Paramètres MPIO — Dell PowerStore Best Practices
Dell publie des recommandations précises pour les paramètres MPIO avec PowerStore. Ces valeurs sont critiques pour la stabilité en production — ne pas laisser les valeurs par défaut Windows.
# Délai avant suppression d'un chemin PDO (Path Dead Object)
# Valeur Dell recommandée : 20 secondes
# Défaut Windows : 20 — OK, mais vérifier explicitement
Set-MPIOSetting -NewPDORemovePeriod 20
# Timeout disque — délai avant qu'une I/O soit considérée en erreur
# Valeur Dell recommandée : 30 secondes
Set-MPIOSetting -NewDiskTimeout 30
# Nombre de tentatives sur erreur I/O
# Valeur Dell recommandée : 3
Set-MPIOSetting -NewRetryCount 3
# Intervalle entre les tentatives (secondes)
# Valeur Dell recommandée : 3
Set-MPIOSetting -NewRetryInterval 3
# Activer la récupération de chemin automatique
# Permet à MPIO de retenter les chemins marqués comme morts
Set-MPIOSetting -CustomPathRecovery Enabled
# Intervalle de tentative de récupération des chemins (secondes)
# Valeur Dell recommandée : 10 secondes
Set-MPIOSetting -NewPathRecoveryInterval 10
# Vérification des paramètres appliqués
Get-MPIOSetting
Pourquoi ces valeurs ?
- PDORemovePeriod à 20s : évite qu'un chemin temporairement indisponible soit supprimé trop vite, ce qui forcerait une reconnexion iSCSI complète.
- RetryCount/RetryInterval : en cas d'erreur transitoire (basculement MC-LAG, redémarrage d'un node PowerStore), MPIO retente 3 fois toutes les 3 secondes avant de déclarer l'erreur — soit 9 secondes de tolérance sans impact applicatif.
- CustomPathRecovery à 10s : MPIO sonde les chemins morts toutes les 10 secondes pour les réintégrer dès qu'ils reviennent — indispensable pour un retour rapide après maintenance.
Politique de load balancing
# Appliquer la politique Round Robin sur tous les LUNs PowerStore
# Round Robin distribue les I/O sur tous les chemins actifs
Set-MSDSMGlobalDefaultLoadBalancePolicy -Policy RR
# Vérification
Get-MSDSMGlobalDefaultLoadBalancePolicy
Round Robin est la politique recommandée par Dell pour PowerStore en iSCSI. Elle distribue les I/O équitablement sur tous les chemins actifs et maximise l'utilisation de la bande passante disponible.
Un redémarrage est nécessaire après la configuration MPIO pour que tous les paramètres soient actifs.
Étape 4 — Configuration de l'initiateur iSCSI Windows
Activer le service iSCSI
# Démarrer le service initiateur iSCSI et le configurer en démarrage automatique
Start-Service -Name MSiSCSI
Set-Service -Name MSiSCSI -StartupType Automatic
# Vérification
Get-Service -Name MSiSCSI
Ajouter les portails iSCSI (targets discovery)
Les portails sont les adresses IP des interfaces iSCSI de la PowerStore. On ajoute un portail par fabric, depuis l'interface correspondante.
# Découverte depuis Fabric A (interface iSCSI-FabricA)
# Portail = IP iSCSI Node A sur VLAN 100
New-IscsiTargetPortal -TargetPortalAddress "192.168.10.10" `
-InitiatorPortalAddress "192.168.10.20"
# Découverte depuis Fabric B (interface iSCSI-FabricB)
# Portail = IP iSCSI Node B sur VLAN 200
New-IscsiTargetPortal -TargetPortalAddress "192.168.20.11" `
-InitiatorPortalAddress "192.168.20.20"
# Vérification des portails
Get-IscsiTargetPortal
Découvrir les targets PowerStore
# Lister les targets découverts
Get-IscsiTarget
Vous devriez voir apparaître l'IQN de la PowerStore sous la forme : iqn.1992-04.com.emc:600009700xxxx
Connecter les sessions iSCSI avec MPIO
Chaque nœud doit établir plusieurs sessions iSCSI — une par combinaison initiateur/portail — pour que MPIO dispose de plusieurs chemins. Avec deux fabrics et deux nodes PowerStore, on cible 4 sessions par nœud Hyper-V.
# Récupérer l'IQN du target PowerStore
$target = (Get-IscsiTarget).NodeAddress
# Session 1 : Fabric A → Node A PowerStore
Connect-IscsiTarget -NodeAddress $target `
-TargetPortalAddress "192.168.10.10" `
-InitiatorPortalAddress "192.168.10.20" `
-IsPersistent $true `
-IsMultipathEnabled $true
# Session 2 : Fabric B → Node B PowerStore
Connect-IscsiTarget -NodeAddress $target `
-TargetPortalAddress "192.168.20.11" `
-InitiatorPortalAddress "192.168.20.20" `
-IsPersistent $true `
-IsMultipathEnabled $true
# Vérification des sessions actives
Get-IscsiSession | Format-Table -AutoSize
IsPersistent $true est indispensable — sans ça, les sessions iSCSI ne se reconnectent pas automatiquement après un redémarrage du serveur.Vérifier les chemins MPIO
# Lister tous les disques MPIO et leurs chemins
Get-MSDSMPath
# Vue par disque avec nombre de chemins actifs
mpclaim -s -d
Chaque LUN PowerStore présenté doit afficher 4 chemins — 2 Active/Optimized (chemins directs vers le node propriétaire du LUN) et 2 Active/Non-Optimized (chemins via l'autre node). C'est le signe que MPIO est correctement configuré.
Étape 5 — Présentation des LUNs depuis PowerStore Manager
Cette étape se fait depuis l'interface web PowerStore Manager.
Créer un Host
Dans PowerStore Manager → Compute → Hosts → Add Host :
- Nommez l'hôte (ex :
HV-NODE01) - Sélectionnez le type iSCSI
- Renseignez l'IQN de l'initiateur Windows — récupérable via PowerShell :
# Obtenir l'IQN de l'initiateur local
(Get-InitiatorPort).NodeAddress
- Répétez l'opération pour chaque nœud Hyper-V du cluster
Créer un Host Group (optionnel mais recommandé)
Pour un cluster WSFC, regroupez tous les nœuds dans un Host Group dans PowerStore Manager → Compute → Host Groups. Cela permet de présenter un LUN à tous les nœuds du cluster en une seule opération.
Créer et présenter les volumes
Dans PowerStore Manager → Storage → Volumes → Add Volume :
- Nommez le volume (ex :
CSV-01) - Définissez la taille
- Dans Host Mappings, sélectionnez le Host Group créé précédemment
- Validez — le LUN est immédiatement visible côté Windows
Utilisez une taille d'allocation de 64K lors du formatage NTFS côté Windows — c'est la recommandation Dell pour les LUNs iSCSI utilisés comme CSV.
Étape 6 — Initialisation des disques et création des CSV
Découvrir les nouveaux disques
# Forcer la découverte des nouveaux disques
Update-StorageProviderCache
Update-HostStorageCache
# Lister les disques disponibles
Get-Disk | Where-Object PartitionStyle -eq RAW | Format-Table Number, Size, FriendlyName
Initialiser et formater les disques
# Exemple pour un disque (adapter le numéro selon Get-Disk)
$diskNumber = 1
# Initialiser en GPT
Initialize-Disk -Number $diskNumber -PartitionStyle GPT
# Créer une partition et formater en NTFS avec allocation 64K
New-Partition -DiskNumber $diskNumber -UseMaximumSize -AssignDriveLetter |
Format-Volume -FileSystem NTFS `
-AllocationUnitSize 65536 `
-NewFileSystemLabel "CSV-01" `
-Confirm:$false
NTFS avec allocation 64K est obligatoire pour les CSV. ReFS n'est pas supporté sur les Cluster Shared Volumes en WSFC. C'est une contrainte Microsoft, pas Dell.
Ajouter le disque au cluster WSFC
# Ajouter le disque au cluster (détecté automatiquement si le cluster est actif)
Get-ClusterAvailableDisk | Add-ClusterDisk
Convertir en Cluster Shared Volume
# Lister les disques du cluster
Get-ClusterResource | Where-Object ResourceType -eq "Physical Disk"
# Convertir en CSV
Add-ClusterSharedVolume -Name "Cluster Disk 1"
# Vérification
Get-ClusterSharedVolume
Le CSV est maintenant monté sur tous les nœuds du cluster sous C:\ClusterStorage\Volume1. Il est accessible en lecture/écriture depuis n'importe quel nœud simultanément.
Renommer le point de montage CSV (recommandé)
# Renommer pour plus de lisibilité
(Get-ClusterSharedVolume -Name "Cluster Disk 1").Name = "CSV-01"
Vérifications finales
Connectivité iSCSI et chemins MPIO
# Sessions iSCSI actives
Get-IscsiSession | Select-Object InitiatorPortalAddress, TargetPortalAddress, ConnectionIdentifier
# Chemins MPIO par disque
mpclaim -s -d
# État des CSV
Get-ClusterSharedVolume | Format-Table Name, State, OwnerNode
Test Jumbo Frames de bout en bout
Depuis chaque nœud Hyper-V, testez la MTU vers les adresses iSCSI de la PowerStore :
# Test MTU depuis Fabric A
ping 192.168.10.10 -f -l 8972
# Test MTU depuis Fabric B
ping 192.168.20.11 -f -l 8972
-f interdit la fragmentation, -l 8972 envoie 8972 octets de payload. Si le ping répond sans Packet needs to be fragmented, les Jumbo Frames sont cohérents de bout en bout.
Vérifier l'état dans PowerStore Manager
Dans PowerStore Manager → Storage → Volumes, vérifiez que chaque volume affiche :
- Status : Online
- Host Mappings : tous les nœuds du cluster présents
- I/O : trafic visible en temps réel lors des opérations sur le CSV
Récapitulatif des best practices
| Sujet | Recommandation Dell / Microsoft |
|---|---|
| NICs iSCSI | Dédiées, hors SET, une par fabric |
| MTU | 9216 côté switch SONiC, 9000/9014 côté Windows et PowerStore |
| MPIO PDORemovePeriod | 20 secondes |
| MPIO DiskTimeout | 30 secondes |
| MPIO RetryCount | 3 |
| MPIO RetryInterval | 3 secondes |
| MPIO PathRecoveryInterval | 10 secondes |
| Load balancing policy | Round Robin |
| Sessions iSCSI | 4 sessions par nœud (2 fabrics × 2 nodes PowerStore) |
| Format CSV | NTFS, allocation 64K — ReFS non supporté sur CSV |
| IsPersistent | Toujours $true sur les sessions iSCSI |
| spanning-tree portfast | Obligatoire sur tous les ports hôtes et ports data PowerStore |
Conclusion de la série
En trois articles, nous avons couvert l'intégralité du déploiement :
- Article 1 — Dell Enterprise SONiC : architecture de l'OS, premiers pas CLI, MC-LAG sur deux S5212F-ON
- Article 2 — Dell PowerStore : présentation, cluster network, VLANs iSCSI dual-fabric
- Article 3 — Connexion Hyper-V WSFC : switch, MPIO, initiateur iSCSI, et CSV
Cette stack — SONiC + PowerStore + Hyper-V WSFC — est une architecture datacenter complète, redondante de bout en bout, sans dépendance à des NOS propriétaires. Elle est déployée et validée en production.
Commandes de survie dans un Cluster HV
Les commandes indispensables quand quelque chose ne va pas en production, dans l'ordre logique de diagnostic.
Vérifier les sessions iSCSI actives
Get-IscsiSession | Format-Table -AutoSize
Vérifier les chemins MPIO par disque
mpclaim -s -d
Vérifier l'état des CSV
Get-ClusterSharedVolume | Format-Table Name, State, OwnerNode
Forcer le basculement d'un CSV sur un autre nœud
Move-ClusterSharedVolume -Name "CSV-01" -Node "HV-NODE02"
Remettre un CSV Online
Get-ClusterSharedVolume -Name "CSV-01" | Resume-ClusterResource
Rafraîchir la vue des disques après une reconnexion iSCSI
Update-HostStorageCache
Vérifier les paramètres MPIO appliqués
Get-MPIOSetting
Get-MSDSMGlobalDefaultLoadBalancePolicy
Vérifier l'état des chemins MPIO et la politique de load balancing
mpclaim -s -d
Problèmes rencontrés en production
Sessions iSCSI qui ne se reconnectent pas après reboot
Symptôme : après un redémarrage d'un nœud Hyper-V, les LUNs PowerStore n'apparaissent plus, les CSV sont en état Failed ou Redirected, et Get-IscsiSession ne retourne aucune session active.
Cause : les sessions iSCSI ont été créées avec IsPersistent $false — la valeur par défaut si le paramètre n'est pas explicitement spécifié. Windows ne les recrée pas au démarrage.
Diagnostic :
# Vérifier si des sessions persistantes existent
Get-IscsiSession | Select-Object InitiatorPortalAddress, TargetPortalAddress, IsPersistent
Si IsPersistent affiche False sur toutes les sessions, c'est la cause.
Correction :
# Déconnecter toutes les sessions existantes
Get-IscsiSession | Disconnect-IscsiTarget -Confirm:$false
# Reconnecter en forçant IsPersistent $true
$target = (Get-IscsiTarget).NodeAddress
Connect-IscsiTarget -NodeAddress $target `
-TargetPortalAddress "192.168.10.10" `
-InitiatorPortalAddress "192.168.10.20" `
-IsPersistent $true `
-IsMultipathEnabled $true
Connect-IscsiTarget -NodeAddress $target `
-TargetPortalAddress "192.168.20.11" `
-InitiatorPortalAddress "192.168.20.20" `
-IsPersistent $true `
-IsMultipathEnabled $true
Vérifiez après reboot que les sessions reviennent automatiquement :
Get-IscsiSession | Select-Object InitiatorPortalAddress, TargetPortalAddress, IsPersistent
CSV en état Redirected après un basculement
Symptôme : après une panne ou une maintenance, un ou plusieurs CSV restent en état Redirected dans le Gestionnaire de cluster. Le volume est accessible mais les I/O transitent par le réseau de cluster (LAN) plutôt que directement par iSCSI — les performances sont dégradées et l'état ne revient pas spontanément à Online.
Cause : plusieurs causes possibles, les deux plus fréquentes en environnement iSCSI SONiC :
- Un ou plusieurs chemins MPIO ne sont pas revenus après le basculement — le nœud propriétaire du CSV n'a pas accès direct au LUN
- Le nœud qui a repris ownership du CSV n'a pas encore ses sessions iSCSI complètement rétablies au moment où le cluster tente de monter le volume
Diagnostic :
# État des CSV
Get-ClusterSharedVolume | Format-Table Name, State, OwnerNode
# Vérifier les chemins MPIO sur le nœud propriétaire
mpclaim -s -d
# Vérifier les sessions iSCSI
Get-IscsiSession | Format-Table -AutoSize
Correction :
# Forcer le rafraîchissement du cache de stockage
Update-HostStorageCache
# Attendre quelques secondes puis tenter de remettre le CSV Online
Get-ClusterSharedVolume -Name "CSV-01" | Resume-ClusterResource
# Si le CSV reste Redirected, forcer le basculement vers un autre nœud
Move-ClusterSharedVolume -Name "CSV-01" -Node "HV-NODE02"
Si le problème persiste après ces étapes, vérifiez que CustomPathRecovery est bien activé dans MPIO — c'est lui qui sonde les chemins morts et les réintègre automatiquement :
Get-MPIOSetting | Select-Object CustomPathRecovery, PathRecoveryInterval
# Attendu : CustomPathRecovery = Enabled, PathRecoveryInterval = 10
Testé en production — Enterprise SONiC 4.2 et 4.4 sur Dell PowerSwitch S5212F-ON, PowerStoreOS 4.x, Windows Server 2022 Datacenter en WSFC.