Macbook Air 13inch Mid 2013 に NixOS を入れる
頂き物の Macbook Air 13inch Mid2013 を一年半ほど放置していた。
勿体ないので NixOS を入れて遊ぶ。
installation は基本的に Arch Wiki に従うので、有益な情報を求める方はそちらにブラウザフォワード(ブラウザバックの逆)してほしい。

ここでは最低限のデスクトップ環境構築まで行う。
- ファームウェアアップデート等
- パーティション OS X パーティションを縮小する
- ブートローダー設定
- NixOS インストール
- インストール後設定 MacBook 特有
- GUI 環境設定
ファームウェアアップデート等
ファームウェアは最新版になっていたのでアップデートの必要はなかった。 FileVault をオフにしておく。なってた。 OS X 側のディスク使用量もできるだけ減らしておく。 エディタ等の開発環境やアプリ、ログファイル、キャッシュを削除する。 理由は後述するが、できるだけ切り詰めておきたい。
パーティション
ドライブは、普通に MacOS を入れているなら GPT フォーマットになっているはずだ。 だいたいこんなパーティションがある
- EFI: msdos や FAT と認識されることもある。ラベル付けは
#1。 - Mac OS X: 書いてあるとおり Mac OS X が入っている。ラベル付けは
#2。 - Recovery: リカバリ用のパーティション。
今回は OS X と NixOS のデュアルブートをするから、OSX 側でパーティション分割しておく。 悲しいことに、ここには 128 GB のディスクが 1 つしかないのでできるだけ詰めたい。 しかし OS X を吹き飛ばしてしまうといろいろめんどくさいらしい。Arch Wiki によると
OS X パーティションを取り除くと、マシンのファームウェアを簡単に更新する方法がなくなるので注意してください。
とのこと。 もし容量が足りなくなれば吹き飛ばしてやってみたらいい。 幸い NixOS は宣言ベースで再現性の高い Linux ディストロなので、すぐに元の状態まで復帰できる。
最終的にパーティション割り当てはこのようになった。
- OS X: 40 GB(使用済み 28 GB、非常用 12 GB)
- NixOS: 81 GB(一旦 exFAT でフォーマットしておく)

イメージを USB フラッシュメモリに焼く
https://nixos.org/download/#nixos-iso から最新の ISO イメージをダウンロードする。
rufus で焼いたが各々好きなものを使えば良い。

ファイルパーティション&マウント
通常の Arch Linux のインストールと同様。
USB フラッシュメモリ上の NixOS を起動して $ lsblk -f を叩く。
NixOS 用に作った exFAT 領域は ext4 FileSystem に切り替える。
ここでは領域の名前を nixos とした。
NixOS 領域を /mnt にマウントし、既存の EFI System パーティションを /mnt/boot にマウントする。
これで NixOS のインストールの準備が完了した。

ブートローダー
configration.nix を自動生成する。
sudo nixos-generate-config --root /mnt
生成した configration.nix を書き換えてブートローダーなどを設定する。
systemd-boot をブートローダーとして使う。
また、NixOS に EFI の起動順序を変更させないようにする。
本当はさせてやりたいのだが、Mac だといろいろ面倒らしい。
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = false;
これを設定したら sudo nixos-install rebuild で NixOS のインストールを行なう。
gpt-5.5 に教えてもらいながらやっていたが、こいつがまだ nix-shell を勧めてくるのであまり頼りすぎたくない。 確かに flake は experimental ではある。が、NixOS など使うオタクはそんなことを気にしない。
この時点ではやっていなかったが、日本語配列なら console.keyMap="ja_JP.UTF-8" を設定しておく。
閑話休題
この辺りで SSH を繋いでおくと楽だったが面倒なのでやらなかった。 設定が終わるまでかえって面倒だったが、こうでもしないと最後までやりきらない。
WiFi 設定
なんと、13 時間前に同じことをやっている人がいたので、これを参考に設定した。 NixOSを古いMacBook Pro(Intel)にインストール | T_723 - Zenn
引き継ぎ
ようやくある程度の準備が整ったので、
自分の dotfiles を clone しておく(WSL の NixOS の設定が入ってある)。
GUI 環境は入っていないので、configration.nix を自動生成したときのコメントに hyprland を導入するものがあったのでこれをそのまま使う。
...
programs.hyprland.enable = true;
...
NixOS latest
しばらく放置していたら NixOS 26.05 がリリースされてたのでアップデートする。 WSL のほうは設定ファイルを書き換えて rebuild するだけなので同じことをした。 Broadcom が insecure だからアップデートできませんよというような旨のエラーが出た。 version をハードコードして update したら通った。 書き換える機会なんて OS アップデートのときくらいしかないので、ハードコードのままにしておく。
...
nixpkgs.config = {
allowUnfree = true;
permittedInsecurePackages = [
"broadcom-sta-6.30.223.271-59-6.18.34"
];
};
...
ちなみに、この間に hyprland のアップデートがあり、lua の設定に移行されてたのでそうする。 ほとんどデフォルトの設定で済ませてしまった。
GUI 環境
ランチャーは rofi を入れた。 デフォルトでは command + R で起動。
日本語入力
fcitx5+mozc で設定。
nixpkgs の ftrix5-mozc を導入する。
hyprland のスタートアップにも登録しておく。
また、mozc の設定をしたい場合は fcitx5-mozc だけでなく mozcTool が必要なようなのでこれも導入。
$ mozcTool --mode=config_dialog で起動する。
日本語フォントには一旦 noto-sans-cjk を導入した。
ハードウェアコントロール
輝度調整と音声制御も導入する。
brightnessctl と playerctl だ。
こいつらを hyprland のショートカット経由で動かす。
-- Laptop multimedia keys for volume and LCD brightness
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), { locked = true, repeating = true })
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true, repeating = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown",hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true })
-- Requires playerctl
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true })
hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
おわりに
この PC はまた Mac のみに戻して友人に譲ることになったが、 この設定を保管しておけば、異なるデバイスでもすぐにセットアップが完了する。 ということで、次の記事は ThinkPad に NixOS を導入して使った感想を書く予定だ。