GPU Passthrough sur Proxmox VE - macOS Monterey (Part. 04x04)

Page content

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

Nous nous retrouvons aujoud’hui pour la configuration de notre dernière VM sous macOS. Je me doit de vous précisez cependant que Proxmox ne supporte pas, du moins officiellement, ce type de système d’exploitation. Vous allez d’ailleurs le remarquer la configuration sera un peu plus ”éxotique” que pour une simple VM sous Linux, BSD ou Windows. Je me suis aussi largement inspiré de cet article Installing macOS 12 “Monterey” on Proxmox 7, que je trouve très complet et assez exhaustif, je n’ai apporté que des modifications à la marge et fait les tests de compatibilité avec ma configuration sous Proxmox v.8.

Prérequis du système hôte

Avant d’entammer les hostilités, je vous fait un petit rappel de ma config matérielle :

  • MOTHERBOARD: ASRock 970 Pro3 R2.0
  • CPU: AMD FX 4300 Quad-Core Processor
  • GPU: SAPPHIRE Pulse Radeon RX 580 8 Go GDDR5

Malheureusement mon CPU, ne répond pas aux prérequis matériel imposé par Apple à partir de macOS Ventura (à savoir la prise en charge d’AVX2). Je vais donc me rabattre sur une version antérieure de macOS, Monterey en l’occurence, qui posera moins de problèmes de compatibilité.

D’ailleur, votre compatibilité matérielle est sans nul doute, la première chose à vérifier si vous souhaiter virtualiser un système macOS, Apple limitant en effet, la quantité de matériel pris en charge. Vous devriez jeter un oeil à cette page ’Hardware limitations - OpenCore’ pour vous assurer que votre matériel est supporté.

Build d’une image d’installation, pour macOS Monterey (sous Linux)

Commençons par installer quelles dépendances :

apt install -y p7zip-full make dmg2img git 

Je récupère le projet git OSX-KVM, puis j’execute fetch-macOS-v2 pour récupérer le DMG d’installation de macOS :

git clone https://github.com/thenickdude/OSX-KVM
cd OSX-KVM 
$ ./fetch-macOS-v2.py
1. High Sierra (10.13)
2. Mojave (10.14)
3. Catalina (10.15)
4. Big Sur (11.7) - RECOMMENDED
5. Monterey (12.6)
6. Ventura (13)

Choose a product to download (1-6): 5

Ensuite il ne me restera plus qu’a faire la convertion de l’image DMG en ISO, et de déplacer l’image convertie dans votre répertoire dédier au stockage des ISO.

dmg2img BaseSystem.dmg monterey-basesystem.iso
mv monterey-basesystem.iso /mnt/pve/PVE1/template/iso/

Je récupère aussi l’ISO OpenCore et la place dans le même répertoire :

wget https://github.com/thenickdude/KVM-Opencore/releases/download/v20/OpenCore-v20.iso.gz && gzip -d OpenCore-v20.iso.gz
mv OpenCore-v20.iso /mnt/pve/PVE1/template/iso/

Création de notre VM macOS

Passons maintenant à la création de notre VM.

 qm create 102 \
    --name mac-102 \
    --vga vmware \
    --memory 8192 \
    --bios ovmf \
    --machine q35 \
    --sockets 1 --cores 4 \
    --cpu Penryn \
    --numa 1 \
    --cpuunits 1024 \
    --net0 virtio,bridge=vmbr0 \
    --scsihw virtio-scsi-pci \
    --boot order='ide2;ide0;virtio0' \
    --ostype other \
    --efidisk0 local-lvm:0 \
    --virtio0 local-lvm:150,cache=unsafe,discard=on, \
    --ide0 PVE1:iso/monterey-basesystem.iso,cache=unsafe \
    --ide2 PVE1:iso/OpenCore-v20.iso,cache=unsafe 

Quelques expliquations sur les points importants de cette commande :

  • ide0 PVE1:iso/monterey-basesystem.iso,cache=unsafe: ide0 contient notre image disque de macos monterey.
  • ide2 PVE1:iso/OpenCore-v20.iso,cache=unsafe: en ide2 l’image iso opencore.
  • boot order=‘ide2;ide0;virtio0’: l’image opencore, doit être en première posistion dans le boot order.
  • vga vmware: on utilisera vmware, le temps de faire l’installation, avant de laisser le GPU gérer seul l’affichage.

Il va nous falloir ajouter quelques lignes supplémentaires à la configuration QEMU, en fonction de votre CPU :

CPU INTEL

qm set 102 --cpu "host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc -device isa-applesmc,osk='ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc'-smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off"

CPU AMD

qm set 102 --cpu "Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+fma4,+bmi1,+bmi2,+xsave,+xsaveopt,+rdrand,check -device isa-applesmc,osk='ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc' -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -global nec-usb-xhci.msi=off -global ICH9
-LPC.acpi-pci-hotplug-with-bridge-support=off"

Cela fait passer votre CPU AMD pour un Intel de la génération Penryn, et ajoute plusieurs fonctionnalités (requises et optionnelles). Les fonctionnalités que votre CPU hôte ne prend pas en charge seront tout simplement ignorées, seul SSE4.2 est nécessaire est doit être pris en charge par votre CPU hôte. Si vous souhaitez vous assurer des fonctionnalités prises en charge par votre CPU entrez cette commande depuis Proxmox :

lscpu | grep -o "^Flags: .*"

Installation de macOS

Maintenant, démarrons notre machine virtuelle :

qm start 102

Depuis la console (noVNC) de Proxmox, appuyez sur «MacOS Base System» targets

Notre disque dur de déstination doit être formaté avant de pouvoir installer le système targets targets

Après avoir quitter l’Utilitaire de disque, lancer la restauration de macOS Monterey et sélection le disque de déstination, et patientez (le process d’installation va être assez long). targets

Au court de l’installation du système la machine virtuelle redémarrera 2 ou 3 fois de suite, il vous faudra à chaque fois re-sélectionner manuellement l’entrée «macOS Installer» pour continuer le processus. Après un énième reboot l’entrée «macOS Installer» disparaît, sélectionnez alors le nom de votre disque de déstination targets

Enfin, procédez à la post-installation classique targets

Customisation OpenCore et partition EFI

En l’état, lors du démarrage du système nous passons nécessairement par l’image OpenCore, pour plus de commodité nous allons l’importer dans la partion EFI de macOS

Depuis votre session macOS, ouvrez le terminal et exécutez «diskutil list» :

% diskutil list
/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         69.8 GB    disk0
   1:                        EFI ⁨EFI⁩                     209.7 MB   disk0s1    #Partition à écraser
   2:                 Apple_APFS ⁨Container disk3⁩         69.6 GB    disk0s2

/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *2.1 GB     disk1
   1:                  Apple_HFS ⁨macOS Base System⁩       2.0 GB     disk1s1

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *157.3 MB   disk2
   1:                        EFI ⁨EFI⁩                     157.2 MB   disk2s1    #Partition à importer

/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +69.6 GB    disk3
                                 Physical Store disk0s2
   1:                APFS Volume ⁨macOS - Data⁩            2.3 GB     disk3s1
   2:                APFS Volume ⁨Preboot⁩                 284.6 MB   disk3s2
   3:                APFS Volume ⁨Recovery⁩                623.4 MB   disk3s3
   4:                APFS Volume ⁨VM⁩                      1.1 MB     disk3s4
   5:                APFS Volume ⁨macOS⁩                   15.3 GB    disk3s5
   6:              APFS Snapshot ⁨com.apple.os.update-...⁩ 15.3 GB    disk3s5s1

Nous allons ensuite utiliser dd pour remplacer la partition la partition EFI sur le disque dur par celle de l’image d’OpenCore. OpenCore est le petit disque (~ 150 Mo) qui ne contient qu’une partition EFI, et le disque dur principal est celui avec la partition “Apple_APFS ⁨Container” (160 Go). Dans mon cas, ces partitions EFI sont désignées comme disk2s1 et disk0s1 :

% sudo dd if=/dev/disk2s1 of=/dev/disk0s1

Ensuite nous allons créer un point de montage vers la partition EFI :

sudo mkdir /Volumes/EFI
sudo mount -t msdos /dev/disk0s1 /Volumes/EFI

Enfin, nous allons éditer le fichiers suivant “config.plist”, pour configurer un timeout pour une boot automatique sur le disque «macOS» :

vim /Volumes/EFI/EFI/OC/config.plist

Dans le fichier rechercher la valeur “BlessOverride” et modifier la valeur de la clé Timeout de 0 à 5

<key>Misc</key>
(...)
    <key>BlessOverride</key>
    (...)
    <key>Boot</key>
    (...)
        <key>Timeout</key>
        <integer>5</integer>

Avant déteindre votre VM, définissez le login automatique pour votre utilisateur principal, depuis “System Preferences/Users & Groups”. Une fois la VM éteinte nous pourrons supprimez les disques OpenCore et Monterey, et s’assurer également que virtio0 est bien le premier disque dans l’ordre de démarrage.

qm set 102 --delete ide2
qm set 102 --delete ide0
qm set 102 --boot order='virtio0'

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, j’ajoute les ID des deux périphériques à ma VM :

Sur l’hôte Proxmox, je fais une recherche dans les 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 102 --usb0 046d:c08b,usb3=1
qm set 102 --usb1 04ca:007d,usb3=1

Enfin j’ajoute la carte graphique, que je définit en tant que GPU primaire, en activant toutes c’est fonctionnalitées :

qm set 102 --hostpci0 0000:01:00,pci=1,x-vga=1

Si tout s’est bien passé, au redémarage de la VM vous devriez voir le menu d’OpenCore s’afficher et booter automatiquement sur votre disque macos. Je n’est pas encore trouver de moyen “propre” de faire passer l’affichage, uniquement par la carte graphique, la désactivation du “VMWare display” empèchant la VM de démarrer. C’est pourquoi je doit manuellement définir un mirroring entre mon “vrai” écran (n’oublier pas de définir ce dernier comme nouvel écran principal) et l’écran virtuel de VMware.

Ressources :