Cómo eludir el límite de 2 máquinas virtuales en Apple Silicon (2023)
(khronokernel.com)- En macOS basado en Apple Silicon, Virtualization.framework limita a un máximo de 2 VM de macOS ejecutables, con base en una cláusula del contrato de licencia de uso de macOS
- El análisis mostró que este límite se gestiona mediante la variable privada
hv_apple_isa_vm_quotadentro del kernel XNU, y que puede sobrescribirse mediante argumentos de arranque - Para eludir la verificación de
AppleInternalde System Integrity Protection, se utiliza un procedimiento para compilar e iniciar con un kernel de desarrollo (Development Kernel) - Tras la configuración, se logró ejecutar hasta 9 VM de macOS al mismo tiempo en UTM, Viable y Parallels
- Llama la atención que Apple haya dejado en el kernel una función para sobrescribir el límite de VM, y se plantean posibles mejoras futuras mediante herramientas de automatización o extensiones del kernel
Proceso para quitar el límite de 2 máquinas virtuales de macOS en Apple Silicon
- Al ejecutar máquinas virtuales de macOS con Virtualization.framework en una Mac basada en Apple Silicon, existe una restricción que solo permite ejecutar hasta 2 VM al mismo tiempo
- Esta restricción está configurada conforme a la cláusula 2.B.iii del contrato de licencia de software (SLA) de macOS
- Dicha cláusula permite ejecutar hasta 2 instancias de macOS únicamente para desarrollo, pruebas, uso de macOS Server o uso personal no comercial
- El análisis mostró que esta restricción está implementada en una zona privada del kernel (XNU), no en espacio de usuario
- El kernel de Intel no contiene el mismo código, y en el kernel de Apple Silicon el grupo de funciones
hv_vm_*se encarga del stack de virtualización - La variable
hv_apple_isa_vm_quotadentro del código de inicializaciónhv_init()gestiona la cantidad de VM, incrementándose o decrementándose al crear o eliminar VM - En el kernel existen los argumentos de arranque
hypervisor=yhv_apple_isa_vm_quota=; el segundo permite sobrescribir el límite de VM
- El kernel de Intel no contiene el mismo código, y en el kernel de Apple Silicon el grupo de funciones
- En el kernel de lanzamiento, en lugar del argumento
hypervisor, la restricción queda sujeta a la verificaciónAppleInternalde System Integrity Protection (SIP)- El argumento
hv_apple_isa_vm_quotasolo se aplica cuando está activada la banderaCSR_ALLOW_APPLE_INTERNAL - Para eludir esto, se utilizó el método de arrancar con el kernel de desarrollo (Development Kernel) de Apple
- El argumento
Compilación de la colección de kernel de desarrollo
- Es necesario descargar e instalar el Kernel Debug Kit (KDK) desde el sitio de Apple Developer
- El KDK debe coincidir exactamente con la compilación de macOS del host; si no coincide, pueden producirse errores de enlace del kernel y de los kext, así como fallos de arranque
- Tras verificar la arquitectura del kernel con el comando
uname, se usakmutil createpara generar una colección de kernel de desarrollo (VirtualMachine.kc)- En el ejemplo se usa macOS 14.0 (build 23A5301h) y el kernel T6020
- La opción
--variant-suffix developmentespecifica el kernel de desarrollo e incluye varios repositorios de extensiones del sistema
Configuración de arranque del kernel de desarrollo
- Después de apagar la Mac, se arranca en modo de recuperación (recoveryOS) y se realiza la siguiente configuración desde Terminal
- Desactivar System Integrity Protection (
csrutil disable) - Quitar la restricción de argumentos de arranque (
bputil --disable-boot-args-restriction) - Especificar la colección de kernel personalizada (
kmutil configure-boot) - Configurar los argumentos de arranque (pasados con el comando
nvram)kcsuffix=development: arranque con kernel de desarrollohypervisor=0x1: activa funciones especiales del stack de virtualizaciónhv_apple_isa_vm_quota=0xFF: establece el máximo de VM en 255
- Desactivar System Integrity Protection (
- Después de reiniciar, puede verificarse la aplicación con
sysctl kern.osbuildconfigynvram boot-args
Resultado de la ejecución de múltiples VM
- Tras completar la configuración, se realizaron pruebas con soluciones basadas en Virtualization.framework como UTM, Viable y Parallels
- En una MacBook Pro M2 Pro se logró ejecutar 9 VM de macOS al mismo tiempo
- El sistema seguía funcionando a un nivel todavía utilizable para pruebas
Momento en que se añadió la función y estructura interna
- El argumento de arranque
hv_apple_isa_vm_quotase añadió junto con el stack de Virtualization desde macOS 12 Monterey- En versiones posteriores, incluida macOS Sonoma, la verificación
AppleInternalsigue presente - Esto confirma que Apple mantiene varias funciones privadas dentro de XNU
- En versiones posteriores, incluida macOS Sonoma, la verificación
Precauciones al actualizar el sistema operativo
- Al usar una colección de kernel personalizada, la función de actualización automática del sistema operativo queda desactivada
- Después de una actualización se producen errores, por lo que es necesario restaurar la colección de kernel predeterminada
- En modo de recuperación, puede volver al kernel predeterminado creando una nueva política de arranque con
bputil - Ejemplo: usar las opciones
bputil --full-securityo--disable-boot-args-restriction
Cierre e ideas de mejora futura
- Se verificó experimentalmente la forma en que Apple implementa la restricción de VM y un método no oficial para quitarla
- Aunque el equipo de Virtualization no lo documenta oficialmente, llama la atención que hayan dejado en el kernel una función para sobrescribir el límite de VM
- Posibles mejoras futuras
- Desarrollo de una herramienta para automatizar la compilación de KC y el arranque
- Soporte para generar automáticamente la colección de kernel de desarrollo por host y configurar el modo de recuperación
- Implementación de una función para sobrescribir la variable
hv_apple_isa_vm_quotamediante una extensión del kernel (kext)- Explorar la posibilidad de quitar la restricción sin arrancar con un kernel de desarrollo
- Desarrollo de una herramienta para automatizar la compilación de KC y el arranque
- Como próximo tema de investigación, se planea explorar la posibilidad de registrar DEP y sobrescribir el número de serie en VM de Apple Silicon
1 comentarios
Opiniones de Hacker News
Este tipo de límite que se aplica igual a todas las Mac es demasiado irracional
Si compraste una Mac más potente, deberías poder virtualizar más instancias de macOS
Por ejemplo, algo como limitar a 2 en la M5, 4 en la M5 Pro y 8 en la M5 Max sonaría razonable
El rendimiento del hardware ya es un límite natural, así que el usuario se detendría por su cuenta
Lo más probable es que sea una medida para impedir servicios baratos de Mac VPS
Hyper‑V puede ejecutar hasta 1024 VM al mismo tiempo si el hardware lo soporta
Incluso en mi pequeña laptop Windows ARM puedo correr 4 sin problemas
Ejecuté una VM para probar openclaw, pero me desconcertó que el acceso a iCloud y App Store estuviera restringido
Es interesante que Mykola Grymalyuk entró a trabajar en Apple dos años después de escribir esta entrada de blog
Me hace pensar en el meme de “o mueres como héroe…”
Desde la M3 en adelante se pueden correr VM anidadas usando Hypervisor.framework / Virtualization.framework
Sería bastante divertido si eso pudiera servir para saltarse esta limitación
macOS solo llega a un nivel, así que no se puede iniciar otro invitado macOS dentro de un invitado macOS
Me da flojera, pero ojalá alguien lo pruebe
De verdad me intriga por qué Apple puso este límite
Las ventas de hardware financian el desarrollo del software, así que no quieren que alguien use macOS sin haber comprado hardware
Para Apple, mantener el control es más importante que la libertad del usuario
Sorprende que se pueda compilar un kernel personalizado, arrancarlo y hasta levantar la GUI
El artículo en sí es realmente interesante, pero es raro usar como plataforma de desarrollo algo con este tipo de limitaciones arbitrarias
Muchos desarrolladores la usan por el hardware de gama alta, pero macOS siempre ha sido “casi Linux, pero bajo el control de una empresa centrada en iTunes”
Dicen que usar una colección de kernels personalizada en Apple Silicon hace imposible recibir actualizaciones automáticas del sistema operativo
Pero quizá eso incluso sea una bendición disfrazada
Me pregunto si esto también podría funcionar en lume
Actualmente tiene una limitación parecida
Tengo entendido que lume es un wrapper delgado sobre el Virtualization.framework de Apple
Escuché que también se puede sin kernel personalizado si desactivas SIP y configuras argumentos de arranque
¿Apple limitó las VM a 2?
Los invitados con otros sistemas operativos se pueden ejecutar sin límite