M1 Macが届いたので触ってみた


PONOS Advent Calendar 2020 の16日目の記事です。
昨日は@lovericeさんの Stateパターンを使ってみる でした。

はじめに

流行りのM1搭載MacBook Airを購入しました。🎁
メモリを増やしたりUSキーボードにしたら出荷が遅くなって、届いたのはつい数日前です。

ここまで試したり設定したことを書いておきます。

所感

予想よりも遥かにRosetta2が優秀です。
全然違和感なく使えてて凄い。

インストール済みのアプリだと、GitHub DesktopやDiscordあたりがIntel版バイナリだったんですが、今調べるまで気づかなかったくらいです。
特に、Discordはカメラとかマイクのハードウェアを使うのに、普通に使えてるの凄い。

CPUアーキテクチャ周りのTips

アプリごとのアーキテクチャ切り替え

アプリケーション情報で「種類」欄を見れば、どのタイプか分かります。
「Universal」は、Intel版もArm版も両方のバイナリを同梱しています。

(スクショでかいな・・・)
「Rosettaを使用して開く」にチェックを入れると、Intel版として動きます。
Intel版しかないアプリについては、このチェックボックスは出てきません。(暗黙的にRosettaを使用する。)

アプリがどのアーキテクチャに対応しているか調べる

lipoコマンドで、アプリ内にどのアーキテクチャ用のバイナリが含まれているかを調べることができます。
参考: ユニバーサルバイナリ再登板ということは「lipo」の出番かも

$ lipo -info /usr/local/bin/fish
Architectures in the fat file: /usr/local/bin/fish are: x86_64 arm64

$ lipo -info /usr/bin/vim
Architectures in the fat file: /usr/bin/vim are: x86_64 arm64e

$ lipo -info /Applications/GitHub\ Desktop.app/Contents/MacOS/GitHub\ Desktop
Non-fat file: /Applications/GitHub Desktop.app/Contents/MacOS/GitHub Desktop is architecture: x86_64

上の例だと、GitHub DesktopはIntel版しか入ってないみたいですね。

シェルが動いているアーキテクチャを調べる

uname -mもしくは'arch'をオプション無しで叩くことで調べられます。

# Rosetta2(Intel)で動いているとき
$ uname -m
x86_64
$ arch
i386

# ネイティブ(ARM)で動いているとき
$ uname -m
arm64
$ arch
arm64

アーキテクチャを切り替えて実行

archコマンドで、アーキテクチャを指定して実行できます。

$ arch -x86_64 bash

man archを見てみると、指定できるのはIntel系のアーキテクチャだけみたいです。

The arch_name argument must be one of the currently supported architectures:
i386 32-bit intel
x86_64 64-bit intel
x86_64h 64-bit intel (haswell)

ので、ネイティブで実行しているシェルから、Intel版バイナリを使いたいときに使用できます。(逆は駄目。)

fish

ログインシェルはfishを使っています。
fish自体もM1 Mac対応していて、特に違和感なく使えています。

プロンプトにアーキテクチャを表示

当面の間はアーキテクチャを切り替え・意識して使うことが多そうなので、プロンプトに表示するようにしました。

honeniq/shellder/fish_prompt.fish

function prompt_arch -d "Display current CPU architecture."
    switch (uname -m)
    case arm64
        prompt_segment white cyan "arm"
    case x86_64
        prompt_segment cyan white "x64"
    end
end

fishのテーマをちょっといじって、「arm」とか「x64」と表示するようにしました。

かわいい。🐠

Homebrew

パッケージマネージャとしてHomebrewを使っています。
公式サイトによると、バージョン2.6.0からM1 Mac対応も始まっているようです。

macOS Homebrew running natively on M1/Apple Silicon/ARM has partial functionality. We recommend installing into /opt/homebrew and forbid installing into /usr/local (to avoid clashing with the macOS Intel install and allow their usage side-by-side). We currently recommend running Homebrew using Intel emulation with Rosetta 2.

とはいえ、まだIntel版をRosetta2経由で使うことを推奨 との事。

ARM版を使う場合は、Intel版とかち合わないよう、Homebrewで管理するパッケージは /opt/homebrew に入れるのが推奨です。
(デフォルト設定だと、推奨通り /opt/homebrew にインストールされます。)

Intel版を使うように強制

推奨通り、当面はIntel版だけを使うことにしました。
シェルがARMで動いているときもIntel版を使えるように、fish functionでbrewコマンドをラップしてみました。

honeniq/dotfiles/.config/fish/functions/brew.fish

## wrap 'brew' command on M1 Mac
function brew
  if test (uname -s) = "Darwin"
    and test (uname -m) = "arm64"
    command arch -x86_64 brew $argv
  else
    command brew $argv
  end
end

問題なく動いてそう。
しばらくこの形で使ってみます。


明日は @nisei275 さんです!