vphone-cli构建失败排查指南:zsh: killed 与 Virtualization 不可用的两大根因
【免费下载链接】vphone-cli项目地址: https://gitcode.com/GitHub_Trending/vp/vphone-cli
vphone-cli 是一个基于 Apple Virtualization.framework 的虚拟 iPhone 启动工具,可在 Apple Silicon Mac 上引导完整的 iOS 虚拟机。新手构建或运行它时,最常卡在两个报错:zsh: killed和Virtualization is not available on this hardware。本文用最短路径讲清这两个错误的根因与修复步骤,让你一次跑通构建流程。
两大报错速查表 🧭
| 报错信息 | 根因 | 修复方向 |
|---|---|---|
zsh: killed ./vphone-cli | 宿主机 SIP/AMFI 限制未绕过,签名二进制的私有虚拟化授权被系统杀掉 | 设置 boot-arg 或启用 amfidont 白名单 |
Virtualization is not available on this hardware | 你的 Mac 本身就是一台虚拟机(嵌套虚拟) | 换到物理 Mac 上使用 |
两者都发生在宿主机环境层面,与代码、网络、依赖无关——所以先别怀疑自己的构建命令。
根因一:zsh: killed是 AMFI 在拦截 ⚠️
为什么进程会被直接 killed
vphone-cli 的签名文件携带了一组私有授权,例如 sources/vphone.entitlements 中的com.apple.private.virtualization与com.apple.private.virtualization.security-research。普通 macOS 的 AMFI(Mobile File Integrity 安全机制)默认拒绝未签名/私有授权二进制运行,进程会被内核直接以SIGKILL杀掉,zsh 就打印出zsh: killed。
换句话说:编译成功了、签名也成功了,是系统策略不允许它启动。项目自带的预检脚本 scripts/boot_host_preflight.sh 也明确提示:若签名二进制退出码为 137(signal 9),即代表宿主机尚未放行这些授权。
方案 A:boot-arg 放行(最宽松)
在恢复模式(长按电源键 → 终端)执行:
csrutil disable csrutil allow-research-guests enable重启进入 macOS 后设置 AMFI 启动参数,再重启一次:
sudo nvram boot-args="amfi_get_out_of_my_way=1 -v"方案 B:amfidont 白名单(保留 SIP)
如果不想完全关闭 SIP,可只放宽 debug 权限,再用 amfidont 把项目二进制加入白名单:
csrutil enable --without debug # 恢复模式下 csrutil allow-research-guests enable然后直接运行项目封装好的脚本,它会自动以 daemon 模式启动 amfidont 并覆盖项目路径:
make amfidont_allow_vphone对应源码为 scripts/start_amfidont_for_vphone.sh,原理很简单:amfidont daemon --path 项目根目录 --spoof-apple,让签名后的 vphone-cli 被"放行"执行。
根因二:Virtualization 不可用 = 你在嵌套虚拟机里 🚫
报错含义
当你看到Virtualization is not available on this hardware,根因只有一个:你当前的 Mac 本身就运行在虚拟机里。vphone-cli 依赖 PV=3 级别的研究型虚拟机启动能力,而这种能力无法在虚拟机内再嵌套一层。
项目通过两个信号判断这一点(见 scripts/boot_host_preflight.sh 的预检逻辑):
sysctl -n kern.hv_vmm_present返回1(该 sysctl 由 Virtualization.framework 在访客设备树中植入,物理机上为 0);- 机型名称是
Apple Virtual Machine 1(典型嵌套 VM 标识)。
只要命中其一,就会直接判定"Virtualization.framework guest boot is unavailable"。
解决办法:换一台物理 Mac
✅ 满足以下条件的宿主机即可:
- Apple Silicon 芯片
- macOS 15(Sequoia)及以上
- 物理机,不是任何虚拟化环境(包括云桌面、UVM 等嵌套场景)
⚠️ 注意:这不是配置问题,在嵌套 VM 里调整任何参数都无法解决,唯一解法就是换宿主机。
一键自检:用 preflight 脚本定位问题 🔍
修复前建议先跑一次自检,它会完整输出宿主机型号、hv_vmm_present值、SIP 状态、boot-args、签名授权与策略评估:
make boot_host_preflight输出中重点看两行:
kern.hv_vmm_present: 1→ 嵌套 VM,命中根因二;- 签名二进制
exit=137→ AMFI 拦截,命中根因一。
修复后的完整构建流程 ✅
在物理 Mac上按以下步骤走一遍即可:
git clone --recurse-submodules https://gitcode.com/GitHub_Trending/vp/vphone-cli cd vphone-cli ./scripts/setup_tools.sh # 安装依赖、构建工具链子模块、创建 Python venv ./scripts/build.sh # 构建并签名 vphone-cli、打包 .app、交叉编译 vphoned验证是否成功:
cd .build/vphone-cli.app/Contents/MacOS/ ./vphone-cli --help # 不再出现 zsh: killed,即为通过如果一切顺利,你就可以创建第一台虚拟机了:
vphone-cli vm create myphone -V jb # 端到端:下载→打补丁→DFU 恢复→CFW 安装→首次启动 vphone-cli vm launch myphone小结
| 症状 | 一句话根因 | 一句话修复 |
|---|---|---|
zsh: killed | AMFI 拒绝私有虚拟化授权 | amfi_get_out_of_my_way=1或make amfidont_allow_vphone |
Virtualization is not available | 宿主机是嵌套虚拟机 | 换物理 Apple Silicon Mac(macOS 15+) |
两个报错都与你的代码无关,属于宿主机环境门槛。按本文顺序检查 SIP/AMFI 状态与宿主机类型,基本可以一次定位问题所在。
【免费下载链接】vphone-cli项目地址: https://gitcode.com/GitHub_Trending/vp/vphone-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考