🍏

Intel MacからM1 (Pro・Max) Macへ(出来る限り)滑らかに開発環境を移行する

2021/11/02に公開

Intel MacからM1 Macの移行を想定。実際にはIntel MacからM1 Pro Macへ移行をしたのでその忘備録です。出来る限りというのは手動作業が存在するため。移行セットアップを利用せずにクリーンインストールを行う。

なぜクリーンインストールなのか

CPUアーキテクチャがarm64に変わるからです。TimeMachineやThunderboltケーブル経由での移行を行ったとしてもM1に最適化されたアプリケーションやミドルウェアではなく、Intel環境下のファイルとarmアプリケーションが入り混じってグチャグチャになった環境を直すよりもクリーンインストールで綺麗な状態でセットアップをしたほうが利点が大きいと考えている。

逆に言えばアーキテクチャが同じであれば良いので、見ている方がいるかわからないがM1 MacからM1 Pro・Maxへの移行はThunderboltケーブル経由で良いと思う。

第2の理由として個人的な理由ですが、長年利用していて不要なアプリケーションが入っていたり、もう利用していないミドルウェアがあったり環境が汚れているのでこれを機に綺麗にしたいという理由もある。

方針

移行用の各種ファイルを置くディレクトリを一つ作成し、tarballにして新環境へ持っていきます。GitHubに移行用のPrivate Repositoryを作成する事も考えたが、いくらPrivateとはいえクレデンシャルファイルをGitHubにPushするのは嫌だったのでtarballに落ち着いた。

tarballのやり取りは具体的にはMacにあるファイル共有を利用する。

https://support.apple.com/ja-jp/guide/mac-help/mh14107/mac

アプリケーションとミドルウェアの管理

(極力)Homebrew Bundleを利用する。

https://github.com/Homebrew/homebrew-bundle

Homebrew bundleを利用する事で新環境にHomebrewをインストールしたあと、以下のコマンドを打つだけでアプリケーションやミドルウェアをインストールする事が出来る。

$ brew bundle

極力とつけたのは利用しているソフトウェアの中にはHomebrewやHomebrew caskには存在しないソフトウェアがあるため。

もっと言えば全てHomebrew Bundleで行うために自分で独自のFormulaCaskを用意してもいいが、そこは全て自動化したいという人向けと考えている。私の場合1〜2つだけだったのでFormulaやCaskは用意せずメモをした。

Homebrew Bundleを利用する理由はもう1つあり、作成したBrewfile一つあればいろんな環境で使い回しが出来る。私の場合はBrewfileのおかげで会社のMacと私物のMacで利用している物が同期出来る。例えば明日マシンがクラッシュして全てのデータが消えたとしても復旧がある程度容易になる。

Application & Middleware

Application

方針としてなるべくBrewfile(cask)で管理している。SlackとかはMac App Storeにもあるが、反映が遅かったりするので極力Brewでやった方が良い。有料のAppなどはCaskで管理をできないのでmasで管理をする

Shell

zshrcやbashrc、bash_history・zsh_history

*shrc*sh_history をtarballで移行先へ。dotfilesにまとめるという手もある。

Browser

タブや履歴、ブックマーク等

ブラウザ事にアカウントを発行して同期するやり方をとっているのでそれに乗るeg: Chrome(Googleアカウント)、Firefox(Firefoxアカウント)

extensionの設定を引き継ぎたい場合はメモを。設定項目をexportできる物もある

Firefoxはタブの同期が出来なかったのでTab Session Managerというextensionを利用した

Terminal

Terminal.appやiTerm

これらの設定は共有できないので設定項目をメモすること

余談ですが私はこれを機にalacrittyというエミュレータに乗り換えた。GPUレンダリングに対応しているのもあるが、設定をyamlで書けることが決め手だった。これもdotfilesに追加して複数端末で管理することができる

https://github.com/alacritty/alacritty

Editor

VimやEmcas、VSCodeなど

VImやEmacsはdotfilesでGitHub上で管理をする or ファイルだけコピーする。

VSCodeは公式で用意しているSettings Syncに乗る

https://code.visualstudio.com/docs/editor/settings-sync

Slack and Discord

こちらも共有できない(と思っている)ので気になる人は設定のメモ

その他利用しているアプリケーションの設定のリストアップ

人によって異なるので ls /Application を見て必要ならリストアップする

Middleware

Brewfileで管理している。

人によって利用しているものが違いすぎるので brew list 自分が利用している物を確認することを推奨。その範囲で必要な物を持っていく(設定ファイル等)。今回は自分が利用している範囲で書く

  • redis.conf
  • my.conf
  • .tmux.conf
  • .textlintrc
  • nginx.conf
    • sites-available/*
  • etc

こちらもtarで固めてhostに持っていく

一応書きましたが、最近はDockerを利用して開発することがほとんどだと思うので不要な気がする

ssh

新たに発行しても良いが面倒なので今回は鍵ごと全て ~/.ssh をコピーする。あるいは必要なものだけをコピーする( ~/.ssh/config~/.ssh/id_rsa* etc)

AWS

こちらも~/.aws をコピーする

DBのバックアップ

$ mysqldump --all-databases > mac_mysql_dump.sql

$ docker exec -it hogemysql mysqldump --all-databases > docker_mysql_dump.sql

Docker

あまりメモする必要もないと思うが一応

自前で作ったdocker imageがあればdocker hubにpush。DockerfileはPrivateRepoを作ってそこにpushするかtarballでホストに

環境変数

AWSのKey等のSecretな値やdirenvで管理している変数など。

BrewCaskでインストールできないもの

homebrewのcaskでインストールできないものがあればメモ。個人的にはSophos Homeが該当した

https://www.sophos.com/ja-jp/press-office/press-releases/2018/07/sophos-launches-sophos-home-premium.aspx

リポジトリ

ghq で $GOPATH/src 以下で管理している

今回はarm64にアーキテクチャが変わるのと、不要なリポジトリの掃除をしたいので移行はしない。必須なリポジトリがあればそれだけを持っていく。あるいはホスト先でcloneをし直す。

移行はしないが自分だけカスタマイズしたファイル等があるのであれば別(.git/info/exclude に入れているファイルや、 pre-commit 。独自のpackage.json、独自のdocker-compose.ymlや、patchfile etc)

その他にGitHubに PushしていないリポジトリがあればPush、セキュリティや契約上GitHubに置けないものはtarballで固めて持っていく

Mac固有のもの

/etc/hosts

更新をしているのであればバックアップを取る

写真

Photosで管理している場合は外付けHDDに移す

https://support.apple.com/ja-jp/HT201517

音楽

iTunes(ミュージック)で管理。外付けHDDに移す

https://engineershareinfo.com/2021/02/05/mac-music-data-transfer/

BootCamp

Arm MacではWindowsは利用できない。ライセンスを外す

https://support.microsoft.com/ja-jp/windows/ハードウェア構成の変更後に-windows-のライセンス認証をもう一度行う-2c0e962a-f04c-145b-6ead-fb3fc72b6665#ID0EBD=Windows_10

その他Windows上でライセンスを解除する必要がある場合は解除。

ID&Password

1passwordで管理済み。exportする必要がある場合は書き出してimportをする。使っていないのであればこれを気にパスワードマネージャの利用を推奨する。

1Passwordである必要もないので好きな物を入れると良い

  • 1password
  • LastPass
  • Keeper
  • Bitwarden
  • etc

利用しているフォント

導入したフォントを確認して必要であればバックアップとリストアをする。エンジニアだとpowerline-fontsの利用者が多そう。

その他必ずしも必要ではないがあると便利 or 良いファイル

  • githubにpushするほどではないが書き捨てたファイル
    • ~/hoge.rb とか
  • vimで書きなぐったテキスト
    • ~/hoge.txt etc
  • ~/Documents にある書類
  • ~/Downloads にあるファイル
  • LGTM画像集とか

Macの設定のリストアップ

  • Mac本体の設定はコード化出来ないので、各種酒類をリストアップする必要がある
    • defaults commandでやることも可能だが、今回はCatalinaからMontereyとバージョンを2つスキップするのと、Montereyでもコマンドが有効なのか確かめる術がないので、手動でやることに
  • 一般
    • Darkmode
    • Applicationを終了するときにウィンドウを閉じる
    • スクリーンセーバー
    • Dock
      • 拡大最大
      • 位置は下
      • Dockを自動的に表示非表示
  • デスクトップとスクリーンセイバー
    • ホットコーナー

  • 言語
    • 日本語
    • 英語
    • 24時間表記
  • ユーザーとグループ
    • ログイン項目
      • Alfred
      • Alacritty
      • Chrome
      • Slack
      • Discord
      • Docker
      • deepl
      • gitify
      • karabiner-elements
      • Notion
      • Popclip
      • Magnet
      • 1Password
      • WeatherBug
  • アクセシビリティ
    • ディスプレイ
      • カーソルのサイズ
    • ポインタコントロール
      • スクロールの速度を最速に
      • 感性スクロールあり
      • ドラッグを有効にする
  • キーボード
    • キーリピート
      • 最速
    • リピート認識までの時間
      • 短い
    • 入力ソース
  • トラックパッド
    • スクロールの方向
      • ナチュラル
    • 副ボタンのクリック
      • 2本指でクリックまたはタップ
    • タップでクリック
      • 1本指
    • 軌跡の速さ
      • 最速
    • その他ジェスチャ
      • ページ感をスワイプ
        • 2本指または3本指でスワイプ
  • Finder
    • 一般
      • デスクトップに表示する項目
        • HDD
        • 外部ディスク
        • CD・DVD、およびiPod
      • 新規Finderウィンドウで次を表示
        • ホームディレクトリ
    • サイドバー
      • サイドバーに表示する項目
        • アプリケーション
        • デスクトップ
        • 書類
        • ダウンロード
        • ホームディレクトリ
        • iCloud Drive
      • 場所
        • HDD
        • 外部ディスク
        • CD・DVD、およびiPod
    • 詳細
      • 全てのファイル名拡張子を表示
  • 表示オプション
    • ツールバーを表示
    • タブバーを非表示
    • パスバーを表示
    • ステータスバーを表示

アプリ特有の設定

キーのショートカット、キー配置etc

Hostマシンが届いてからやること

基本的にはバックアップした物をそのままRestoreするだけで良い。具体的な手順は

  1. クライアントマシンからファイルを受け取り各種ディレクトリをリストアする
    1. https://support.apple.com/ja-jp/guide/mac-help/mh14107/mac
    2. 各種クレデンシャルのリストア
      1. cp -r /path/to/tarball/aws ~/.aws
      2. cp -r /path/to/tarball/ssh ~/.ssh
      3. etc(環境変数等)
    3. zsh_historyのリストア
  2. ロゼッタのインストール
    1. https://derflounder.wordpress.com/2020/11/17/installing-rosetta-2-on-apple-silicon-macs/
  3. Homebrewのインストール
    1. /opt/hombrewにPATHが変わっているので注意
      1. https://zenn.dev/tet0h/articles/a92651d52bd82460aefb
  4. dotfiles repoのclone
  5. Mac AppStoreへのログイン
    1. masのために必要
  6. brew bundle
    1. Brewfileがない場合は、一つずつ brew install
      1. or 自前でビルド
  7. Macの設定のリストア
  8. フォントのインストール

ドライバのインストール

人によってはドライバのインストールが必要。私の場合はHHKBが該当

ユニバーサルアプリケーションかの確認

brew経由でインストールしたアプリケーションがユニバーサルアプリケーションかをみる。アクティビティモニタで見れる。Intel版の場合はユニバーサルアプリケーションに対応していないかを確認して自前で入れる。

私の場合はAlcarittyが該当したのでユニバーサルアプリケーションにビルドをして利用している。

https://github.com/alacritty/alacritty/blob/master/INSTALL.md#universal-binary

rbenv、pyenv、nodenvの導入

anyenv経由で追加をした。Homebrewで個別にやっても良い。

Node.js

16.0.0からApple Silliconがサポートされたのでそれ以降を推奨

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V16.md#toolchain-and-compiler-upgrades

Python

Apple SilliconがSupportされたのは3.9.1からなのでそれ以降を推奨。

https://www.python.org/downloads/release/python-391/

Ruby

特に問題なくいけたが、特定のバージョンだと失敗するよう。

https://github.com/rbenv/ruby-build/issues/1691

Go

Apple Silliconがサポートされたのは1.16からなのでそれ以降の利用を推奨

https://golang.org/doc/go1.16#darwin

PHP

macOS Montereyでphpのバンドルは終了しました。独自に導入する必要がある。

https://applech2.com/archives/20211018-apple-removed-php-from-macos-12-monterey.html

Masで管理できないもの

M1 MacでサポートされたiPad Appはmasでも管理できない。Authyなど便利なので残念。

開発環境の動作確認

dockerなど必要なものを一通りインストールしたら最後に利用するプロジェクトの開発環境が立ち上がるかの確認を推奨。

旧端末をいつまで保持するか

1週間程度で良いかなと思います。1週間あれば触っているうちに必要だったものや設定を思い出してくるはず。念の為TimeMachineでバックアップを取るのも良いかも

さらに念の為これを機にS3 Glacierにバックアップするデータをアップロードする

私事ですが、寝ぼけて旧端末をTimeMachineでバックアップを取ろうとパーティションをいじっていたら外付けHDDのデータが全て飛んだのでこれを機にS3 Glacierに上げます・・・

Discussion