在 MacOS 上假造化 x86Linux 的最佳方法(通过 Rosetta)

[复制链接]
发表于 2026-10-4 17:11:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

M 系列芯片的 Mac 上跑 x86 Linux,最直接的思路是借用 Rosetta 的原生转译,而不是再套一层 qemu。UTM 支持在 ARM 虚拟机里通过 Rosetta 跑 Intel 程序,配置完 binfmt_misc 之后,ARM 架构的 Linux 里可以直接执行 x86_64 的二进制。这篇记录 UTM 方案的全部步骤:下 ARM 镜像、开虚拟化与 Rosetta、挂载 rosetta、注册 binfmt、换国内源、跑一个 multilib 的示例程序。

一、环境要求

  • MacOS 13 及以上(要用 Apple 虚拟化 + Rosetta);
  • M 系列芯片(M1/M2/M3 等 ARM Mac);
  • UTM 最新版(支持 Apple 虚拟化与 Rosetta 开关)。

参考 material:Apple 开发者文档「Running Intel Binaries in Linux VMs with Rosetta」、UTM 的 Rosetta 说明,以及社区里那篇「M 系列处理器上的 Linux 虚拟机内 Rosetta 转译初体验」。

二、准备 ARM 版系统镜像

wget https://cdimage.ubuntu.com/releases/22.04/release/ubuntu-22.04.3-live-server-arm64.iso

关键点:必须下 ARM 版镜像,Mac 上跑的是 ARM 虚拟机。用 Ubuntu 这类 Debian 系最省事,rpm 系列的发行版装 Rosetta 依赖会麻烦些。

三、在 UTM 里建虚拟机

  • 新建虚拟机时勾选「虚拟化」、勾选「Apple 虚拟化」,并启用 Rosetta;
  • 把上面下载的 ISO 选为启动镜像;
  • 启动后按引导一步步装完系统;
  • 装完先 poweroff,把 ISO 移除,再开机进入系统。

若 UTM 界面显示不正常,可以用 iTerm 走 SSH 连进去(安装完成时的 help 界面会给出密钥与地址)。

四、配置 Rosetta

1. 装辅助包

sudo apt install binfmt-support
sudo apt install spice-vdagent      # 剪贴板共享

2. 挂载 rosetta

sudo mkdir /mnt/rosetta
sudo mount -t virtiofs rosetta /mnt/rosetta

同时写进 /etc/fstab:

rosetta /mnt/rosetta virtiofs ro,nofail 0 0

3. 注册 binfmt

让内核认识「这个 ELF 是 x86-64 的,交给 rosetta 解释执行」:

sudo /usr/sbin/update-binfmts --install rosetta /mnt/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

验证:

cat /proc/sys/fs/binfmt_misc/rosetta

输出里 enabled 为 enabled、interpreter 指向 rosetta 路径、flags 带 OCF,就说明注册成功了。

五、换国内源

ARM 版 Ubuntu 要用 ubuntu-ports 镜像(架构不同,源地址不能照抄 x86 的那套):

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/jammy-backports main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports/jammy-security main restricted universe multiverse

带 -src 的源码镜像默认注掉,需要时再取消注释。改完 sudo apt update。

六、跑一个 x86 程序试试

先装 multilib 版 GCC 工具链:

sudo apt install gcc-multilib x86-64-linux-gnu g++-multilib x86-64-linux-gnu

注意这一步只解决了交叉编译工具链;要直接跑 Intel 的二进制,还需要对应的 ld-linux 与 libc 运行库。实操里的做法是从一台 x86 机器上把 ld-linux.so.2、libc.so.6 这类库拷过来放到对应位置,缺哪个补哪个,补齐之后示例程序就能跑起来了。

顺带一提,还有一条更省事的路:用 lima 管理虚拟机,配置同样基于 Rosetta 转译,被很多人认为是更便捷的方案。可以先按 UTM 这套走通流程,理解了 binfmt 机制再换 lima 就很快。

七、几个注意点

  • 转译跑 x86 比原生慢,但比 qemu 全模拟快不少;
  • Rosetta 依赖通过 virtiofs 挂载,共享目录权限不对时先查 fstab 里的 ro 与 nofail;
  • binfmt 注册重启后可能失效,重启后先 cat /proc/sys/fs/binfmt_misc/rosetta 确认;
  • 选 Debian 系发行版能少踩一堆依赖坑,rpm 系实际用起来麻烦。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表