使用 Rosetta 建立 Ubuntu x86 开发环境

版权声明:本文为博主原创文章,转载请注明出处。

前言

尽管换了 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,按照以下流程创建虚拟机:

  1. 选中 Linux 预配置
  2. 使用 Apple 虚拟化
  3. Enable Rosetta (x86_64 Emulation)
  4. 选择下载好的光盘镜像
  5. 设置硬件参数
  6. 配置文件共享

创建虚拟机以后,正常流程安装系统便可。

配置 Rosetta 运行环境

基础流程可参照官方手册。(不看也行,本文会进行复读

  • 创建 Rosetta 挂载点并完成挂载
1
2
$ sudo mkdir /media/rosetta
$ sudo mount -t virtiofs rosetta /media/rosetta
  • 配置开机挂载(将内容写入/etc/fstab
1
rosetta	/media/rosetta	virtiofs	ro,nofail	0	0
  • 开启 Rosetta 支持
1
2
3
4
5
$ 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 的挂载藏的挺深,但其实操作起来很简单。

  • 创建挂载点并完成挂载
1
2
$ sudo mkdir /media/share
$ sudo mount -t virtiofs share /media/share

在 UTM 配置的共享目录,会统一存放在 share 目录下。

  • 配置开机挂载(将内容写入/etc/fstab
1
share	/media/share	virtiofs	rw,nofail	0	0

配置 Ubuntu x86 开发环境

目前虽然可以使用 Ubuntu ARM 来运行 x86 程序,但是与实际的生产环境差异太大了,也并不适合作为开发环境使用。

  • Q: 那么有没有一种方案,可以使用完整的 Ubuntu x86 及其配套设施呢?
    • A: 参考本人年前所写的文章,使用 Chroot 部署一套 Ubuntu 子系统便可。

后话

尝试了使用 Jetbrains Gateway 进行 x86 开发,体验尚佳。

由于需求不是在上面运行 IDE,而仅仅是在上面完成项目编译,所以最后还是卸载了。

但总的来说,能跑起来 IDE,或许这套方案兼容性还算不错?

Comments