Dans une VM Hyper‑V, la propriété FullDuplex
de Get-NetAdapter
reste vide parce que l’interface est virtuelle : il n’y a pas de couche physique à interroger. Voici l’explication complète, les vérifications utiles et les bonnes pratiques.
Contexte du problème
Sur l’hôte Hyper‑V, une carte physique est forcée en 100 Mbit/s – duplex intégral et reliée à un commutateur virtuel externe. Dans la machine virtuelle connectée à ce vSwitch, la commande suivante retourne la vitesse de lien, mais laisse le champ FullDuplex vide ($null
) :
Get-NetAdapter | Select Name, FullDuplex, LinkSpeed
Pourquoi ? Et surtout, faut‑il s’en inquiéter ?
Ce que mesure réellement « FullDuplex »
Le duplex est une caractéristique de couche 1 (physique) : il décrit la capacité d’une liaison Ethernet à transmettre et recevoir simultanément (full) ou alternativement (half). Cette information provient d’une négociation électrique entre deux ports physiques (carte + switch). Elle n’existe tout simplement pas quand l’interface est purement logicielle.
Dans Hyper‑V, l’adaptateur réseau « synthetic » présenté à la VM fonctionne via VMBus et un vSwitch en mémoire. Il n’y a ni fil, ni transceiver, ni collision domain. La pile NDIS de l’invité ne peut donc pas interroger de registre matériel pour le duplex. Résultat : FullDuplex
renvoie $null
par conception.
Pourquoi la vitesse (LinkSpeed) apparaît quand même ?
La propriété LinkSpeed
est un indicateur logique exposé au système invité. Selon les cas :
- Adaptateur synthetic (recommandé) : Windows affiche souvent une valeur élevée (p. ex. 10 Gbps) indiquant un « gros tuyau » virtuel entre la VM et le vSwitch. Cette valeur n’est pas une contrainte dure ; le vrai débit dépend de la CPU, des files (VMQ/vRSS), des politiques QoS, et de la vitesse des cartes physiques côté hôte.
- Adaptateur legacy (émulé) : conçu pour l’amorçage/PXE de VMs génération 1, il se présente comme une vieille carte 100 Mb. Dans ce cas, la VM voit 100 Mb/s. Si vous observez
LinkSpeed = 100 Mb/s
dans la VM, vérifiez d’abord que vous n’utilisez pas un adaptateur legacy. - SR‑IOV ou affectation directe (DDA/PCI passthrough) : la VM manipule alors une fonction matérielle (VF/PF). Elle peut éventuellement exposer un duplex et une vitesse « réels » puisque l’invité parle à un NIC physique.
Tableau synthétique — Pourquoi « FullDuplex » est vide et que faire
Point clé | Explications & bonnes pratiques |
---|---|
Le duplex est une propriété physique | Un vNIC Hyper‑V n’a pas de couche 1 ; l’information duplex n’existe pas. FullDuplex reste $null par design. |
Valeur $null attendue | Sur toutes les VMs Hyper‑V avec adaptateur synthetic (cas standard), FullDuplex est vide ; ce n’est pas un bug. |
Vérification côté hôte | Sur l’hôte, Get-NetAdapter affiche vitesse et duplex des NIC physiques :Get-NetAdapter | Select Name, Status, LinkSpeed, FullDuplex |
Surveillance dans la VM | Fiez‑vous à LinkSpeed comme indicateur logique et utilisez Get-NetAdapterStatistics , PerfMon (« Network Interface\* », « Hyper‑V Virtual Network Adapter\* »), ou des tests (ping, iperf3) pour diagnostiquer. |
Impact sur les performances | L’absence de FullDuplex n’impacte pas le débit. Le vSwitch traite le trafic en mémoire, sans collisions ni négociation duplex. |
Cas SR‑IOV / DDA | Avec SR‑IOV (VF) ou DDA, la VM pilote du matériel ; FullDuplex peut alors être renseigné. Veillez aux pilotes invités (Synthetic + VF) et au firmware du NIC. |
Comment confirmer que l’adaptateur de la VM est « synthetic » ou « legacy »
Depuis l’hôte Hyper‑V :
Get-VMNetworkAdapter -VMName "MaVM" |
Select VMName, Name, IsLegacy, MacAddress, SwitchName
- IsLegacy = True : la VM utilise un adaptateur legacy 100 Mb. Remplacez‑le par un adaptateur Network Adapter (synthetic) pour les performances.
- IsLegacy = False : adaptateur synthetic standard (recommandé).
Vérifier et interpréter la propriété dans PowerShell
Dans la VM :
Get-NetAdapter | Select-Object Name, Status, LinkSpeed, FullDuplex
# Détection explicite du $null :
Get-NetAdapter | ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
LinkSpeed = $_.LinkSpeed
FullDuplex = $(if ($_.FullDuplex -eq $null) { "<NULL>" } else { $_.FullDuplex })
}
}
Sur l’hôte :
# Obtenir duplex et vitesse des cartes physiques
Get-NetAdapter -Physical | Select Name, InterfaceDescription, LinkSpeed, FullDuplex, Status
# Si vous forcez une vitesse/duplex côté hôte :
Get-NetAdapterAdvancedProperty -Name "Intel(R) I219-LM" |
Where-Object DisplayName -match "Speed|Duplex"
Cas particuliers : SR‑IOV, DDA et équipes SET
SR‑IOV (Virtual Functions)
Quand SR‑IOV est activé et supporté (BIOS, NIC, pilote, vSwitch), l’invité reçoit une VF (Virtual Function) qui aboutit directement au NIC physique. Dans ce mode, la VM peut voir une vitesse et un duplex issus du matériel, indépendamment de l’adaptateur synthetic. Commandes utiles côté hôte :
# Capacité SR-IOV du NIC
Get-NetAdapterSriov
# État SR-IOV du vSwitch
Get-VMSwitch | Select Name, IovEnabled
# Poids SR-IOV d'une VM
Get-VMNetworkAdapter -VMName "MaVM" | Select VMName, IovQueuePairsRequested, IovWeight
Bonnes pratiques : mettez à jour le firmware/driver du NIC, laissez auto‑negotiation côté switch physique, et évitez de forcer 100 Mb/s sauf contrainte spécifique.
Discrete Device Assignment (Affectation directe PCIe)
En DDA, une VM pilote entièrement la carte réseau. Elle voit donc les attributs physiques, y compris le duplex. C’est un scénario avancé, qui dédie le NIC à la VM et n’est pas équivalent à un vSwitch.
Switch Embedded Teaming (SET)
Avec SET, plusieurs NIC physiques forment une équipe pour un vSwitch. Les duplex/vitesses restent observables sur chaque NIC physique (Get-NetAdapter
sur l’hôte), pas dans les VMs. SET n’altère pas la visibilité de FullDuplex
dans la VM (toujours $null
pour un vNIC synthetic).
Mesurer ce qui compte : débit, files et latence
Puisque FullDuplex
n’a pas de sens dans une VM, basez vos diagnostics sur des métriques utiles :
- Compteurs PerfMon (dans la VM) : Network Interface\Bytes Total/sec, Output Queue Length. Avec Hyper‑V : Hyper‑V Virtual Network Adapter(*)\Bytes/sec, Packets/sec.
- Statistiques PowerShell :
Get-NetAdapterStatistics -Name "Ethernet"
- Tests synthétiques :
ping
pour la latence,iperf3
pour le débit point‑à‑point (hôte↔VM, VM↔VM, VM↔LAN).
Bonnes pratiques Hyper‑V pour la performance réseau
- Privilégiez l’adaptateur synthetic dans les VMs (remplacez le legacy dès que possible).
- Évitez de forcer 100 Mb/s sur les NICs physiques ; laissez l’auto‑négociation sur des liens modernes (1/10/25/40 Gb).
- Activez et vérifiez vRSS/VMQ (répartition des flux sur plusieurs vCPU) :
Get-NetAdapterVmq Get-NetAdapterRss
- Jumbo frames : n’activez que si l’ensemble du chemin (VM, vSwitch, hôte, switchs, cibles) supporte la MTU élevée. Sinon, risque de fragmentation.
- QoS Hyper‑V : pour plafonner/garantir du débit par vNIC sans vous soucier du duplex :
# Plafond absolu (bits/s) Set-VMNetworkAdapter -VMName "MaVM" -MaximumBandwidth 100000000 # ≈100 Mb/s # Minimum pondéré (1-100) Set-VMNetworkAdapter -VMName "MaVM" -MinimumBandwidthWeight 50 # Minimum absolu (si disponible) Set-VMNetworkAdapter -VMName "MaVM" -MinimumBandwidthAbsolute 50000000
- VLAN & sécurité : utilisez
Set-VMNetworkAdapterVlan
et les ACL du vSwitch au lieu de bricoler des paramètres de duplex inexistants.
Procédure pas‑à‑pas : remplacer un NIC legacy 100 Mb par un NIC synthetic
- Arrêtez la VM.
- Dans Hyper‑V Manager ou PowerShell, ajoutez un Network Adapter (synthetic) relié au même vSwitch.
Add-VMNetworkAdapter -VMName "MaVM" -Name "Prod-Synthetic" -SwitchName "vSwitch-Externe"
- Démarrez la VM, assignez-lui l’adresse IP/réseau de l’ancien NIC.
- Quand le trafic est validé, supprimez l’adaptateur legacy :
Remove-VMNetworkAdapter -VMName "MaVM" -Name "Legacy 100Mb"
- Dans l’invité, nettoyez l’ancienne interface « fantôme » si nécessaire (afficher les périphériques cachés) pour éviter les conflits d’IP.
FAQ — Questions fréquentes
Est‑ce un bug si « FullDuplex » est vide dans ma VM ?
Non. C’est attendu pour les vNICs synthetic Hyper‑V. Le duplex n’existe que pour des supports physiques.
Pourquoi ma VM affiche 100 Mb/s au lieu de 10 Gbps ?
Vous utilisez très probablement un adaptateur legacy. Remplacez‑le par un adaptateur synthetic. Sinon, il se peut que l’outil/driver invité reporte une valeur logique différente ; cela ne bride pas nécessairement le débit réel.
Si l’hôte est limité à 100 Mb/s, ma VM est‑elle bridée ?
Pour le trafic qui sort de l’hôte, oui : vous ne dépasserez pas la vitesse du lien physique. En revanche, VM↔VM sur le même hôte circule dans le vSwitch en mémoire et peut être beaucoup plus rapide.
J’ai activé SR‑IOV, pourquoi « FullDuplex » est toujours vide ?
Vérifiez que la VM consomme bien une VF (et pas seulement le chemin synthetic). Certaines piles/versions affichent encore $null
via Get-NetAdapter
même si le NIC VF opère en full‑duplex ; fiez‑vous alors aux compteurs de la VF ou aux outils du fournisseur.
Puis‑je forcer le duplex dans la VM ?
Non pour les vNICs synthetic : le paramètre n’existe pas. Forcer le duplex n’a de sens que sur un NIC physique ou un périphérique passé en DDA.
Vérifications rapides (copier‑coller)
# Dans la VM : ce champ sera vide par design
Get-NetAdapter | Select Name, LinkSpeed, FullDuplex
# Sur l'hôte : seul l'équipement physique expose le duplex
Get-NetAdapter -Physical | Select Name, LinkSpeed, FullDuplex, Status
# Détecter un NIC legacy dans la VM (depuis l'hôte)
Get-VMNetworkAdapter -VMName "MaVM" | Select VMName, Name, IsLegacy
# Statistiques utiles dans la VM
Get-NetAdapterStatistics -Name "Ethernet"
# État SR-IOV (hôte)
Get-NetAdapterSriov | Select Name, SriovSupport, Enabled
Conseils de dépannage orientés résultats
- Problème de débit perçu : mesurez avec
iperf3
(VM↔hôte, VM↔LAN), observez CPU% de la VM, RSS/VMQ et la saturation des files (PerfMon). Le duplex n’est pas un signal pertinent en VM. - Micro‑coupures : contrôlez les pilotes du NIC physique, l’option d’économie d’énergie (Energy Efficient Ethernet), et la qualité des câbles/switchs en 1/10 GbE auto‑neg.
- Goulot d’étranglement hôte : si plusieurs VMs intensives partagent un unique NIC à 1 Gb ou 100 Mb, attendez‑vous à une contention. Mettez à niveau à 10 GbE, utilisez SET, puis QoS par vNIC.
En savoir plus sur les propriétés avancées (ce qui compte dans une VM)
Certains réglages restent visibles et utiles dans l’invité :
- VLAN ID :
Get-NetAdapterAdvancedProperty -Name "Ethernet" | Where DisplayName -match "VLAN"
- Offloads : LSO/Checksum/RSC peuvent influencer la latence/CPU. Vérifiez :
Get-NetAdapterAdvancedProperty
etGet-NetAdapter
(Hardware Offload Capabilities). - MTU/Jumbo : cohérence de bout‑en‑bout obligatoire.
Résumé actionnable
- Attendu :
FullDuplex
est$null
dans une VM Hyper‑V standard. - Où regarder : pour le duplex, toujours sur l’hôte (NICs physiques).
- Dans la VM : surveillez LinkSpeed comme indicateur logique, et surtout les compteurs de débit/perte/latence.
- Évitez l’adaptateur legacy : utilisez un vNIC synthetic ; ciblez 1/10 GbE auto‑neg côté hôte.
- Besoin de matériel dans la VM ? : envisagez SR‑IOV ou DDA si justifié, avec pilotes à jour.
Exemple complet de contrôle « duplex côté hôte »
# 1) Lister toutes les interfaces physiques avec leur duplex
$phys = Get-NetAdapter -Physical | Select Name, InterfaceDescription, Status, LinkSpeed, FullDuplex
$phys | Format-Table -AutoSize
# 2) Vérifier l'état du vSwitch et le rattachement de la VM
Get-VMSwitch | Select Name, SwitchType
Get-VMNetworkAdapter -VMName "MaVM" | Select VMName, Name, IsLegacy, SwitchName, MacAddress
# 3) (Option) Si besoin, forcer l'auto-négociation côté NIC/switch, pas dans la VM
# -- à adapter selon le fournisseur du NIC --
Get-NetAdapterAdvancedProperty -Name "Intel(R) I219-LM" |
Where-Object DisplayName -match "Speed|Duplex" | Format-Table -AutoSize
Conclusion
L’absence de valeur FullDuplex dans une machine virtuelle Hyper‑V est normale : le duplex appartient au monde physique, alors qu’une VM échange via un vSwitch en mémoire. Pour diagnostiquer et optimiser le réseau en environnement virtuel, concentrez‑vous sur les métriques de débit/latence, les files (vRSS/VMQ), la QoS Hyper‑V, et la configuration des NICs physiques de l’hôte. Si et seulement si vous exposez du matériel à la VM (SR‑IOV/DDA), l’invité pourra retrouver des attributs de duplex ; sinon, $null
est la valeur attendue.
Annexe : mini‑pense‑bête
Get-NetAdapter
dans la VM : FullDuplex =$null
(OK).Get-NetAdapter
sur l’hôte : FullDuplex = True/False (selon la négociation).Get-VMNetworkAdapter
: vérifier IsLegacy et le vSwitch.Get-NetAdapterSriov
: valider SR‑IOV si recherché.- Mesurer : PerfMon,
Get-NetAdapterStatistics
,iperf3
.