Cet article est le deuxième d’une série de cinq articles traitant de l’installation et de la configuration de VMs (Linux, Windows, macOS et BSD) en PCI Passthrough sur Proxmox VE 8.

Bien, après avoir vu comment configurer notre hyperviseur Proxmox, passons maintenant au paramétrage de nos première VM sous Windows 10 et 11.

Récupération des images ISO (Windows et VirtIO)

Il va nous falloir une image d’installation de Windows 10 bien sûr, mais ce n’est pas tout, afin d’assurer une meilleure compatibilité de notre VM avec notre hôte il nous faudra également les drivers VirtIO.

Création de la VM Windows 10

Passons à présent à la création de notre première VM.

 qm create 100 \
    --name win-100 \
    --agent 1 \
    --memory 8192 \
    --bios ovmf \
    --sockets 1 --cores 4 \
    --cpu host \
    --net0 virtio,bridge=vmbr0 \
    --scsihw virtio-scsi-single \
    --boot order='ide2;ide0;scsi0' \
    --ostype win10 \
    --efidisk0 local-lvm:0 \
    --scsi0 local-lvm:150 \
    --ide0 PVE1:iso/virtio-win-0.1.229.iso,media=cdrom \
    --cdrom PVE1:iso/Win10_22H2_French_x64.iso \
    --machine q35 \
    --hostpci0 0000:01:00.0,pcie=1 \
    --hostpci1 0000:01:00.1,pcie=1

Petite explication sur les points importants de cette commande :

  • scsi0 local-lvm:150 correspond au disque (150 Go) de destination pour l’installation de Windows.
  • cdrom PVE1:iso/Win10_22H2_French_x64.iso L’emplacement de l’ISO de Windows 10, ici définit en tant que CDRom virtuel. Dans mon cas j’ai monté dans Proxmox un partage NFS depuis mon NAS, afin de ne pas avoir à stocker toutes mes ISO sur l’hyperviseur, le PATH sera donc à modifier dans votre cas par local:iso/Win10_22H2_French_x64.iso.
  • ide0 PVE1:iso/virtio-win-0.1.229.iso,media=cdrom L’emplacement de l’ISO de drivers VirtIO, nécessaire à l’installation de Windows, là encore il faudra modifier le chemin par ide0 local:iso/virtio-win-0.1.229.iso,media=cdrom.
  • boot order=‘ide2;ide0;scsi0’ Dans l’ordre de boot, l’image d’installation de Windows doit être placée en première position.
  • hostpci0 0000:01:00,pcie=1 & hostpci0 0000:01:01,pcie=1 l’emplacement PCI du GPU (deux entrées, car la carte graphique doit aussi gérer le son, vous pouvez définir une seule entré hostpci mais il faudrat activé le paramètre “all fonction”).

Comme je dispose d’un Switch KVM pour partager ma souris et mon clavier entre mon thinkpad et les VMs hébergées sur l’hyperviseur, je vais devoir ajouter les ID des deux périphériques à ma VM :

Sur l’hôte Proxmox, je fais une recherche dans la liste des périphériques USB disponibles :

lsusb | grep -E "Logitech|Lite-On"
Bus 001 Device 019: ID 046d:c08b Logitech, Inc. G502 SE HERO Gaming Mouse
Bus 001 Device 018: ID 04ca:007d Lite-On Technology Corp. USB wired keyboard

Ensuite, ne reste plus qu’a ajouter les deux ID à ma VM :

qm set 100 --usb0 046d:c08b,usb3=1
qm set 100 --usb1 04ca:007d,usb3=1

Quelques précisions concernant les CPU flags à utiliser

Suivant le cas d’usage de votre VM et votre configuration matérielle, vous serrez peut être amené à faire des modifications sur vos flags CPU, dans votre configuration QEMU.

Cependant, avant de faire une quelconque modification sur votre VM, il faut avoir à l’esprit les points suivants :

  • Votre VM dispose déja de flags CPU prédéfinis, en fonction du type de CPU sélectionné (host, kvm63, qemu63, …).

Par exemple, pour ma VM Windows voilà ce que j’obtiens :

-cpu 'host,hv_ipi,hv_relaxed,hv_reset,hv_runtime,hv_spinlocks=0x1fff,hv_stimer,hv_synic,hv_time,hv_vapic,hv_vpindex,+kvm_pv_eoi,+kvm_pv_unhalt'

Vous pouvez vous en assurez vous-même pour votre VM, avec :

qm showcmd VMID | grep --color -e "-cpu '\S*'"

C’est donc la première étape à réaliser avant toute modification de votre configuration QEMU.

  • D’autre part, la définition de nouveau flags CPU par exemple avec la commande suivante, n’effacera pas complètement la configuration par défaut, mais l’adaptera en fonction de vos nouveaux paramètres :
qm set VMID --cpu host,hidden=1,flags=+pcid

Une commande de ce type aurait eu pour effet sur ma configuration par défaut de rajouter deux flags supplémentaires(kvm=off et +pcid):

-cpu 'host,hv_ipi,hv_relaxed,hv_reset,hv_runtime,hv_spinlocks=0x1fff,hv_stimer,hv_synic,hv_time,hv_vapic,hv_vpindex,kvm=off,+kvm_pv_eoi,+kvm_pv_unhalt,+pcid

je prend cette exemple à dessein, car je vois souvent cette modification recommandée dans les différents guides, couplé le plus souvent avec cette autre modification :

qm set VMID --args '-cpu host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NV43FIX,kvm=off'

Vous remarquerez qu’il y a un certain nombre de flags inutiles, car déja présent dans la configuration par défaut. Reprenons point par point :

qm set VMID --cpu host,hidden=1,flags=+pcid
  • hidden=1 : Ce n’est pas un paramètre nécessaire au passthrough en soit, mais peut-être ajouter si, en plus de votre configuration en PCI passthrough, vous souhaitez faire de la “virtualisation imbriqué” comme par exemple pour pouvoir utiliser hyper-V ou WSL depuis votre VM Windows.
  • flags=+pcid : Peut améliorer les performances de la configuration en PCI passthrough, mais ne s’applique qu’aux processeurs Intel.
qm set VMID --args '-cpu host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NV43FIX,kvm=off'
  • +kvm_pv_unhalt : Inutile à re-définir car déja présent dans la configuration par défaut.
  • +kvm_pv_eoi : Inutile à re-définir car déja présent dans la configuration par défaut.
  • hv_vendor_id=NV43FIX : Cette option permet de spécifier l’ID du fournisseur hyperviseur. Cela peut aider résoudre certains problèmes de compatibilité avec les GPU NVIDIA.
  • kvm=off : Inutile à re-définir car déja présent dans la première commande “hidden=1”.

Dans mon cas, je n’aurais donc besoin de rajouter aucun flags suplémentaires.

Installation de Windows 10

Ne reste plus qu’à démarrer notre VM, et passer par la console noVNC de Proxmox pour commencer l’installation de Windows 10.

qm start 100

Lors de la sélection du disque de destination, l’installeur ne trouvera aucun disque disponible. Il suffira alors de charger le pilote correspondant depuis le CDROM VirtIO:

CDROM (VirtIO) > vioscsi > w10 > amd64

Mis à part cette petite subtilité le reste de l’installation reste inchangée, du moins jusqu’a l’écran OOBE de Windows 10. Une fois dessus il va falloir passer en mode “Audit” avec CTRL + SHIFT + F3.

Ce mode “Audit” nous crée un utilisateur temporaire, le temps de préparer le système avec les pilotes graphiques, VirtIO, et les drivers/agent QEMU.

Windows va alors redémarrer l’ordinateur et une fenêtre sysprep apparaîtra, vous pouvez la fermer pour le moment.

Nous pouvons alors, installer le reste des drivers VirtIO, l’agent QEMU, et ne pas oublier de faire les mises à jours pour le système Windows et d’installer les derniers pilotes nécessaires.

Comme je dispose d’un Switch KVM pour partager ma souris et mon clavier entre mon thinkpad et les VMs hébergées sur l’hyperviseur, je vais devoir ajouter les ID des deux périphériques à ma VM :

Sur l’hôte Proxmox, je fais une recherche dans la liste des périphériques USB disponibles :

lsusb | grep -E "Logitech|Lite-On"
Bus 001 Device 019: ID 046d:c08b Logitech, Inc. G502 SE HERO Gaming Mouse
Bus 001 Device 018: ID 04ca:007d Lite-On Technology Corp. USB wired keyboard

Ensuite, ne reste plus qu’à ajouter les deux ID à ma VM :

qm set 100 --usb0 046d:c08b,usb3=1
qm set 100 --usb1 04ca:007d,usb3=1

Comme j’accèderai à ce bureau directement depuis l’affichage HDMI de la carte graphique, je n’ai donc plus besoin de la console Proxmox, j’en profite aussi pour supprimer les disques d’installations, et redéfinir l’ordre de boot :

qm set 100 --vga none
qm set 100 --delete ide0 
qm set 100 --delete cdrom 
qm set 100 --boot order='scsi0'

Transformation de notre VM en template Windows

Passons maintenant à la normalisation de notre installation de Windows. Depuis notre VM Windows entrez cette commande :

c:\windows\system32\sysprep\sysprep.exe /oobe /generalize /shutdown
  • /oobe Forcera Windows à démarrer dans son mode d’installation (comme pour une nouvelle installation).

  • /generalize Supprime les données propres à notre session temporaire.

Une fois que Sysprep aura fini ses opérations il éteindra automatiquement notre VM, il ne nous restera alors plus qu’à faire la conversion en template, depuis proxmox avec la commande suivante :

qm template 100

Déploiement des nouvelles VMs

Maintenant si je souhaite déployer une nouvelle VM Windows (préconfigurée) je clone simplement mon template avec :

qm clone 100 101 --full --name win-101

Au démarage, vous vous retrouverez devant l’écran de configuration du système (OOBE) vous demandant de définir un nouvel utilisateur, et voilà, vous pourrez utiliser votre nouveau desktop sans configurations supplémentaires.

Concernant Windows 11

La procédure est relativement identique, les images a récupérer :

Pour la création de la VM.

 qm create 102 \
    --name win-102 \
    --agent 1 \
    --memory 8192 \
    --bios ovmf \
    --sockets 1 --cores 4 \
    --cpu host \
    --net0 virtio,bridge=vmbr0 \
    --scsihw virtio-scsi-single \
    --boot order='ide2;ide0;scsi0' \
    --ostype win11 \
    --efidisk0 local-lvm:0 \
    --tpmstate0 local-lvm:0,version=v2.0 \
    --scsi0 local-lvm:150 \
    --ide0 PVE1:iso/virtio-win-0.1.229.iso,media=cdrom \
    --cdrom PVE1:iso/Win11_French_x64v1.iso \
    --machine q35 \
    --hostpci0 0000:01:00.0,pcie=1 \
    --hostpci1 0000:01:00.1,pcie=1 \
    --usb0 046d:c08b,usb3=1 \
    --usb1 04ca:007d,usb3=1
  • tpmstate0 local-lvm:0,version=v2.0 ajoute la fameuse puce TPM, nécessaire à Windows 11.
  • ostype win11 veillez à modifier le type de système d’exploitation

Concernant les flag CPU dans la configuration QEMU les mêmes conseils s’applique, que pour une machine virtuelle sous Windows 10.

Pendant l’installation, lors de la sélection du disque de destination, charger le pilote pour Windows 11 depuis le CDROM virtuel de VirtIO:

CDROM (VirtIO) > vioscsi > w11 > amd64

En clôture d’installation après avoir installé les drivers VirtIO, l’agent QEMU, les mise à jours système et les derniers pilotes nécessaires. Je peux passer à la normalisation de l’image windows avec Sysprep, et depuis l’hyperviseur convertir notre VM et template.

Ressources :