Problema

Al importar máquinas virtuales Windows desde OVA a Proxmox, muchos administradores cambian el bus del disco de SATA a VirtIO SCSI para aprovechar mejor el rendimiento y la compatibilidad con el QEMU Guest Agent. En varios casos el arranque falla con un BSOD (Blue Screen of Death) inmediatamente después de la migración. La solución temporal de volver a conectar el disco como SATA, instalar los drivers VirtIO y volver a cambiar a SCSI a veces funciona, pero el comportamiento es inconsistente: algunas VMs arrancan al primer intento, otras requieren varios ciclos de “SATA → SCSI” antes de estabilizarse.

Este patrón se repite en entornos de producción y laboratorios homelab donde se reutilizan imágenes Windows preconfiguradas. El objetivo es entender por qué el controlador VirtIO SCSI no es reconocido de forma fiable y ofrecer un proceso reproducible que elimine los BSOD sin depender de “pruebas y errores”.

Causa

1. Controlador de disco no enlazado en el BCD

Windows almacena la referencia al controlador de arranque en el BCD (Boot Configuration Data). Cuando el disco se presenta inicialmente como SATA, el BCD apunta a pci\...ide o pci\...ata. Cambiar a VirtIO SCSI sin actualizar el BCD deja al kernel sin un controlador válido, provocando un crash temprano.

2. Falta de drivers VirtIO SCSI en la fase de arranque

Los drivers de VirtIO SCSI están disponibles como paquetes virtio-win. Si el paquete no está instalado antes del primer arranque con SCSI, Windows intenta cargar un controlador genérico que falla. En algunos sistemas el instalador de drivers se ejecuta en segundo plano y termina antes del reinicio; en otros el proceso se interrumpe, lo que explica la variabilidad.

3. Diferencias en la tabla de particiones y alineación

Algunos OVA usan discos con MBR y sectores de 512 bytes, mientras que otros usan GPT con 4 KB. El controlador VirtIO SCSI tiene requisitos de alineación que, si no se cumplen, pueden generar errores de I/O durante la fase de carga del kernel, desembocando en un BSOD.

4. Configuración de la controladora SCSI en QEMU

Proxmox permite varios tipos de controladoras SCSI (virtio-scsi-pci, lsi53c895a, etc.). Si la VM se crea con la opción “VirtIO SCSI Single” pero el hardware subyacente sigue exponiendo un controlador diferente (por ejemplo, por una plantilla heredada), Windows recibe una descripción de hardware inesperada y falla.

5. QEMU Guest Agent y sincronización de tiempo

El agente no está disponible en el primer arranque con SCSI. La falta de sincronización de tiempo y de notificaciones de hot‑plug puede dejar a Windows en un estado inconsistente, especialmente si el disco contiene un hibernation file (hiberfil.sys) que se vuelve inaccesible al cambiar de bus.

Solución

El enfoque consiste en alinear el BCD, instalar los drivers antes del primer arrollo con SCSI, y garantizar que la VM use la controladora correcta desde el inicio. El proceso se puede automatizar con los comandos qm de Proxmox y un script de arranque dentro de la VM.

Paso 1 – Preparar la plantilla de drivers

Descarga la última versión de virtio-win desde el repositorio oficial y extrae los archivos viostor y vioscsi. Copia los .inf y .sys a una carpeta accesible desde la VM (por ejemplo, un ISO montado como ide2).

Paso 2 – Crear la VM con disco SCSI desde el principio

En lugar de crear la VM con SATA y luego cambiar, define el disco como SCSI al crear la VM:

qm create 101 --name win10 --memory 8192 --net0 virtio,bridge=vmbr0
qm importdisk 101 /ruta/al/ova.vmdk local-lvm --format qcow2
qm set 101 --scsi0 local-lvm:vm-101-disk-0
qm set 101 --boot c --bootdisk scsi0
qm set 101 --scsihw virtio-scsi-pci
qm set 101 --ide2 local:iso/virtio-win.iso,media=cdrom
qm set 101 --agent 1

Paso 3 – Forzar la carga del driver antes del primer arranque

Arranca la VM en modo Safe Mode with Networking para evitar que Windows intente iniciar con un controlador inexistente. Desde el entorno seguro, ejecuta:

dism /online /add-driver /driver:D:\viostor\ /recurse
dism /online /add-driver /driver:D:\vioscsi\ /recurse
bcdedit /set {default} safeboot minimal

Reinicia la VM; Windows arrancará en modo seguro con los drivers ya registrados.

Paso 4 – Actualizar el BCD para apuntar al controlador SCSI

Una vez en modo seguro, ejecuta:

bcdedit /set {default} device scsi
bcdedit /set {default} osdevice scsi
bcdedit /deletevalue {default} safeboot

Esto reescribe las entradas del BCD para que el disco de arranque sea reconocido como SCSI.

Paso 5 – Reinicio final y verificación del agente

Apaga la VM, desactiva el CD-ROM y arranca normalmente. El QEMU Guest Agent debe aparecer en la sección “Agent” de Proxmox. Si el agente no se registra, reinstálalo desde el mismo ISO:

msiexec /i D:\guest-agent\qemu-ga-x86_64.msi /quiet

Paso 6 – Opcional – Automatizar con cloud‑init (para despliegues masivos)

Si gestionas varias VMs, crea una plantilla de Windows con los drivers preinstalados y un script cloud-init que ejecute los comandos de BCD al primer arranque. Esto elimina la necesidad de intervención manual.

Cuándo aplicar esta solución

  • Síntomas: BSOD inmediato al arrancar una VM Windows recién importada con disco configurado como VirtIO SCSI; el error suele indicar “INACCESSIBLE_BOOT_DEVICE” o “STOP: 0x0000007B”.
  • Entorno: Proxmox VE (versión 7+), discos importados desde OVA, plantilla Windows 10/Server 2019 o versiones posteriores.
  • Escenarios válidos: Migraciones de hardware, consolidación de storage, despliegues homelab con imágenes pre‑configuradas.
  • No aplicar: Si la VM ya arranca correctamente con SATA y no necesita rendimiento de SCSI, o si el controlador de disco está configurado como IDE y la carga de I/O no es crítica.

Código

# Creación de VM con disco SCSI y driver ISO
qm create 102 --name win11 --memory 16384 --net0 virtio,bridge=vmbr0
qm importdisk 102 /path/to/windows.ova local-lvm --format qcow2
qm set 102 --scsi0 local-lvm:vm-102-disk-0
qm set 102 --boot c --bootdisk scsi0
qm set 102 --scsihw virtio-scsi-pci
qm set 102 --ide2 local:iso/virtio-win.iso,media=cdrom
qm set 102 --agent 1

Verificación

  1. Arranque sin BSOD: La VM debe iniciar directamente a Windows sin detenerse en pantalla azul.
  2. Controlador listado: En el Administrador de dispositivos, bajo “SCSI and RAID controllers”, debe aparecer “VirtIO SCSI Controller”.
  3. QEMU Guest Agent activo: En la UI de Proxmox, la pestaña “Agent” muestra “Running”.
  4. BCD correcto: Ejecuta bcdedit dentro de la VM y verifica que device y osdevice tengan el valor scsi.
  5. Rendimiento: Realiza una prueba de I/O (por ejemplo, winsat disk) y compara contra la configuración SATA; deberías observar mayor throughput y menor latencia.

Notas adicionales

  • Alineación de particiones: Si el disco original usa sectores de 512 bytes, considera convertirlo a 4 KB con diskpart antes de la importación para evitar cuellos de botella.
  • Backup del BCD: Antes de modificar, exporta el BCD con bcdedit /export C:\bcd-backup. En caso de error, puedes restaurar con bcdedit /import C:\bcd-backup.
  • Hibernación: Desactiva la hibernación (powercfg /h off) antes de la migración; el archivo hiberfil.sys puede quedar corrupto al cambiar de bus.
  • Versiones de virtio-win: Usa siempre la versión que coincida con la arquitectura de la VM (x86_64). Las versiones más antiguas pueden carecer del driver vioscsi.
  • Logs de Proxmox: Si el problema persiste, revisa /var/log/qemu-server/101.log para mensajes de “device not found” o “failed to open scsi”.

Con este flujo, la mayoría de los BSOD relacionados con la migración a VirtIO SCSI desaparecen, y las VMs Windows arrancan de forma estable y con el rendimiento esperado.