目标:在 iPhone/iPad 上通过 UTM 运行 64 位 Linux 虚拟机(以 Alpine Linux 为例),实现更完整的 Linux 环境,进而运行 Docker 容器,并与 iOS 共享文件。一、为什么不用 iSH,而改用 UTM?
很多人会用 iSH Shell 在 iOS 上“跑 Linux”。但 iSH 本质是模拟 32 位(i386) 的 Alpine Linux:
因此更合适的做法是:用 UTM(基于 QEMU) 跑一个 64 位 Linux 虚拟机。虽然启动会比 iSH 慢一些,但环境完整度和兼容性明显更好。
我这里仍然选择 Alpine Linux:
备注:如果你的设备 RAM ≥ 4GB,并且能启用 JIT,装 Ubuntu Server 等更“重”的系统也是可行的。
二、准备工作:创建 Alpine Linux 虚拟机
1)下载 Alpine Linux 镜像
到 Alpine Linux 官网下载镜像:
官网:
https://www.alpinelinux.org/downloads/
2)安装 UTM 并新建 Linux 虚拟机
安装 UTM App 后,新建 Linux 虚拟机时建议:
RAM:至少 512MB(更大更顺)
存储:至少 8GB
CPU:至少 2 核
启用“强制多核心模式”(如果界面里有该选项)
如果你能给 UTM 启用 JIT,虚拟机速度会明显提升;不方便启用也没关系,用 UTM SE 跑 Alpine 也能勉强使用。
3)安装 Alpine Linux
虚拟机从镜像启动后,按 Alpine 的安装流程执行安装脚本:
setup-alpine
通常 10 分钟左右就能装好。
为了节省资源,可以不装图形界面;装好后启动会直接进入 TTY(纯命令行)。
注意:原文里写的是 seupt-alpine,这里按 Alpine 官方命令更正为 setup-alpine。
三、在 Alpine 里安装 Docker
进入普通用户账号后,在 Alpine 安装 Docker:
sudo apk add docker docker-cli-composesudo addgroup $USER dockersudo rc-update add dockersudo rc-service docker start
如果执行 docker pull 出现 No route to host 之类网络错误,可以尝试设置 DNS:
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
四、从外部 SSH 登录到 UTM 虚拟机
如果你觉得 UTM 自带的 TTY 界面不够顺手,可以用 iSH Shell(或电脑上的 SSH 客户端)通过 SSH 登录虚拟机。
1)在 UTM 里做端口转发
UTM 虚拟机默认网络一般无法被外部直接访问。
做法:在虚拟机的网络设置里新增 端口转发(Port Forwarding):
虚拟机内:22(SSH)
映射到宿主本机:localhost:2022
这样你就可以通过 2022 端口 SSH 进虚拟机。
如果你在虚拟机里跑 Docker 服务并需要对外暴露端口,也请一并配置相应转发规则。
2)在虚拟机里安装并启动 sshd
sudo apk add opensshsudo rc-update add sshdsudo rc-service sshd start
3)用 iSH Shell 登录(同设备)
在 iSH Shell 里执行:
ssh user@localhost -p 2022
即可登录到 UTM 虚拟机。
小提醒:UTM 放到后台可能被 iOS 终止。iPad 上可以用「滑动置前」或「幕前调度」让两个 App 同时前台运行,稳定性会更好。
4)用电脑远程登录(同局域网)
如果你用电脑 SSH 客户端,且 iOS 设备和电脑在同一个网络:
ssh user@<iOS设备的IP> -p 2022
五、iOS 与虚拟机共享文件夹:两种方案
这里介绍两种常见方式:
方案 A:SCP 传文件
1)从虚拟机拷到 iSH Shell
例如把虚拟机的:/home/user/Downloads/file.txt
拷贝到 iSH Shell 的:/root
scp -P 2022 -r user@localhost:/home/user/Downloads/file.txt /root
2)从 iSH Shell 拷到虚拟机
scp -P 2022 -r /root/file.txt user@localhost:/home/user/Downloads/
3)把 iSH Shell 的文件交给其它 App
打开 iOS 的「文件」App,找到 iSH Shell 的目录(通常能看到 root 目录),就能把文件移动/分享给其它应用。
方案 B:VirtFS(9Pfs)共享目录
UTM 的 VirtFS 实现是 VirtIO-9P(9Pfs),不是 VirtIO-FS。
1)在 UTM 设置共享文件夹
编辑虚拟机配置,在共享文件夹里启用 VirtFS (9Pfs),例如把 iOS 的「下载」目录共享给虚拟机。
2)在虚拟机里挂载到 /mnt
sudo mount share -t 9p /mnt
挂载成功后,双方文件即可互通。
六、关于 GPU 加速
iOS 上做 GPU 直通基本不可行。
如果你确实需要更好的图形性能,请了解并使用 UTM 的 virtio-gpu 半虚拟化方案(适用于 Linux 虚拟机的图形加速思路)。