当我们从intel mac book通过Migrantion Assistant(迁移助手)迁移到新买的M3时,在老的电脑上的软件和数据都会迁移到新电脑上。我们都知道,x86架构的软件和arm架构的软件是不兼容的,那么apple是怎么做到迁移后软件无感运行的呢?
1、Rosetta2
Migration Assistant(迁移助理) ,它的原则是:**"字节级拷贝 + 元数据保持",不做架构转换。**也就是说:
-
❌ 不会把 x86 程序"重新编译"为 ARM
-
❌ 不会替你重新安装 ARM 版本
-
✅ 直接把:
-
/Applications
-
/usr/local
-
Home 目录
-
LaunchAgents / Daemons
-
原样拷贝过来。例如,在M3上看到的
/usr/local/mysql/bin/mysqld
/usr/local/bin/brew
/usr/local/bin/python
100% 就是当年 Intel Mac 上的 x86 二进制。
1)x86软件如何无感在M3上运行的?
Rosetta 2 是 Apple 官方的 x86_64 → ARM64 翻译层,而且是:
-
系统级
-
透明的
-
按需启用的
2)Rosetta2有两种工作模式:
- AOT(ahead of time,首次启动):当第一次运行一个x86可执行文件时,Rosetta 2会对其进行静态翻译成arm64,并且会对翻译结果缓存,以后再启动几乎没有额外开销。
- JIT:实时翻译
2、如何检查M3上的软件是x86的还是arm的?
在 Mac(Apple Silicon,M3) 上,可以从 安装路径、二进制架构、Homebrew 信息 这几个角度快速判断。例如:
1)通过file命令查看二进制文件:
which mysqld
输出:/usr/local/mysql/bin/mysqld
file /usr/local/mysql/bin/mysqld
输出:
Mach-O 64-bit executable x86_64 或
Mach-O 64-bit executable arm64
2)通过Homebrew安装路径:
brew --prefix mysql
输出:
/usr/local/... 表示x86
/opt/homebrew/... 表示arm64
对于Homebrew本身来说,如果是x86的,它的安装路径是/usr/local/...如果是arm的安装路径是/opt/home/
3)需要注意:
如果M3上是通过迁移助手迁移过来的Homebrew,那么Homebrew本身是x86的,运行在Rosetta 2上。那么接下来,通过这个Homebrew安装的所有软件,都是x86的!
所以,迁移后,首先应该卸载Homebrew,然后重新安装。