马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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企服评测-应用市场 编辑提示 |