Rosettaを解除したのにarm64にならない原因
Rosettaを解除したにもかかわらず、アーキテクチャがx86_64のままになってしまう場合の対処法。環境:macOS 11.0.1、Apple M1
ターミナルアプリを右クリックし、Get Info > Open using Rosettaのチェックを外す。その後ターミナルを開き、unameでアーキテクチャを確認する。すると、本来ならばarm64と表示されるはずが、x86_64と表示されてしまう。
$ uname -m
x86_64
原因は親プロセスが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(以降M1 brew)のみを使うのが安全だろう。というのも、x86_64のコマンドをパイプしてしまったがために、不本意な結果になる可能性が十分にあるからだ。現状、M1 brewのリポジトリにアプリケーションが揃っていないが、将来的にはある程度揃うのでないか。
2020年12月現在、bashとtmuxはM1 brewにある。しかし、Neovim(以後、vimと書く)がまだないので困っている。vimでは外部コマンドを多用している。もし、vimがx86_64で作動していた場合、呼び出されたコマンドはvimの子プロセスになるので、x86_64で作動してしまうのである。
愚痴
率直にいって、Apple M1のmacOSが開発環境として成立するとは思えない。arm64とx86_64を使い分けるなんて異常である。そしてやっていることといえば、表面だけでもGNU/Linuxに接近させよう、という無駄な努力である。そんなことなら最初からGNU/Linuxを使えばよいのだ。なお、ラズパイのARMは、M1ほど問題がないことを付け加えておく。
更新情報
- 公開日:2020-12-31