- Sur macOS basé sur Apple Silicon, Virtualization.framework limite à un maximum de 2 VM macOS exécutables, conformément à une clause du contrat de licence macOS
- L’analyse montre que cette limite est gérée par la variable privée
hv_apple_isa_vm_quotaà l’intérieur du noyau XNU, et qu’elle peut être redéfinie via des arguments de démarrage - Pour contourner la vérification
AppleInternalde System Integrity Protection, une procédure consistant à compiler et démarrer un noyau de développement (Development Kernel) est utilisée - Après configuration, il a été possible d’exécuter jusqu’à 9 VM macOS simultanément dans UTM, Viable, Parallels, etc.
- Le fait qu’Apple ait laissé dans le noyau une fonction de redéfinition de la limite de VM est notable, et ouvre la voie à de futures améliorations via des outils d’automatisation ou des extensions du noyau
Processus de suppression de la limite de 2 VM macOS sur Apple Silicon
- Sur les Mac Apple Silicon, lors de l’exécution de machines virtuelles macOS avec Virtualization.framework, il existe une limite à 2 instances maximum
- Cette limite est définie conformément à la clause 2.B.iii du contrat de licence logicielle macOS (SLA)
- Cette clause autorise l’exécution d’au maximum 2 instances de macOS pour le développement, les tests, l’utilisation de macOS Server et un usage personnel non commercial
- L’analyse montre que cette limite est implémentée non pas en espace utilisateur mais dans une zone privée du noyau XNU
- Le noyau Intel ne contient pas le même code, et c’est la famille de fonctions
hv_vm_*du noyau Apple Silicon qui prend en charge la pile de virtualisation - La variable
hv_apple_isa_vm_quotadans le code d’initialisationhv_init()gère le nombre de VM, avec incrémentation et décrémentation lors de la création et de la suppression des VM - Le noyau accepte les arguments de démarrage
hypervisor=ethv_apple_isa_vm_quota=, ce dernier permettant de redéfinir la limite de VM
- Le noyau Intel ne contient pas le même code, et c’est la famille de fonctions
- Dans le noyau de release, l’usage de l’argument
hypervisorest restreint par la vérificationAppleInternalde System Integrity Protection (SIP)- L’argument
hv_apple_isa_vm_quotan’est pris en compte que si le drapeauCSR_ALLOW_APPLE_INTERNALest activé - Pour contourner cela, la méthode utilisée consiste à démarrer le noyau de développement d’Apple (Development Kernel)
- L’argument
Compilation d’une collection de noyau de développement
- Il faut télécharger et installer le Kernel Debug Kit (KDK) depuis le site Apple Developer
- Le KDK doit correspondre exactement à la build macOS de l’hôte, sinon des erreurs de liaison du noyau et des kexts, ainsi que des échecs de démarrage, peuvent se produire
- Après avoir vérifié l’architecture du noyau avec la commande
uname, on utilisekmutil createpour générer une collection de noyau de développement (VirtualMachine.kc)- L’exemple utilise macOS 14.0 (build 23A5301h) et le noyau T6020
- L’option
--variant-suffix developmentpermet de sélectionner le noyau de développement, en incluant plusieurs dépôts d’extensions système
Configuration du démarrage sur le noyau de développement
- Après avoir éteint le Mac, il faut démarrer en mode de récupération (recoveryOS) puis effectuer les réglages suivants dans le terminal
- Désactiver System Integrity Protection (
csrutil disable) - Lever la restriction sur les arguments de démarrage (
bputil --disable-boot-args-restriction) - Spécifier la collection de noyau personnalisée (
kmutil configure-boot) - Définir les arguments de démarrage (transmis via la commande
nvram)kcsuffix=development: démarrage sur le noyau de développementhypervisor=0x1: activation de fonctions spéciales de la pile de virtualisationhv_apple_isa_vm_quota=0xFF: définit le nombre maximal de VM à 255
- Désactiver System Integrity Protection (
- Après redémarrage, on peut vérifier l’application des réglages avec
sysctl kern.osbuildconfigetnvram boot-args
Résultat de l’exécution de plusieurs VM
- Une fois la configuration terminée, des tests ont été menés avec des solutions basées sur Virtualization.framework comme UTM, Viable et Parallels
- Sur un MacBook Pro M2 Pro, il a été possible d’exécuter 9 VM macOS simultanément
- Le système restait encore utilisable à un niveau acceptable pour les tests
Moment d’ajout de la fonctionnalité et structure interne
- L’argument de démarrage
hv_apple_isa_vm_quotaa été ajouté avec la pile Virtualization à partir de macOS 12 Monterey- Dans les versions ultérieures, y compris macOS Sonoma, la vérification
AppleInternalest toujours présente - Cela confirme qu’Apple maintient plusieurs fonctions privées à l’intérieur de XNU
- Dans les versions ultérieures, y compris macOS Sonoma, la vérification
Points d’attention lors des mises à jour de l’OS
- L’utilisation d’une collection de noyau personnalisée désactive les mises à jour automatiques de l’OS
- Des erreurs surviennent après mise à jour, il faut donc restaurer la collection de noyau par défaut
- En mode de récupération, on peut revenir au noyau par défaut en générant une nouvelle politique de démarrage avec
bputil - Par exemple :
bputil --full-securityou l’option--disable-boot-args-restriction
Conclusion et pistes d’amélioration
- L’implémentation par Apple de la limite de VM a été identifiée, et une méthode non officielle mais fonctionnelle de suppression de cette limite a été validée expérimentalement
- Il est notable que, même sans documentation officielle de l’équipe Virtualization, Apple ait laissé dans le noyau une fonction de redéfinition de la limite de VM
- Pistes d’amélioration envisagées
- Développement d’un outil d’automatisation pour la compilation de KC et la configuration du démarrage
- Génération automatique de collections de noyau de développement selon l’hôte et prise en charge de la configuration en mode de récupération
- Implémentation d’une fonction de redéfinition de la variable
hv_apple_isa_vm_quotavia une extension du noyau (kext)- Explorer la possibilité de lever la limite sans démarrer sur un noyau de développement
- Développement d’un outil d’automatisation pour la compilation de KC et la configuration du démarrage
- Le prochain sujet de recherche portera sur la possibilité d’enregistrer les VM Apple Silicon dans DEP et de redéfinir le numéro de série
1 commentaires
Commentaires sur Hacker News
Ce genre de limitation, appliquée de la même façon à tous les Mac, est totalement irrationnelle
Si on a acheté un Mac plus puissant, on devrait pouvoir virtualiser davantage d’instances de macOS
Par exemple, une limite de 2 pour un M5, 4 pour un M5 Pro et 8 pour un M5 Max semblerait plus logique
Les performances matérielles constituent déjà une limite naturelle, donc l’utilisateur s’arrêterait de lui-même
C’est probablement une mesure destinée à empêcher les services VPS Mac bon marché
Hyper‑V peut exécuter jusqu’à 1024 VM simultanément si le matériel le permet
Même sur mon petit portable Windows ARM, je peux en faire tourner 4 sans difficulté
J’ai lancé une VM pour tester openclaw, puis j’ai été surpris de voir que l’accès à iCloud et à l’App Store était restreint
Il est intéressant de voir que Mykola Grymalyuk a rejoint Apple deux ans après avoir écrit cet article de blog
Ça rappelle le mème « mourir en héros ou… »
À partir de la puce M3, il est possible d’exécuter des VM imbriquées via Hypervisor.framework / Virtualization.framework
Si cela permet de contourner la limitation, ce serait assez amusant
macOS est limité à un seul niveau, donc on ne peut pas lancer un autre guest macOS à l’intérieur d’un guest macOS
Je suis trop paresseux pour tester, mais j’aimerais bien que quelqu’un le fasse
Je me demande vraiment pourquoi Apple a imposé cette limitation
Les ventes de matériel financent le développement du logiciel, donc Apple ne veut pas que des personnes utilisent macOS sans acheter le matériel
Pour Apple, garder le contrôle passe avant la liberté de l’utilisateur
C’est impressionnant de pouvoir compiler un kernel personnalisé, démarrer dessus et aller jusqu’à lancer l’interface graphique
L’article lui-même est vraiment intéressant, mais c’est étrange d’utiliser pour le développement une plateforme avec ce type de limitations arbitraires
Beaucoup de développeurs l’utilisent pour son matériel haut de gamme, mais macOS a toujours été « presque Linux, sauf que l’OS reste contrôlé par une entreprise centrée sur iTunes »
Il paraît qu’avec une collection de kernels personnalisés sur Apple Silicon, les mises à jour automatiques de l’OS deviennent impossibles
Mais au fond, cela pourrait être une bénédiction déguisée
Je me demande si cela pourrait aussi fonctionner avec lume
Il y a actuellement une limitation similaire
De ce que je comprends, lume est un wrapper léger autour de la Virtualization.framework d’Apple
J’ai entendu dire qu’en désactivant SIP et en définissant des arguments de boot, c’était possible même sans kernel personnalisé
Apple a limité les VM à 2 ?
Les guests d’autres OS peuvent être exécutés sans limitation