创建与运行虚拟机
在终端中用 vphone-cli 创建、启动和停止虚拟机。不使用 Launchpad、用脚本创建虚拟机,或者需要重复执行流程中的某个阶段时,请参阅本页。
Launchpad 通过 VPhone.bundle 中的 vphone-cli 管理虚拟机;同样的命令也可以在终端中使用:
虚拟机保存在 ~/.vphone/。运行 vphone-cli <group> --help 查看全部命令。
创建虚拟机
你需要一个 iPhone17,3 恢复 IPSW 和一个兼容的 PCC/cloudOS IPSW,可以是本地路径或 URL。兼容性列出了目前已验证的组合。
创建过程依次经过以下阶段:准备、固件补丁、在线 DFU 恢复、在宿主机上装载并安装 CFW、首次图形界面启动。
- 需要联网获取恢复票据。
- 安装 CFW 需要 root 权限。bundle 不带授权对话框或提权辅助程序,因此需要你自己提供 root 权限。
- 默认虚拟磁盘为 64 GB。
成功时会以 [+] First boot: vphoned ping succeeded. 和 CFW VM created; vphoned connected. Guest user environment is untouched. 结束。之后虚拟机会停止:这次 ping 证明 vphoned 在该次启动中作出了响应,同时不会留下运行中的虚拟机。
选项
--cpu、--memory、--network 和 --unlock-at-startup 会为新虚拟机设置与 vm config 相同的配置项。
模板
默认情况下,流程会先构建一个模板,再从模板克隆出虚拟机。之后对同一设备、同一 iOS 和 cloudOS 构建版本、同一预设和磁盘大小运行 vm create 时,会直接从该模板克隆,不再重新恢复。传入 --no-template 可单独构建虚拟机。
补丁与固件准备
固件流程只有一种模式。它为启动链和客户机系统打补丁,安装 vphoned,用户环境保持为空:不会安装 Sileo、apt、TrollStore、SSH 服务器或 VNC 服务器。补丁预设决定应用哪些补丁;vphone-cli fw set-patches 配合 --block 或 --allow 可以单独关闭或开启某个补丁。
打补丁之前,创建流程会先准备固件:一次临时的 cloudOS 恢复用于提供 GPU 驱动,不含 vphone600 组件的 cloudOS 需要重新构建 kernelcache。见固件准备。要从一份列表创建多台虚拟机,请参阅批量创建虚拟机。
启动与停止
vm launch 启动客户机时不等待 vphoned;该守护进程会在启动过程中连接。虚拟机窗口和菜单提供主屏幕键和电源键、App 安装和文件浏览。vm launch --headless 启动时不显示虚拟机窗口和菜单栏。
以下操作都会正常关闭客户机(vphoned system.shutdown):
- 关闭虚拟机窗口
- ⌘Q
vm stop- 在运行
vm launch的终端中按 Control-C
客户机停止后虚拟机即结束;如果 15 秒后仍未停止,也会结束。vphoned 无法代为响应的客户机(例如处于 DFU 或仍在启动中)会像拔掉电源一样立即关闭。再按一次 Control-C 会直接关闭,不再等待。
vm stop 只向虚拟机自己的进程发送信号,即 vphone-vm 和 Virtualization 的虚拟机服务。其他打开了磁盘的程序(例如正在计算磁盘大小的 Launchpad、聚焦或备份工具)会被列出名称,但不会被终止。
控制套接字
每台运行中的虚拟机在其文件夹中都有一个控制套接字 vphone.sock(~/.vphone/machines/<name>/vphone.sock):输入一行 JSON,返回一行 JSON。多个连接可以同时处理;没有窗口的虚拟机也有这个套接字,此时 tap 和 swipe 通过 vphoned 的触摸注入实现,屏幕图像来自客户机。
除了 tap、swipe、key 和 screenshot,rpc 请求可以调用 API 参考中的任何 vphoned 方法:
例如,input.key 配合 {"name":"cmd+v"} 可以粘贴,input.type 可以输入文本。这个流程不会安装 SSH 或 VNC 端点。需要 HTTP 和 WebSocket 访问时,请参阅自动化 API。
手动运行各个阶段
排查问题或重复某个阶段时使用。restore 与虚拟机通信期间,要让 DFU 启动保持运行:
在线恢复会在进程内获取票据。离线恢复请参阅 vphone-cli restore --help 中的 --get-shsh 和 --offline。手动流程不会像 vm create 那样执行首次启动的 ping 检查。