Rosettaを解除したのにarm64にならない原因
Rosettaを解除したにもかかわらず、アーキテクチャがx86_64のままになってしまう場合の対処法です。具体的には次のような症状です。
ターミナルアプリを右クリックし、Get Info > Open using Rosetta
のチェックを外します。再度ターミナルを開いてuname
でアーキテクチャを確認すると、本来ならばarm64と表示されるはずが、x86_64と表示されます。
$ uname -m
x86_64
環境:macOS 11.0.1、Apple M1
原因は親プロセスがx86_64
原因は、親プロセスがx86_64で作動してしまっているからです。親プロセスがx86_64で作動していた場合、そこから発生するコマンドの全てがx86_64で作動します(システムコールのfork()
)。筆者は、bash
とtmux
をx86_64のbrew
でインストールしたものを使っていたので、そこから作動するコマンド(子プロセス)が、全てx86_64になってしまいました。
プロセスの親子関係はpstree
コマンド(要インストール)で確認できます。たとえばPID 20065
のtmux
がarm64だったとしても、派生した子プロセスのbash
がx86_64だった場合、その上で実行されるプロセスは全てx86_64になってしまいます。
$ pstree | less
-+= 00001 root /sbin/launchd
|-+= 20065 hase tmux -u new-session
| |-+= 46720 hase -bash
| | |-+= 65249 hase pstree
| | | \--- 65251 root ps -axwwo user,pid,ppid,pgid,command
| | \--- 65250 hase less
| |-+= 64023 hase -bash
| | \--= 65145 hase /usr/bin/vim main.rs
| \-+= 55951 hase -bash
| \--= 56038 hase /usr/bin/vim not_become_arm64.html
解決法はx86_64を使わないこと
解決法は、x86_64のbrew
を完全に捨てることです。そして、M1対応のbrew
のみを使うようにします。というのも、x86_64のコマンドをパイプしてしまったがために、不本意な結果になる可能性が十分にあるからです。
2020年12月現在、bashとtmuxはM1brewにある。しかし、Neovim(以後、vimと書く)がまだないので困っている。vimでは外部コマンドを多用している。もし、vimがx86_64で作動していた場合、呼び出されたコマンドはvimの子プロセスになるので、x86_64で作動してしまうのである。
追記:2022年4月現在、問題がかなりなくなったように感じます。
愚痴
率直にいって、Apple M1のmacOSが開発環境として成立するとは思えない。arm64とx86_64を使い分けるなんて異常である。そしてやっていることといえば、表面だけでもGNU/Linuxに接近させよう、という無駄な努力である。そんなことなら最初からGNU/Linuxを使えばよいのだ。なお、ラズパイのARMは、M1ほど問題がないことを付け加えておく。
更新情報
- 作成日:2020-12-31
- 更新日:2022-02-30