Hyper‑V 2022: VM desaparece tras reinicio con iSCSI (multi‑iniciador) — solución con CSV y clúster paso a paso

Tras reiniciar un host con Windows Server 2022 Hyper‑V y VMs alojadas en un LUN iSCSI de un NAS “multi‑connect”, una o varias VMs aparecen en Off‑Critical porque el VHDX “desaparece”. La causa típica es usar el mismo LUN en varios hosts sin CSV ni clúster. Aquí tienes el porqué y cómo solucionarlo.

Índice

Escenario y síntoma

Host Hyper‑V 2022 con almacenamiento de VMs en la unidad D: presentada por iSCSI desde un NAS con opción “multi‑iniciador/multi‑connect”. Tras un reinicio del host:

  • Una VM (o varias) queda en estado Off‑Critical.
  • La carpeta de la VM sigue existiendo (configuración, checkpoints, etc.).
  • El .vhdx ya no se ve en el volumen iSCSI montado en D: o la ruta original deja de ser válida.
  • Reiniciar servicios de Hyper‑V o reconectar iSCSI no restaura el acceso a los discos.

Diagnóstico en una frase

El LUN iSCSI se presentó a varios hosts simultáneamente sin gestionarlo mediante Failover Cluster y Cluster Shared Volumes (CSV). NTFS no es multi‑escritor; sin coordinación de reservas SCSI‑3, la montura del volumen es inestable y Hyper‑V pierde el VHDX.

Solución efectiva (resumen)

Crear un clúster de conmutación por error de Windows, agregar los LUN iSCSI al clúster y convertirlos a CSV. Reubicar las VMs dentro de C:\ClusterStorage\VolumeX\… y operar esos LUN exclusivamente a través del clúster. Tras hacerlo, el problema desaparece.

Pasos recomendados de alto nivel

  1. Crear el clúster (instalar característica, validate y crear).
  2. Conectar los LUN iSCSI en todos los nodos con MPIO habilitado y reconexión automática.
  3. Agregar los discos al clúster y convertirlos a CSV (C:\ClusterStorage\VolumeX\…).
  4. Ubicar las VMs y VHDX en el CSV (mover/crear en C:\ClusterStorage\…).
  5. Verificar inicio automático de VMs y orden de servicios (MSiSCSI y vmms en Automático).

Pasos detallados, comando a comando

Pre‑requisitos y buenas prácticas de red/almacenamiento

  • Hosts en el mismo dominio de Active Directory, NTP correcto y firmware/drivers actualizados.
  • Red dedicada para iSCSI (idealmente dos NICs por host para MPIO, sin TCP Offload problemático; MTU consistente si usas Jumbo Frames).
  • En el NAS, no habilites “multi‑iniciador” indiscriminado; prepara LUN/targets por clúster.
  • Los LUN deben soportar SCSI‑3 Persistent Reservations.
  • No formatees ni montes los LUN directamente con letra en cada host si van a ser CSV; el clúster administra la propiedad.

Instalar características en cada nodo

# En cada host (ejecutar en PowerShell como administrador)
Install-WindowsFeature -Name Hyper-V,Failover-Clustering,RSAT-Clustering-PowerShell,Multipath-IO -IncludeManagementTools -Restart

Configurar MPIO e iniciador iSCSI

# Habilitar MPIO para iSCSI y reiniciar si lo solicita
Enable-MSDSMAutomaticClaim -BusType iSCSI
Set-Service -Name msiscsi -StartupType Automatic
Start-Service -Name msiscsi

Conectar portales/targets iSCSI (repite por portal/ruta)

New-IscsiTargetPortal -TargetPortalAddress 10.10.10.10
New-IscsiTargetPortal -TargetPortalAddress 10.10.11.10

Descubrir y conectar (persistente y multipath habilitado)

Get-IscsiTarget | Connect-IscsiTarget -IsPersistent \$true -IsMultipathEnabled \$true

Verificar sesiones y MPIO

Get-IscsiSession
mpclaim.exe -s -d 

Validar y crear el clúster

# Sustituye por tus nombres/IPs
Test-Cluster -Node HV01,HV02 -Include "Inventory","Network","Storage","System Configuration"

Crea el clúster sin reclamar discos aún

New-Cluster -Name HYPV-CL01 -Node HV01,HV02 -StaticAddress 10.0.0.100 -NoStorage

Configura Quórum (ejemplo: uso de testigo de recurso compartido)

Set-ClusterQuorum -FileShareWitness \FS\ClusWitness\$ 

Agregar discos y convertir a CSV

# Discos visibles para el clúster
Get-ClusterAvailableDisk | Add-ClusterDisk

Convertir todos los discos de clúster a CSV

Get-ClusterDisk | Where-Object {$\_.IsCSV -eq \$false} | Add-ClusterSharedVolume

Listar rutas amigables de CSV

Get-ClusterSharedVolume | ForEach-Object {
\$*.Name
\$*.SharedVolumeInfo.FriendlyVolumeName
}

Rutas típicas: C:\ClusterStorage\Volume1, Volume2, ...

Migrar/ubicar VMs y VHDX en CSV

# Ejemplo: mover el almacenamiento de una VM a CSV
Move-VMStorage -VMName "VM-APP01" -DestinationStoragePath "C:\ClusterStorage\Volume1\VMs\VM-APP01"

O crear nuevas VMs directamente en CSV

New-VM -Name "VM-NEW01" -Path "C:\ClusterStorage\Volume1\VMs\VM-NEW01" -NewVHDPath "C:\ClusterStorage\Volume1\VMs\VM-NEW01\Disk0.vhdx" -NewVHDSizeBytes 60GB </code></pre>

<h3>Hacer las VMs altamente disponibles</h3>
<pre><code class="language-powershell"># Convertir VMs existentes en roles de clúster
Add-ClusterVirtualMachineRole -VirtualMachine "VM-APP01","VM-DB01"

Ajustes recomendados

(Get-Cluster).BlockCacheSize = 1024  # CSV cache en MB (evalúa según carga)

Prioridad de arranque/orden dentro del clúster

(Get-ClusterGroup -Name "VM-DB01").Priority = 3    # Mayor número = menor prioridad
(Get-ClusterGroup -Name "VM-APP01").Priority = 2 </code></pre>

<h3>Verificaciones clave tras la conversión</h3>
<ul>
  <li>Las VMs arrancan desde rutas <code>C:\ClusterStorage\VolumeX\...</code> sin letras de unidad directas.</li>
  <li>Servicios <code>MSiSCSI</code> y <code>Hyper‑V Virtual Machine Management (vmms)</code> en Automático.</li>
  <li>Eventos limpios en <em>FailoverClustering</em>, <em>iScsiPrt</em> y <em>Hyper‑V‑VMMS</em>.</li>
</ul>

<hr>

<h2>Por qué ocurría (explicación técnica)</h2>
<ul>
  <li><strong>NTFS no soporta múltiples escritores simultáneos</strong> sin coordinación. Al presentar un LUN iSCSI a varios hosts sin clúster, pueden fallar las reservas SCSI y producirse monturas inconsistentes.</li>
  <li>El clúster usa <strong>SCSI‑3 Persistent Reservations</strong> para arbitrar el acceso y garantizar una única propiedad de disco.</li>
  <li>Cuando el host pierde o cambia la letra/montura del volumen, Hyper‑V no encuentra el <code>.vhdx</code>; la VM queda <em>Off‑Critical</em>.</li>
</ul>

<h2>Buenas prácticas para Hyper‑V + iSCSI</h2>
<ul>
  <li>Si el mismo LUN será visible por más de un host, <strong>siempre</strong> usa Failover Cluster + CSV.</li>
  <li>Habilita y prueba <strong>MPIO</strong> (múltiples rutas y equilibrio de carga apropiado).</li>
  <li>En el iniciador iSCSI, marca <em>Conectar automáticamente al iniciar sesión</em> y comprueba la persistencia de sesiones.</li>
  <li>No pongas en <em>offline</em>/<em>online</em> manualmente los discos que use el clúster; deja que el clúster gestione la propiedad.</li>
  <li>Mantén firmware y drivers de NIC/iSCSI/NAS al día; revisa <em>iScsiPrt</em>, <em>Storport</em> y <em>FailoverClustering</em> ante cualquier síntoma.</li>
  <li>Aísla la red iSCSI, QoS si es necesario y ajusta <code>TimeOutValue</code> del servicio <code>Disk</code> (p. ej., 60) en entornos con latencia.</li>
</ul>

<h2>Alternativas si no necesitas clúster/HA</h2>
<ul>
  <li>Presenta el LUN iSCSI <strong>solo</strong> a un host (deshabilita multi‑iniciador en el NAS).</li>
  <li>Usa <strong>SMB 3</strong> con disponibilidad continua desde un servidor de archivos en clúster en lugar de iSCSI directo.</li>
  <li>Usa almacenamiento local del host + <strong>Hyper‑V Replica</strong> y copias de seguridad para resiliencia.</li>
</ul>

<h2>Checklist rápido de salud</h2>
<ul>
  <li>[ ] ¿Los VHDX viven en <code>C:\ClusterStorage\VolumeX\…</code>?</li>
  <li>[ ] ¿El disco iSCSI aparece como <strong>CSV</strong> en el administrador del clúster?</li>
  <li>[ ] ¿MPIO activo y sesiones iSCSI persistentes?</li>
  <li>[ ] ¿Servicios <code>MSiSCSI</code> y <code>Hyper‑V VMMS</code> en automático?</li>
  <li>[ ] ¿Sin accesos simultáneos fuera del clúster al mismo LUN?</li>
</ul>

<h2>Tabla de síntomas, causas y acciones</h2>
<table>
  <thead>
    <tr>
      <th>Síntoma</th>
      <th>Causa probable</th>
      <th>Acción recomendada</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>VM en <em>Off‑Critical</em>; VHDX no se encuentra</td>
      <td>LUN iSCSI montado diferente o sin reservas válidas</td>
      <td>Convertir LUN a CSV y mover la VM a <code>C:\ClusterStorage\…</code></td>
    </tr>
    <tr>
      <td>Volumen iSCSI cambia de letra tras reinicio</td>
      <td>Montura no administrada por clúster; auto‑mount de Windows</td>
      <td>Usar CSV (sin letras) y propiedad de disco por el clúster</td>
    </tr>
    <tr>
      <td>Eventos de iScsiPrt indicando restablecimientos</td>
      <td>MPIO no habilitado o rutas inestables</td>
      <td>Habilitar MPIO, revisar NICs/MTU/QoS y persistencia</td>
    </tr>
    <tr>
      <td>Fallo al iniciar varias VMs simultáneamente</td>
      <td>Timeouts/cola de disco o dependencia de almacenamiento</td>
      <td>Ajustar prioridades del clúster y <code>TimeOutValue</code></td>
    </tr>
  </tbody>
</table>

<h2>Guía de recuperación inmediata (si ya “perdiste” el VHDX)</h2>
<ol>
  <li><strong>Detén</strong> la VM afectada si aparece parcialmente cargada.</li>
  <li>En <em>Administrador de discos</em>, confirma si el volumen iSCSI está en línea. No cambies letras si va a ser CSV.</li>
  <li>Desde PowerShell, lista CSV o discos de clúster:
    <pre><code class="language-powershell">Get-ClusterSharedVolume
Get-ClusterDisk
Get-Volume | Where-Object {$_.FileSystemLabel -like "CSV"}
</code></pre>
  </li>
  <li>Busca el <code>.vhdx</code> por firma/tamaño si el volumen está montado con otra ruta:
    <pre><code class="language-powershell">Get-ChildItem -Path D:\ -Recurse -Filter *.vhdx -ErrorAction SilentlyContinue |
  Sort-Object Length -Descending | Select-Object FullName, Length, LastWriteTime -First 50

Si localizas el VHDX, no lo muevas en caliente; adjúntalo a la VM detenida, arranca, y luego migra el almacenamiento a C:\ClusterStorage\….
Si el LUN presenta errores, con el volumen desmontado ejecuta chkdsk y revisa snapshots del NAS.

Scripts de referencia para automatizar

# Crear carpetas estándar por CSV
$csv = "C:\ClusterStorage\Volume1\VMs"
$newFolders = @("VMs","ISOs","Backups") | ForEach-Object { Join-Path "C:\ClusterStorage\Volume1" $_ }
$newFolders | ForEach-Object { if(!(Test-Path $)){ New-Item -ItemType Directory -Path $ | Out-Null } }

Registrar varias VMs como roles de clúster

\$vmList = @("VM-APP01","VM-DB01","VM-WEB01")
\$vmList | ForEach-Object { Add-ClusterVirtualMachineRole -VirtualMachine $\_ }

Establecer arranque automático y orden

\$orders = @{ "VM-DB01"=1; "VM-APP01"=2; "VM-WEB01"=3 }
foreach(\$vm in \$orders.Keys){
(Get-ClusterGroup -Name \$vm).Priority = \$orders\[\$vm]
} 

Seguridad y rendimiento

  • Activa autenticación (p. ej., CHAP) en iSCSI según política.
  • Separa físicamente o por VLAN la red iSCSI; evita compartirla con tráfico de usuario.
  • Evalúa CSV Cache para cargas con lecturas repetitivas (por ejemplo, 512–2048 MB por host).
  • Comprueba colas de disco y latencias con contadores de rendimiento y el registro FailoverClustering/Diagnostics.

Errores comunes que debes evitar

  • Dejar el mismo LUN accesible en varios hosts sin clúster ➜ incoherencias de NTFS.
  • Asignar letras a CSV o mover manualmente el propietario del disco fuera del clúster.
  • Usar una sola ruta iSCSI “barata” para todo ➜ sin MPIO, sin redundancia.
  • No validar con Test-Cluster antes de poner en producción.

Preguntas frecuentes

¿Puedo usar varios LUN para separar datos y SO de VM?
Sí. Crea varios CSV (p. ej., CSVOS y CSVDATA) y asigna cada VHDX en la ruta adecuada dentro de C:\ClusterStorage\….

¿Puedo conservar D: como letra del LUN?
No es recomendable para CSV. Los CSV se montan como puntos de montaje bajo C:\ClusterStorage\ y evitan problemas de letras.

¿Necesito obligatoriamente dos NICs para iSCSI?
No, pero es lo recomendado para MPIO y resiliencia real.

¿Cómo verifico que una VM está “clusterizada”?
En Failover Cluster Manager debe aparecer como Rol. Vía PowerShell: Get-ClusterGroup debe listar tus VMs.

Resumen accionable

  1. Detén el acceso simultáneo al LUN desde hosts fuera del clúster.
  2. Habilita MPIO y sesiones iSCSI persistentes en todos los nodos.
  3. Crea el clúster, agrega los LUN y conviértelos a CSV.
  4. Mueve todas las VMs a C:\ClusterStorage\VolumeX\… y publícalas como Roles.
  5. Comprueba servicios, eventos y prioridades de arranque.

Conclusión

El estado Off‑Critical con “VHDX desaparecido” tras reinicio no es un misterio: es un patrón clásico de multi‑iniciador sin clúster. Al convertir los LUN a CSV dentro de un Failover Cluster y operar las VMs exclusivamente desde C:\ClusterStorage\…, estabilizas el almacenamiento, evitas monturas erráticas y ganas alta disponibilidad real. Complementa con MPIO, sesiones persistentes y una validación rigurosa del clúster, y tu entorno Hyper‑V 2022 quedará sólido frente a reinicios, fallos de ruta y mantenimientos programados.


Checklist final

  • [ ] LUNs convertidos a CSV y visibles como Cluster Shared Volumes.
  • [ ] VMs y VHDX en rutas C:\ClusterStorage\VolumeX\….
  • [ ] MPIO activo con múltiples sesiones iSCSI persistentes.
  • [ ] Servicios MSiSCSI y vmms en Automático.
  • [ ] Sin accesos simultáneos externos al mismo LUN.
  • [ ] Validación Test-Cluster sin errores críticos.
Índice