Crear máquina virtual con Windows 11 en Libvirt

miércoles, 27 de diciembre de 2023
Tiempo de lectura 10 minutos

En esta ocasión, siento que tengo que escribir esto para no olvidarlo. Lo cierto es que crear una VM con Windows 11 no parecería mucho más difícil que lo que ya se ha visto para Windows 10, pero en realidad sí que tiene mucho tema, al menos ahora, a finales del 2023. Ahora bien, en este artículo, que yo quisiera que fuera más breve, dejaré la serie de instrucciones que me han valido para hacer funcionar la instalación de Windows 11 con Narrador, por supuesto a través de Spice. No voy a hablar ahora de Libvirt, pues ya he dejado algo de información sobre la herramienta en estos artículos, pero sí sobre cómo añadir los dispositivos TPM, configurar el secure boot, y cómo hacer que arranque Windows 11 a partir de aí. Mi configuración de partida es un eqipo con Debian 12 instalado, Libvirt y una red en puente, justo como detallé en el post al respecto.

Conseguir ISO de Windows 11

Al parecer, la imagen ISO de Windows 11 23 h2, que es la correspondiente a octubre del 2023, no permite activar el narrador con la tradicional combinación de teclado. Así que por el momento y mientras Microsoft no saque una nueva versión de esta imagen, no nos sirve. En mi caso particular, he tenido que descargar una imagen anterior de Windows 11 (22h2), correspondiendo a octubre del 2022, para poder tener un punto de partida desde donde sé que narrador funciona. Se puede encontrar un conjunto de imágenes de este tipo en sitios como Internet archive (esta es la que yo he descargado.) Con Internet Archive es recomendable tener un cliente de torrents disponible o mucha, mucha paciencia. En mi caso usé Torrent, y la descarga tomó alrededor de 25 minutos, para descargar una imagen ISO de alrededor de 5.8 GB. Una vez descargada, es necesario mover la imagen ISO al directorio donde libvirt esperará encontrarla, que en mi caso es /var/lib/libvirt/iso. Hay que decir que he renombrado la imagen a win11-22h2.iso, por lo que en el resto de este artículo así haré referencia a la misma.

También es importante tener actualizada la imagen de los drivers VirtIO para Windows. Esta imagen se puede conseguir en el primer artículo donde hablaba sobre crear VM’S con Windows 10.

Instalando emulador de TPM y secure boot

Windows 11 requiere de un chip TPM en los equipos donde va a ser instalado. Existen varias alternativas para tener esta característica dentro de una VM. Si el hardware del anfitrión posee soporte para TPM, se puede simplemente exponer el hardware TPM a la máquina virtual, aunque el inconveniente con esto es que no es posible utilizar el TPM en más de un dominio al mismo tiempo. En este artículo emularé un módulo TPM, lo que funciona bien si no hay hardware TPM disponible o si se desea incluir el mismo módulo en más de una máquina virtual.

Para poder tener el emulador TPM, son necesarios algunos paquetes extras, que se pueden instalar con el siguiente comando:

sudo apt-get install ovmf swtpm swtpm-tools

Por alguna extraña razón, el módulo emulador de TPM en Debian 12 falla al iniciarse por un problema en los permisos de un directorio. Para solucionar esto, hay que otorgarle la propiedad de este directorio al usuario “tss” así:

sudo chown -R tss /var/lib/swtpm-localca

Creando máquina virtual

Como ya es conocido, el comando virt install se utiliza para generar las máquinas virtuales. Así que se deben pasar estos argumentos al comando, cuya única diferencia es que llevarán el módulo TPM emulado, así como algunas definiciones para que secure boot funcione al iniciar el sistema operativo:

sudo virt-install --name windows11-vm --cdrom /var/lib/libvirt/iso/win11-22h2.iso --os-variant=win11 --network network=bridged-network,model=virtio --disk size=50,cache=none,bus=virtio --disk path=/var/lib/libvirt/iso/virtio-win.iso,device=cdrom --memory 4096 --sound default --graphics spice,listen=0.0.0.0 --vcpu 4 --video qxl --noautoconsole --features kvm_hidden=on,smm=on --tpm backend.type=emulator,backend.version=2.0,model=tpm-tis --boot loader=/usr/share/OVMF/OVMF_CODE.secboot.fd,loader_ro=yes,loader_type=pflash,nvram_template=/usr/share/OVMF/OVMF_VARS.ms.fd

Este comando debe ser suficiente para iniciar el instalador de Windows 11 en el dominio recién creado. Aunque luego de un par de minutos, el dominio será detenido de forma inexplicable y se deberá cambiar algún parámetro antes de volver a iniciarlo. Se puede comprobar el estado del dominio con el comando sudo virsh dominfo windows11-vm. Si en la respuesta el atributo “id” del dominio no es un número, o si “status” no es “running”, el dominio se ha detenido y hay que proceder a editar su configuración.

Para editar la configuración del dominio, se realiza con el siguiente comando:

sudo virsh edit windows11-vm

Al editar la configuración XML del dominio, básicamente lo que se debe hacer es desactivar, por ahora, el inicio desde el disco duro virtual y se debe otorgar prioridad al inicio desde el CDRom que contiene Windows 11. Después, cuando Windows 11 envíe el primer reinicio, hay que volver a cambiar las prioridades. Para ello, se debe hacer lo siguiente:

  1. Localizar la sección llamada <os> en el XML.
  2. En el elemento <loader>, establecer un atributo llamado secure, con valor ‘yes’. El elemento debe quedar así:
    <loader readonly='yes' secure='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.secboot.fd</loader>
  3. Localizar y borrar el elemento <boot>. Por defecto, este elemento indica que la VM debe iniciar desde el disco duro.
  4. Localizar el elemento llamado <devices> y de ahí, encontrar el disco duro virtual. Normalmente se verá algo como lo siguiente:
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none' discard='unmap'/>
      <source file='/var/lib/libvirt/images/windows11-vm.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
  1. Establecer un nuevo elemento dentro de la definición del disco duro Virtual. El elemento será llamado <boot>, y tendrá un atributo llamado “order”, con valor “2”. El disco virtual quedaría definido así:
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none' discard='unmap'/>
      <source file='/var/lib/libvirt/images/windows11-vm.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    <boot order='2'/>
    </disk>
  1. Buscar el CDRom virtual que contiene la imagen ISO de Windows 11, y añadir otro elemento <boot>, esta vez con valor “1”. El elemento completo se debería ver así:
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/var/lib/libvirt/iso/win11-22h2.iso'/>
      <target dev='sda' bus='sata'/>
      <readonly/>
      <boot order='1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
  1. Guardar la configuración de la VM, normalmente con Ctrl+X, después y.
  2. Iniciar el dominio con sudo virsh start windows11-vm
  3. Revisar los detalles para conectar mediante Spice con sudo virsh domdisplay windows11-vm
  4. Conectar mediante spice, utilizando la dirección IP del servidor donde corre libvirt. Una vez dentro, ejecutar Narrador con la combinación Ctrl+Windows+Enter. La aplicación debería comenzar a hablar y debería ser posible iniciar el proceso de instalación.

Durante la instalación

Al utilizar los dispositivos VirtIO, lo normal es que Windows 11 no muestre ningún elemento a la hora de seleccionar el disco donde se desea instalar el sistema. Para instalar el driver VirtIO, se debe pulsar sobre el botón “Cargar controlador”, lo que abrirá un selector de archivos clásico de Windows. De ahí, hay que buscar en la sección “este equipo”, en una de las unidades de CD, una de ellas se llamará “Virtio-win”. Entrando en ella,se puede localizar y acceder al directorio llamado “AMD64”, después buscar el directorio W11 y pulsar enter sobre él. Lo siguiente que pasará es que se mostrará una lista donde solo hay un único dispositivo: “RedHat SCSI Device”. Pulsando el botón siguiente, y luego de unos segundos, el sistema volverá a la tabla donde ahora sí se puede ver el espacio libre del disco virtual, listo para ser formateado.

Una vez que la instalación copie algunos archivos y prepare el sistema, Windows pedirá reiniciarse. Una vez que se reinicie, hay que volver al servidor donde corre libvirt y detener el dominio, pues volverá a arrancar el disco de instalación. Se debe detener el dominio así:

sudo virsh destroy windows11-vm

Después, hay que editarlo de nuevo:

sudo virsh edit windows11-vm

Aquí únicamente hay que buscar el elemento del disco duro virtual y poner <boot order='1'> en lugar del “2” que estaba anteriormente, y la unidad de CDRom virtual debe quedar como <boot order='2'>, aunque directamente se puede ya eliminar, ya que no se volverá a utilizar.

Una vez configurado el disco duro para ser el elemento que inicie primero, se debe iniciar el dominio de nuevo:

sudo virsh start windows11-vm

Y se puede volver a conectar a Spice para retomar la instalación.

Cuenta local

En mi caso particular, Windows 11 me sirve más sin tener que iniciar sesión en One Drive y mi cuenta de Microsoft, pues lo utilizo, principalmente, como un sistema operativo donde correr algunas tareas de integración continua y siempre es útil tenerlo lo más limpio posible. Es por eso que he preferido iniciar sesión con una cuenta local de este modo:

  1. Cuando windows 11 reinicia y pregunta por el país donde se encuentra el usuario (se escucha el sonido de inicio del sistema también), presiona Shift + F10. Esto debería abrir una línea de órdenes de Windows.
  2. Escribe OOBE\BYPASSNRO y pulsa intro. Si todo ha ido bien, el sistema debería reiniciar y se debería escuchar el sonido de inicio de Windows de nuevo.
  3. A partir de aquí puedes continuar. Es importante no instalar los drivers de Red, de lo contrario Windows se conectará a internet y no permitirá configurarse sin conexión.
  4. En el apartado para seleccionar conexión de red, aparecerá un nuevo vínculo llamado “no tengo conexión a internet” que se puede utilizar para continuar con la cuenta local.
  5. Una vez terminada la instalación del sistema, puedes instalar los Drivers desde “Este equipo” justo como se describe en el siguiente apartado.

Drivers de red

Nota: Este proceso instala los drivers de red durante la configuración de Windows, haciendo imposible la configuración de cuentas sin conexión.

Al utilizar los dispositivos VirtIO, tampoco habrá red. Lo normal en este caso sería poder instalar Windows y ocuparse de la red más adelante, pero esto no funciona así en Windows 11. Si no se puede conectar a internet, llegará un punto donde se deberían mostrar las conexiones de red disponibles, pero al no tener ningún dispositivo de red detectado, la ventana simplemente no muestra opciones. Narrador solo dirá “flujo de conexiones de red disponibles” y no ofrecerá ningún elemento en esa lista. Tampoco se puede ir atrás, y el único botón que hay, que es el de “siguiente”, no se encuentra disponible, con lo que tampoco es posible llegar a él.

Para solucionar este problema, es necesario instalar los drivers VirtIO en el equipo. Para esto, se debe presionar la combinación Shift+F10. Esto abrirá una consola de comandos en Windows. De aquí, escribiendo el comando explorer.exe y pulsando enter, causará que el sistema abra el explorador de archivos, lo que permitirá volver a la sección “Este equipo” y buscar la unidad de CD virtual que contiene los drivers VirtIO (la que se llama Virtio-win).

Dentro de esa unidad, es cuestión de ejecutar el archivo llamado “virtio-win-guest-tools”. Es uno de los últimos archivos de la lista. Estas Guest tools son algunas herramientas que ayudan a que las máquinas virtuales Windows se comporten mejor con el anfitrión. Las guest tools, en algún momento de la instalación, abrirán otro ejecutable llamado “Driver installer setup”. Es recomendable instalar todos los drivers que ofrece, para que no haya mayores dificultades. Una vez finalizado tanto el instalador de drivers como el de las guest tools, simplemente hay que volver a la ventana de instalación de Windows, y pulsar la tecla espacio o enter, que por defecto debería ir hacia el botón siguiente y permitir el resto de la instalación.

A partir de este punto, la instalación debería realizarse sin mayores dificultades. Al terminar, se puede editar el fichero de configuración del dominio para remover las imágenes ISO de Windows 11 y los drivers VirtIO, pues ya no serán necesarios.

Eliminando VM con Windows 11

Un último dato con respecto a Windows 11. Parece que la versión de libvirt que va en Debian 12 no permite eliminar el dominio, utilizando el comando sudo virsh undefine. Esto ocurre porque se utiliza un fichero nbram y libvirt se queja de no poder eliminar esta clase de dominios. Para poder borrar un dominio definido para Windows 11, se procede así:

sudo virsh undefine windows11-vm --nvram

Después, hay que eliminar manualmente el fichero del disco virtual de la VM, que normalmente estará en la ruta /var/lib/libvirt/images/windows11-vm.qcow2.

Conclusión

Finalmente esto ha sido todo. Ahora ya se puede utilizar Windows 11 de manera completamente funcional en una máquina virtual. Como siempre, quedan muchas optimizaciones por hacer, especialmente para lograr que Windows le saque partido a las bentajas de según qué hardware. Pero eso quedará para otra ocasión.

Comments

You can use your Mastodon account to reply to this post.

Reply

Administración Linux NAS tutoriales

Windows Windows 11 kvm libvirt