Intel MacからM1 (Pro・Max) Macへ(出来る限り)滑らかに開発環境を移行する
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にあるファイル共有を利用する。
アプリケーションとミドルウェアの管理
(極力)Homebrew Bundleを利用する。
Homebrew bundleを利用する事で新環境にHomebrewをインストールしたあと、以下のコマンドを打つだけでアプリケーションやミドルウェアをインストールする事が出来る。
$ brew bundle
極力とつけたのは利用しているソフトウェアの中にはHomebrewやHomebrew caskには存在しないソフトウェアがあるため。
もっと言えば全てHomebrew Bundleで行うために自分で独自のFormulaやCaskを用意してもいいが、そこは全て自動化したいという人向けと考えている。私の場合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に追加して複数端末で管理することができる
Editor
VimやEmcas、VSCodeなど
VImやEmacsはdotfilesでGitHub上で管理をする or ファイルだけコピーする。
VSCodeは公式で用意している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が該当した
リポジトリ
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に移す
音楽
iTunes(ミュージック)で管理。外付けHDDに移す
BootCamp
Arm MacではWindowsは利用できない。ライセンスを外す
その他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
- ログイン項目
- アクセシビリティ
- ディスプレイ
- カーソルのサイズ
- ポインタコントロール
- スクロールの速度を最速に
- 感性スクロールあり
- ドラッグを有効にする
- ディスプレイ
- キーボード
- キーリピート
- 最速
- リピート認識までの時間
- 短い
- 入力ソース
- カタカナ
- 半角カタカナ
- 英字
- Windows風のキー操作
- フォント
- 源ノ角ゴシック Code JP (Source Han Code JP)
- キーリピート
- トラックパッド
- スクロールの方向
- ナチュラル
- 副ボタンのクリック
- 2本指でクリックまたはタップ
- タップでクリック
- 1本指
- 軌跡の速さ
- 最速
- その他ジェスチャ
- ページ感をスワイプ
- 2本指または3本指でスワイプ
- ページ感をスワイプ
- スクロールの方向
- Finder
- 一般
- デスクトップに表示する項目
- HDD
- 外部ディスク
- CD・DVD、およびiPod
- 新規Finderウィンドウで次を表示
- ホームディレクトリ
- デスクトップに表示する項目
- サイドバー
- サイドバーに表示する項目
- アプリケーション
- デスクトップ
- 書類
- ダウンロード
- ホームディレクトリ
- iCloud Drive
- 場所
- HDD
- 外部ディスク
- CD・DVD、およびiPod
- サイドバーに表示する項目
- 詳細
- 全てのファイル名拡張子を表示
- 一般
- 表示オプション
- ツールバーを表示
- タブバーを非表示
- パスバーを表示
- ステータスバーを表示
アプリ特有の設定
キーのショートカット、キー配置etc
Hostマシンが届いてからやること
基本的にはバックアップした物をそのままRestoreするだけで良い。具体的な手順は
- クライアントマシンからファイルを受け取り各種ディレクトリをリストアする
- https://support.apple.com/ja-jp/guide/mac-help/mh14107/mac
- 各種クレデンシャルのリストア
cp -r /path/to/tarball/aws ~/.aws
cp -r /path/to/tarball/ssh ~/.ssh
- etc(環境変数等)
- zsh_historyのリストア
- ロゼッタのインストール
- Homebrewのインストール
- /opt/hombrewにPATHが変わっているので注意
- dotfiles repoのclone
- Mac AppStoreへのログイン
- masのために必要
-
brew bundle
- Brewfileがない場合は、一つずつ
brew install
- or 自前でビルド
- Brewfileがない場合は、一つずつ
- Macの設定のリストア
- フォントのインストール
ドライバのインストール
人によってはドライバのインストールが必要。私の場合はHHKBが該当
ユニバーサルアプリケーションかの確認
brew経由でインストールしたアプリケーションがユニバーサルアプリケーションかをみる。アクティビティモニタで見れる。Intel版の場合はユニバーサルアプリケーションに対応していないかを確認して自前で入れる。
私の場合はAlcarittyが該当したのでユニバーサルアプリケーションにビルドをして利用している。
rbenv、pyenv、nodenvの導入
anyenv経由で追加をした。Homebrewで個別にやっても良い。
Node.js
16.0.0からApple Silliconがサポートされたのでそれ以降を推奨
Python
Apple SilliconがSupportされたのは3.9.1からなのでそれ以降を推奨。
Ruby
特に問題なくいけたが、特定のバージョンだと失敗するよう。
Go
Apple Silliconがサポートされたのは1.16からなのでそれ以降の利用を推奨
PHP
macOS Montereyでphpのバンドルは終了しました。独自に導入する必要がある。
Masで管理できないもの
M1 MacでサポートされたiPad Appはmasでも管理できない。Authyなど便利なので残念。
開発環境の動作確認
dockerなど必要なものを一通りインストールしたら最後に利用するプロジェクトの開発環境が立ち上がるかの確認を推奨。
旧端末をいつまで保持するか
1週間程度で良いかなと思います。1週間あれば触っているうちに必要だったものや設定を思い出してくるはず。念の為TimeMachineでバックアップを取るのも良いかも
さらに念の為これを機にS3 Glacierにバックアップするデータをアップロードする
私事ですが、寝ぼけて旧端末をTimeMachineでバックアップを取ろうとパーティションをいじっていたら外付けHDDのデータが全て飛んだのでこれを機にS3 Glacierに上げます・・・
Discussion