Hacker News 中文摘要

RSS订阅

苹果芯片与虚拟机:突破双虚拟机限制(2023) -- Apple Silicon and Virtual Machines: Beating the 2 VM Limit (2023)

文章摘要

文章介绍了如何在Apple Silicon芯片上突破macOS虚拟机的2个限制,通过开发内核集合和配置系统来运行更多虚拟机,并分享了作者作为Mac管理员实习生的相关经验。

文章总结

标题:突破苹果芯片虚拟机的双开限制:技术探索与实践

来源:KhronoKernel博客(2023年8月8日)

核心内容:

  1. 问题背景
  • 作者在开发测试中发现苹果芯片(M1/M2)存在严格限制:同一主机最多只能同时运行2个macOS虚拟机
  • 该限制源于macOS软件许可协议(SLA)的条款规定
  • 系统错误提示:"虚拟机器数量超过限制"(VZError.Code.virtualMachineLimitExceeded)
  1. 技术分析
  • 通过逆向工程发现限制机制位于XNU内核层(非用户空间的Virtualization.framework)
  • 关键变量:hvappleisavmquota(虚拟机配额计数器)
  • 发现两个隐藏启动参数:
    • hypervisor=1(功能开关)
    • hvappleisavmquota=数值(配额设置)
  1. 解决方案实施
  • 需使用开发版内核(需下载对应KDK调试套件)
  • 具体步骤: a) 构建开发版内核集合(Kernel Collection) b) 进入恢复模式配置:
    • 关闭系统完整性保护(SIP)
    • 解除启动参数限制
    • 设置自定义启动参数(示例设置为255个VM配额)
  1. 实际效果
  • 作者成功在M2 Pro MacBook Pro上同时运行9个macOS虚拟机
  • 系统性能表现稳定(甚至触发了风扇运转)
  1. 注意事项
  • 该修改会影响系统更新流程
  • 更新前需恢复原始启动策略:
    • 通过恢复模式的bputil工具重置
  1. 技术细节补充
  • 该特性自macOS Monterey(12.0)已存在
  • 正式版内核增加了AppleInternal检查机制
  • 开发版内核移除了该限制检查
  1. 未来展望
  • 建议开发自动化工具简化内核集合构建流程
  • 探索通过内核扩展(kext)动态修改配额的可能性
  • 计划研究Apple Silicon虚拟机的设备注册(DEP)和序列号重写技术

注:本文技术方案主要面向开发测试场景,商业使用仍需遵守苹果相关许可协议。

评论总结

评论总结:

  1. 对苹果限制虚拟机数量的质疑
  • 认为限制不合理,建议根据Mac性能分级设置不同限制(评论1:"if you buy a more powerful Mac they should let you virtualize more Mac instances")
  • 指出这种限制在开发平台上显得奇怪(评论2:"the existence of such an arbitrary limit on any serious development platform is weird")
  1. 技术替代方案的讨论
  • 提到M3+芯片可通过Hypervisor框架创建嵌套虚拟机(评论5:"use Hypervisor.framework/Virtualization.framework to spin up nested VMs")
  • 指出关闭SIP可能绕过限制(评论7:"turn off sip and set the boot argument that controls it")
  1. 对苹果控制策略的批评
  • 对比其他科技公司,批评苹果对硬件使用的限制(评论6:"cannot even run an app on their mobile platform without Apple's permission")
  • 对自定义内核的讨论(评论8:"crazy that you can compile a custom kernel and it'll boot")
  1. 其他相关疑问
  • 询问该限制是否适用于Lume框架(评论3:"Can this work with lume as well?")
  • 好奇苹果设置限制的原因(评论4:"why did Apple put such a limitation?")
  1. 对系统更新限制的看法
  • 认为自定义内核导致无法自动更新可能是好事(评论9:"This might be a blessing in disguise")