Apple Silicon MAC的Arm和X86兼容问题

IoT 8个月前 admin
70 0 0



背景

在聊具体内容前先说下背景:苹果公司在2020年时发布了全新的基于Arm架构的M1芯片,标志着Mac进入了Arm架构时代,但是实际上这不是Apple第一次更换架构,当初Mac电脑从基于PowerPC的系统过渡到基于Intel的系统时,Apple使用Rosetta动态转换大多数基于 PowerPC的应用程序以配合基于Intel的Mac使用。现在是通过Rosetta 2的转换技术,让尚未更新到arm的Mac App可以在Apple芯片上运行。

问题

新的架构带来了一些兼容性方面的问题,比如一些实用工具、一些Python模块未适配的问题,如果本地不做一些特殊处理,就有可能会出现一些问题,所以咱们这次就聊聊我遇到的几个常见工具的共存方式。

brew

brew提供了对x86和Apple Silicon的兼容,不同类型的系统下,brew安装位置会不同,所以可以在Apple Silicon的Mac上同时安装两种架构的brew来防止出现兼容问题。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

此时在Apple Silicon的Mac上,会安装到/opt/homebrew/bin/brew,这个就是Arm版本。

arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

此时在Apple Silicon的Mac上,会安装到/usr/local/bin/brew,这个就是x86_64版本。

后续如果要安装x86_64版本的工具,就可以直接使用/usr/local/bin/brew如果要安装arm版本的,就可以使用/opt/homebrew/bin/brew

arch -x86_64 /usr/local/bin/brew install xxx

还可以通过别名的方式分别给两个版本的brew设置别名,方便使用,比如在~/.zshrc中增加

alias x86brew='arch -x86_64 /usr/local/bin/brew'

然后

x86brew install xxx

python

python是从3.9.0开始适配Apple Silicon Soc的,但是虽然Python适配了,有些模块可能还没适配,我是在迁移旧项目的时候遇到的问题,模块安装,经过一番研究发现可以通过安装X86_64版本的Python的方式来解决一些奇奇怪怪的问题。

安装X86版本的Python我选择的是使用Pyenv。

Pyenv安装

[可选]设置PYENV_ROOT

这里就是设置安装路径,如果不设置,默认就是安装到~/.pyenv

export PYENV_ROOT=xxx

执行安装脚本

curl https://pyenv.run | bash

修改/.bashrc或/.zshrc,增加如下内容

export PYENV_ROOT="xxx"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

完成

如果遇到 virtualenv失效的问题,可以参考下面:

安装完毕virtualenv插件后,创建虚拟环境一切正常,但是在激活时遇到了报错:

Failed to activate virtualenv.

Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.

解决方法目前是在.zshrc中初始化pyenv时增加一个配置,在这里找到的[SOLVED] Getting “Failed to activate virtualenv” when using with pyenv 2.0.0-rc1-2-gac4de222 (cloned on 2021-05-22) · Issue #387 · pyenv/pyenv-virtualenv (github.com)[1]

eval "$(pyenv init --path)" # 这个就是增加的配置
eval "$(pyenv init -)" # 这个是正常的配置
eval "$(pyenv virtualenv-init -)" # 这个是正常的配置

安装X86_64版本Python

安装别名插件

此时我们需要一个别名插件帮助我们区分Python的X86版本,可以选择使用别名插件,比如pyenv-suffix[2],安装方法很简单

git clone https://github.com/AdrianDAlessandro/pyenv-suffix.git $(pyenv root)/plugins/pyenv-suffix

安装X86_64版本Python并设置别名

PYENV_VERSION_SUFFIX="_x86" arch -x86_64 pyenv install 3.8.12

查看效果

➜  ~ pyenv versions
  system
  3.8.10
  3.8.12_x86

设置别名方便执行

alias x86pyenv='arch -x86_64 pyenv'

使用

需要使用x86_64版本的时候可以直接执行以下命令

x86pyenv [local/global/...] 3.8.12_x86

注:目前看下来直接使用pyenv也没遇到问题

zsh

zsh默认是在Arm下执行的,如果在默认的zsh中执行x86_64的Python可能会有问题(也可能没问题😉),此时可以直接将zsh也切换为x86_64环境

arch -x86_64 zsh

总结

目前根据我的使用情况来看,brew需要安装两个版本,pyenv只需要安装一次即可,环境配置这块主要是增加了如下内容:

alias x86zsh="arch -x86_64 zsh"
alias x86brew='arch -x86_64 /usr/local/bin/brew'
alias x86pyenv='arch -x86_64 pyenv'

需要切换到x86_64时,先执行x86zsh,然后后续就可以正常使用x86brewx86pyenv

参考资料

https://towardsdatascience.com/how-to-use-manage-multiple-python-versions-on-an-apple-silicon-m1-mac-d69ee6ed0250

https://koding.work/issue-of-install-python-environment-on-m1-macbook/

https://github.com/Homebrew/brew

引用链接

[1] SOLVED] Getting “Failed to activate virtualenv” when using with pyenv 2.0.0-rc1-2-gac4de222 (cloned on 2021-05-22) · Issue #387 · pyenv/pyenv-virtualenv (github.com): https://github.com/pyenv/pyenv-virtualenv/issues/387
[2] pyenv-suffix: https://github.com/AdrianDAlessandro/pyenv-suffix



历史文章


安卓Cocos2dx-js游戏攻防

HarmonyOs开发第一步

2023年:个人年度成长与团队协作成就

Android设备相关信息详解(三)

两个月软考-高项上岸

引用链接

[1] SOLVED] Getting “Failed to activate virtualenv” when using with pyenv 2.0.0-rc1-2-gac4de222 (cloned on 2021-05-22) · Issue #387 · pyenv/pyenv-virtualenv (github.com): https://github.com/pyenv/pyenv-virtualenv/issues/387
[2] pyenv-suffix: https://github.com/AdrianDAlessandro/pyenv-suffix


Apple Silicon MAC的Arm和X86兼容问题

Apple Silicon MAC的Arm和X86兼容问题

随手分享、点赞、在看是对我们最大的支持Apple Silicon MAC的Arm和X86兼容问题

原文始发于微信公众号(移动安全星球):Apple Silicon MAC的Arm和X86兼容问题

版权声明:admin 发表于 2024年3月8日 上午8:06。
转载请注明:Apple Silicon MAC的Arm和X86兼容问题 | CTF导航

相关文章