Macbook Air 13inch Mid 2013 に NixOS を入れる

created: 2026-07-14 updated: 2026-07-15

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

ここでは最低限のデスクトップ環境構築まで行う。

  1. ファームウェアアップデート等
  2. パーティション OS X パーティションを縮小する
  3. ブートローダー設定
  4. NixOS インストール
  5. インストール後設定 MacBook 特有
  6. 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 を導入した。

ハードウェアコントロール

輝度調整と音声制御も導入する。 brightnessctlplayerctl だ。 こいつらを 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 を導入して使った感想を書く予定だ。