前言
尽管换了 M1 设备也有一年多了,但平时仍然依赖于 x86 平台进行开发,为此不得不单独部署一套 x86 的开发环境在 intel PC 上。
随着 macOS 更新到了 Ventura (13.0.1),以及 UTM 4.0 的更新,现已可以在 Linux 环境下启用 Rosetta 对 x86(含amd64) 应用进行加速。
使用 Rosetta 加速后,在构建项目的速度上甚至几年前的 i7 8700 打得有来有回,比较离谱。
UTM 4.0 更新
支持了以下几个主要的新特性。
- 无头(headless)模式启动
- 将虚拟机的所有显示设备移除,打开虚拟机时便不会弹窗
- 可通过串口设备或通过网络进行访问(太合适服务器系统了
- VirtioFS
- 可用于文件共享,挂载宿主机目录进行访问
- 相较于 cifs, sshfs 等方案,正确了保留原有的 rwx 权限,并可正常执行程序
- Rosetta 加速
- macOS 13 以上可用,通过 VirtioFS 挂载
基于这些特性,第一时间联想到的就是替代 x86 开发环境的可行性;实际上只要 Rosetta 性能上没问题,其它都是小事。
部署流程
- 需要将 macOS 更新到 Ventura 以上的版本,再进行后续操作。
安装 UTM
建议使用非 Beta 版本
安装 Ubuntu
建议使用 LTS 版本
下载完成后打开 UTM,按照以下流程创建虚拟机:
- 选中 Linux 预配置
- 使用 Apple 虚拟化
- Enable Rosetta (x86_64 Emulation)
- 选择下载好的光盘镜像
- 设置硬件参数
- 配置文件共享
创建虚拟机以后,正常流程安装系统便可。
配置 Rosetta 运行环境
基础流程可参照官方手册。(不看也行,本文会进行复读
- 创建 Rosetta 挂载点并完成挂载
$ sudo mkdir /media/rosetta
$ sudo mount -t virtiofs rosetta /media/rosetta
- 配置开机挂载(将内容写入
/etc/fstab
)
rosetta /media/rosetta virtiofs ro,nofail 0 0
- 开启 Rosetta 支持
$ sudo apt install binfmt-support
$ sudo /usr/sbin/update-binfmts --install rosetta /media/rosetta/rosetta \
--magic "\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00" \
--mask "\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
--credentials yes --preserve no --fix-binary yes
到此 Ubuntu ARM 便可以运行 x86_64 程序了。
挂载文件共享
官方手册对于 VirtioFS 的挂载藏的挺深,但其实操作起来很简单。
- 创建挂载点并完成挂载
$ sudo mkdir /media/share
$ sudo mount -t virtiofs share /media/share
在 UTM 配置的共享目录,会统一存放在 share 目录下。
- 配置开机挂载(将内容写入
/etc/fstab
)
share /media/share virtiofs rw,nofail 0 0
配置 Ubuntu x86 开发环境
目前虽然可以使用 Ubuntu ARM 来运行 x86 程序,但是与实际的生产环境差异太大了,也并不适合作为开发环境使用。
- Q: 那么有没有一种方案,可以使用完整的 Ubuntu x86 及其配套设施呢?
- A: 参考本人年前所写的文章,使用 Chroot 部署一套 Ubuntu 子系统便可。
后话
尝试了使用 Jetbrains Gateway 进行 x86 开发,体验尚佳。
由于需求不是在上面运行 IDE,而仅仅是在上面完成项目编译,所以最后还是卸载了。
但总的来说,能跑起来 IDE,或许这套方案兼容性还算不错?