Hyper‑V: por qué Get‑NetAdapter no muestra FullDuplex en una VM (y cómo solucionarlo)

Si en una VM de Hyper‑V ves que Get‑NetAdapter devuelve la velocidad (LinkSpeed) pero deja FullDuplex en blanco, no es un bug. El dúplex pertenece a la NIC física del host; la vNIC no negocia ni expone ese dato. Aquí tienes el porqué y cómo resolverlo de forma correcta.

Índice

Por qué Get‑NetAdapter no muestra FullDuplex en una VM de Hyper‑V

En Hyper‑V, el adaptador de red que ve el sistema invitado es un dispositivo virtual (vNIC). El concepto de “dúplex” es propio de la capa física: la negociación ocurre entre la NIC física del host y el puerto del switch físico. La vNIC no participa en esa negociación ni necesita hacerlo.

  • Propiedad física: FullDuplex describe cómo opera el enlace físico (half o full). En una VM, ese enlace no existe; lo que hay es un vSwitch y memoria compartida.
  • Diseño del driver de vNIC: Por diseño, la propiedad FullDuplex de una vNIC suele venir NULL (sin valor). No indica fallo. El tráfico virtual viaja en colas y anillos de transmisión sin colisiones: se comporta lógicamente como full‑duplex aunque la propiedad no se rellene.
  • LinkSpeed “virtual”: La vNIC sí reporta una velocidad “capacidad” (LinkSpeed). En adaptadores sintéticos de Hyper‑V lo habitual es ver 10 Gbps. En un Legacy Network Adapter la VM suele reportar 100 Mbps, pues emula un NIC 10/100.

Resumen del escenario

Tienes una VM conectada a un conmutador virtual externo de Hyper‑V, el cual está enlazado a una NIC física fijada a 100 Mbps/full‑duplex. Dentro de la VM ejecutas:

Get-NetAdapter | Select Name, FullDuplex, LinkSpeed

El resultado muestra LinkSpeed, pero FullDuplex aparece vacío. Esto es normal en vNICs de Hyper‑V.

Qué hacer paso a paso

Comprueba y gestiona el dúplex en el host

El lugar correcto para validar/ajustar dúplex es la NIC física del host:

# Ver estado en NICs físicas del host
Get-NetAdapter -Physical | Select Name, Status, LinkSpeed, FullDuplex

Localiza propiedades avanzadas relacionadas con velocidad/dúplex

Get-NetAdapterAdvancedProperty -Name "\" |
Where-Object DisplayName -match 'Speed|Duplex'

Si el controlador expone "Speed & Duplex", puedes devolverlo a Auto

Set-NetAdapterAdvancedProperty -Name "\" \`
-DisplayName "Speed & Duplex" -DisplayValue "Auto Negotiation" 

Recomendación: evita fijar manualmente 100/Full salvo que exista un requisito heredado. La práctica recomendada es Auto‑Negotiation en ambos extremos (switch físico y NIC del host). Un extremo en auto y el otro forzado suele terminar en half‑duplex, generando latencias altas y rendimiento pobre.

No intentes leer o forzar FullDuplex dentro de la VM

La vNIC no expone ni permite fijar FullDuplex. Centrarse en ese valor dentro de la VM pierde tiempo de diagnóstico. Supervisa/configura el dúplex en la NIC del host y en el switch físico, que es donde aplica.

Comprueba el tipo de adaptador virtual en la VM

Si dentro de la VM ves LinkSpeed de 100 Mbps, probablemente usas un Legacy Network Adapter; para la mayoría de casos conviene migrar al adaptador sintético (Network Adapter) por rendimiento, RSS, SR‑IOV, VMQ, etc.

# En el host, identifica el tipo de adaptador virtual
Get-VMNetworkAdapter -VMName "<VM>" | Select Name, IsLegacy, SwitchName, MacAddress

Añade un adaptador sintético (mantén la red existente para no perder conectividad hasta migrar)

Add-VMNetworkAdapter -VMName "\" -Name "vNIC-Sintetica" -SwitchName "\"

(Opcional) Elimina el adaptador heredado una vez migrado

Remove-VMNetworkAdapter -VMName "\" -Name "Adaptador de red heredado" 

El adaptador sintético generalmente reporta 10 Gbps como capacidad virtual de la vNIC; seguirá sin exponer FullDuplex, pero maximiza prestaciones.

Audita el estado físico desde la VM (remotamente)

Si necesitas consultar el estado físico desde la VM, hazlo contra el host mediante PowerShell Remoting o tu herramienta de monitorización:

# Desde la VM, abre una sesión remota al host (se requieren WinRM/credenciales)
Enter-PSSession -ComputerName "<NombreHost>"

Ya en el host remoto:

Get-NetAdapter -Physical | Select Name, Status, LinkSpeed, FullDuplex
Get-NetAdapterAdvancedProperty -Name "\" |
Where-Object DisplayName -match 'Speed|Duplex'

Sal de la sesión

Exit-PSSession 

Tabla de referencia rápida

Tipo de adaptador en la VMValor típico de LinkSpeedFullDuplex visible en la VMNotas
Sintético (Network Adapter)10 Gbps (capacidad virtual)NULL (no aplica)Mejor rendimiento; soporta VMQ/RSS/SR‑IOV; sin colisiones.
Heredado (Legacy Network Adapter)100 MbpsNULL (no aplica)Sólo para PXE/compatibilidad; usar sintético siempre que sea posible.
SR‑IOV (Virtual Function)Depende del VF/driverNormalmente no expuestoLa VM usa una función virtual de la NIC física; el dúplex se negocia en el host.

Indicadores de que hay un problema real

Aunque FullDuplex en blanco no es un problema, sí lo es un desajuste físico o un enlace degradado. Señales y cómo comprobarlas:

  • Rendimiento pobre o latencia inusual en varias VMs que comparten la misma NIC física del host.
  • Contadores de errores en la NIC física: Get-NetAdapterStatistics -Name "<NIC_física>" | Format-List Revisa “Received/Outbound Errors/Discarded”.
  • Colas largas en el host: Get-Counter '\Network Interface(*)\Output Queue Length' | Select -ExpandProperty CounterSamples | Select InstanceName, CookedValue
  • Down/Up frecuentes en el enlace físico (eventos del sistema en el host).

Buenas prácticas para evitar cuellos de botella

  • Auto‑Negotiation en ambos extremos: NIC del host y puerto del switch deben coincidir. Si el switch está en 100/Full, fija igual la NIC del host; si el switch está en auto, pon la NIC en auto. Mezclar forzado y auto suele forzar half‑duplex en el extremo en auto.
  • Prefiere adaptadores sintéticos: Reserva el Legacy para escenarios de arranque PXE o SOs muy antiguos.
  • Actualiza drivers y firmware: Un driver antiguo puede ocultar o renombrar propiedades (p. ej. “Speed & Duplex”) y afectar autonegociación.
  • Considera SR‑IOV o vNICs aceleradas si la carga lo permite, manteniendo el control del dúplex en el plano físico.
  • Evita fijar 100/Full como “solución rápida”: hoy sólo tiene sentido por restricciones de hardware heredado. Si lo haces, documenta y alinea el switch.

Mapa mental: qué parámetro mirar y dónde

ParámetroDónde se mideComando útilInterpretación
Dúplex (full/half)NIC física del host / switch físicoGet-NetAdapter -Physical | Select Name, FullDuplexDebe ser Full si ambos extremos coinciden; en la VM no aplica.
Velocidad del enlace físicoNIC física del hostGet-NetAdapter -Physical | Select Name, LinkSpeedDebe corresponder a la configuración/negociación real del puerto.
Capacidad virtual de vNICDentro de la VMGet-NetAdapter | Select Name, LinkSpeedIndicativa (10 Gbps en sintético, 100 Mbps en legado).
Errores/descartesNIC física del hostGet-NetAdapterStatisticsValores elevados sugieren desajuste o cableado/puerto defectuoso.

Playbook de diagnóstico express

  1. En el host: Get-NetAdapter -Physical y confirma Status, LinkSpeed, FullDuplex.
  2. En el switch físico: comprueba el puerto del host. ¿Auto/Auto? ¿Forzado/Forzado? Alinea extremos.
  3. Drivers/firmware: actualiza si hay dudas; revisa propiedades avanzadas (E.g. EEE, Green Ethernet) que puedan interferir.
  4. En la VM: cambia a adaptador sintético si usas el legado y necesitas rendimiento.
  5. Mide: transfieres un archivo grande (SMB) y observa CPU/IO/Red. Usa Get-NetAdapterStatistics en el host para ver si hay errores.

Script de auditoría para tu entorno

Este script recopila información clave del host y de las VMs para acelerar el diagnóstico.

# Auditoría de red en Hyper-V: host + VMs
Ejecutar en el host de Hyper-V con permisos de administrador.

\$hostNics = Get-NetAdapter -Physical | Select-Object Name, InterfaceDescription, Status, LinkSpeed, FullDuplex

\$vSwitches = Get-VMSwitch | Select-Object Name, SwitchType, NetAdapterInterfaceDescription

\$vmNics = Get-VM | ForEach-Object {
\$vmName = $\_.Name
Get-VMNetworkAdapter -VMName \$vmName | Select-Object @{
n='VM'; e={\$vmName}
}, Name, IsLegacy, SwitchName, MacAddress
}

Write-Host '=== NICs Físicas del Host ===' -ForegroundColor Cyan
\$hostNics | Format-Table -AutoSize

Write-Host "\`n=== vSwitches ===" -ForegroundColor Cyan
\$vSwitches | Format-Table -AutoSize

Write-Host "\`n=== Adaptadores de Red por VM ===" -ForegroundColor Cyan
\$vmNics | Format-Table -AutoSize

Resumen breve por si se detecta desajuste

\$warnings = @()

foreach (\$nic in \$hostNics) {
if (\$nic.Status -ne 'Up') { \$warnings += "NIC \$(\$nic.Name) no está 'Up'." }
if (\$nic.FullDuplex -ne \$true) { \$warnings += "NIC \$(\$nic.Name) no está en FullDuplex (verifica switch/negociación)." }
}

if (\$warnings.Count) {
Write-Host "`n=== Advertencias ===" -ForegroundColor Yellow
    $warnings | ForEach-Object { Write-Host "- $_" -ForegroundColor Yellow }
} else {
    Write-Host "`nSin advertencias evidentes de dúplex/estado en las NICs físicas." -ForegroundColor Green
} 

Preguntas frecuentes

¿Puedo forzar FullDuplex dentro de la VM?

No. Es un parámetro físico. La vNIC no ofrece control ni lectura de ese ajuste.

¿Por qué mi VM muestra 100 Mbps de LinkSpeed?

Porque probablemente usa un Legacy Network Adapter. Cambia a un adaptador sintético para mejorar prestaciones. El valor de 100 Mbps no significa que la NIC del host esté en 100 Mbps; sólo refleja la emulación de la vNIC heredada.

Con SR‑IOV, ¿la VM verá el dúplex?

SR‑IOV asigna una función virtual de la NIC a la VM. Aunque la latencia y el rendimiento mejoran, el dúplex sigue siendo una característica del enlace físico de la NIC con el switch; típicamente no se expone como propiedad en la VM.

¿Cómo detecto un desajuste half‑duplex real?

Mira la NIC física del host y el switch. Si uno está forzado y el otro en auto, o si hay una mala negociación, verás errores/descartes y rendimiento pobre. Ajusta ambos extremos de forma coherente, idealmente en auto‑negociación.

Ejemplos de comprobaciones útiles

# Host: estado/dúplex/velocidad
Get-NetAdapter -Physical | Select Name, Status, LinkSpeed, FullDuplex | Format-Table -AutoSize

Host: propiedades del driver relacionadas con Speed/Duplex (cadena puede variar por fabricante)

Get-NetAdapterAdvancedProperty -Name "\" |
Where-Object DisplayName -match 'Speed|Duplex' |
Sort-Object DisplayName |
Format-Table -AutoSize

Host: contadores de red clave

Get-NetAdapterStatistics -Name "\"
Get-Counter '\Network Interface(*)\Packets Received Errors'
Get-Counter '\Network Interface(*)\Packets Outbound Errors'
Get-Counter '\Network Interface(\*)\Output Queue Length'

VM: tipo de adaptador (identifica si es Legacy)

Get-VMNetworkAdapter -VMName "\" | Select Name, IsLegacy, SwitchName 

Errores comunes y cómo evitarlos

  • Interpretar FullDuplex vacío como una avería de la VM: en vNICs es normal. Concéntrate en la NIC del host.
  • Forzar 100/Full “para estabilizar”: en redes modernas suele empeorar la situación si no alineas ambos extremos; además reduces el techo de rendimiento de todas las VMs que compartan esa NIC.
  • Olvidar el tipo de vNIC: el adaptador legado limita prestaciones y carece de aceleraciones. Usa sintético siempre que sea posible.
  • No revisar el switch físico: cuando se cambian políticas (p. ej., habilitar EEE/Green o limitar velocidades), la NIC del host puede renegociar de forma inesperada.

Conclusión

Que Get‑NetAdapter muestre LinkSpeed pero no FullDuplex en una VM de Hyper‑V es el comportamiento esperado: el dúplex pertenece a la capa física, no a la vNIC. La solución no está en la VM, sino en auditar y alinear la NIC del host y el switch físico, preferir adaptadores sintéticos, y mantener la negociación automática como norma. Con los comandos y el playbook anteriores podrás validar el estado real del enlace y eliminar cuellos de botella sin perder tiempo persiguiendo un “valor vacío” que, en este contexto, simplemente no aplica.

Resumen de acción:

  • Valida/fija el dúplex en la NIC física del host y en el switch.
  • No intentes leer ni forzar FullDuplex en la VM.
  • Evita 100/Full salvo requisito; usa Auto‑Negotiation en ambos extremos.
  • Migra a adaptador sintético si hoy usas el legado.
  • Monitoriza contadores de errores en el host para confirmar salud del enlace.
Índice