Rosetta 2介绍
1. 什么是 Rosetta 2?
Rosetta 2 是 Apple 提供的一个 动态二进制翻译器,作用是:
让你在 Apple Silicon(ARM 架构的 M1/M2/M3 芯片)上运行本来只能在 Intel(x86_64 架构)上运行的软件。
它背后做的事情类似于:
你会 ARM 语言,但来了个只说 x86 的外国人。
Rosetta 2 在你俩之间实时翻译,让你们能合作。
2. 什么是 QEMU?
QEMU 是一个强大的 系统级模拟器(emulator),可以:
-
模拟 不同 CPU 架构(比如 ARM ↔ x86)
-
模拟 设备和系统调用
-
可以是“轻量的用户空间模拟”或“完整的系统级虚拟化”
问题产生的根源:Apple Silicon 的架构差异
Apple Silicon Mac(M1/M2/M3) | Docker 镜像(大多数) |
---|---|
ARM64 架构 | x86_64 架构(amd64) |
这意味着你运行的是:
在 ARM Mac 上运行一个 x86_64 的 Linux 容器!
这中间就有一层转换“鸿沟”——两个 CPU 架构完全不一样。
Docker 如何解决这件事?
Docker Desktop 为你做了「跨架构运行」的支持,用的是:
ARM Mac + Docker Desktop↳ LinuxKit 虚拟机(运行 Linux 内核)↳ 容器运行时遇到 x86_64 程序↳ 自动注入 QEMU(用于 x86 ↔ ARM 翻译)
Docker Desktop 默认会用 QEMU 做「syscall 层翻译」:x86 程序的系统调用(比如 fork、clone)被拦截后转成 ARM 的系统调用运行。
⚠️ 这种“只翻译 syscall”的方式有局限性:有些复杂场景(如 Chromium 多进程)跑不动。
开启 "Use Rosetta" 后发生了什么?
当你开启:
“Use Rosetta for x86/amd64 emulation on Apple Silicon”
Docker Desktop 就不再仅仅使用 QEMU 的 syscall 翻译了,而是:
使用 macOS 原生 Rosetta 2 做完整的用户空间仿真!
它让整个 x86_64
的容器:
-
看上去像在一个真实的 x86_64 Linux 主机上运行;
-
所有指令、库调用、fork、sandbox、线程行为都能模拟得更完整;
-
对 Puppeteer 这种依赖底层 fork/zygote/sandbox 的程序来说,它能“原地复活”。
简单对比总结
模式 | 默认 QEMU 翻译(不打开 Rosetta) | 开启 Rosetta 模拟 |
---|---|---|
运行方式 | 部分 syscall 模拟 | 完整 x86_64 模拟 |
程序行为兼容性 | 差(尤其是多进程、沙箱) | 高(像真实 x86) |
Puppeteer Chromium 能否启动 | 经常失败 | 多数成功 |
性能 | 一般 | 略慢但稳定 |
是否推荐开发调试用 Puppeteer | 容易崩溃 | 推荐 |
图示理解
你原来跑的是:ARM Mac└── Docker Desktop└── Linux (ARM64) with QEMU└── x86_64 binary ← syscall 转换不全你开启 Rosetta 后:ARM Mac└── Rosetta + QEMU└── 模拟完整 x86_64 用户空间└── x86_64 binary ← sandbox / fork 正常
总结一句话:
“强制用 Rosetta 对 amd64 镜像做完整仿真”,就是让你在 M1/M2 Mac 上运行 x86_64 Linux 程序时,不只是拦截系统调用,而是整套 CPU 指令都模拟成 x86_64,让程序(如 Chromium)“以为它真在一台 Intel 机器上”,从而解决 Puppeteer 多进程、沙箱启动失败的问题。