Claude Codeに丸投げしたら、15年前のMacBookがNixOSで蘇った

Date:

Share post:

こんにちは。お久しです。

今回は、自宅で10年ほど眠っていたMacBook Pro 2011をNixOSで叩き起こして、日常のサブ機として復活させた話です。動機は「NixOSを試してみたかった」が半分、残りはほぼロマン。結果的に、NixOSとAIエージェントの相性の良さを体感する良い機会になりました。

今回のマシン

  • MacBook Pro 17インチ 2011 (MacBookPro8,3)
  • 17インチの最終世代。とにかくどデカい。本体にRJ45ポートが付いている時代
  • CPUはSandy Bridge世代のCore i7、ストレージは当時物のSSDそのまま
  • GPUはAMD Radeon HD 6770M + Intel HD 3000のデュアル構成(これが後述の最大の難所)

この機種はdGPUの故障が持病として有名ですが、幸いこの個体は無事でした。

ゴールはこんな感じに設定:

  • macOSは残さず、内蔵ストレージ全領域をLinux化(LUKS暗号化)
  • KDE Plasmaデスクトップで、Macの操作感(Cmdキーのショートカット、日本語入力)を再現
  • 日常のサブ機として使える状態にする

実はNixOSの前に、動作確認を兼ねて一度Debianをインストールしています。こちらは特に引っかかりもなくあっさり起動。「このハード、まだ普通にLinuxがいける」と確認できたところで、本命のNixOSを試すことに。

なぜNixOSかというと、宣言的な設定と再現性という特徴を一度ちゃんと試してみたかったのと、「これAIエージェントと相性いいのでは?」という予感があったから。この予感は当たりでした。

進め方: SSH越しにClaude Codeへ丸投げ

Nixは初心者です。正直flakeが何なのかもよくわかっていない状態から始めましたが、それでも何とかなったのは、ほぼ全部Claude Codeにやってもらったから↓

(1)事前準備(手元のMacで)

まず普段使いのMac(Apple Silicon)でClaude Codeと相談しながら、設定リポジトリを作りました。

  • flake.nix + hosts/ + modules/ — ハードウェア対策、KDE、日本語入力、Mac風ショートカットなどをモジュール分割
  • INSTALL.md — インストール手順書。人間だけでなくエージェント自身も参照する

インストールするアプリの一覧にはClaude Code自身も入れました。「リポジトリごと持っていけば実機でも調整できるでしょ」という算段です。実際その通りになります。

手元のMacにNixは入っていませんが、Dockerのnixos/nixイメージで評価だけは通せます。ビルドはしないのでARMのMacでもOK。オプション名のtypoや存在しないパッケージはこの段階で潰しておけます。

(2)実機作業(ほぼ見てるだけ)

実機側でやったのは本当にこれだけ:

  1. NixOSのLive USBで起動
  2. 有線LANを接続(RJ45ポートがあるので楽)
  3. 一時パスワードを設定(Live環境はsshdが最初から動いているので、パスワードさえ設定すればSSHで入れる)

あとは手元のMacからSSHで接続して、Claude CodeがSSH越しに作業を進めてくれます。

  • lsblkでディスクを特定(USBメモリと間違えない。大事)
  • パーティショニング → LUKS暗号化 → フォーマット → マウント
  • nixos-generate-configの結果をリポジトリに取り込み
  • nixos-install --flake

自分は横で眺めて、要所で「OK」と言うだけ。実機のキーボードにはほとんど触っていません。

宣言的設定とAIの相性がいいかんじ

やってみて実感した、NixOSとAIエージェントの相性の良さ:

  • マシンの全状態がテキストで渡せる。「このマシンはどういう構成?」の答えがリポジトリにある。エージェントに文脈を丸ごと共有できる
  • 実機に触る前に検証できる。チェックコマンド(nix flake check)一発で、設定の誤りを手元で検出できる
  • 試行錯誤がgit履歴に残る。うまくいかなければ宣言を直してnixos-rebuild switchし直すだけ。何をどう変えたかが全部コミットで追える

Nixは「学習コストが高い」とよく言われますが、その学習コストをAIが肩代わりしてくれる。手続き的な作業(コマンドであれやこれや…)よりも、宣言的な設定ファイルの方がAIは得意なんです。


内蔵ディスプレイがまっくろ

今回最大の難所。

この機種はAMDとIntelのデュアルGPU構成ですが、2011年のAMD GPUを今あえて使う理由はない(熱い・うるさい・壊れる)ので、radeonドライバをblacklistしてIntel内蔵グラフィックだけで運用する方針にしました。よくある構成のはず…でしたが、インストール後に再起動すると内蔵ディスプレイが真っ暗。まあ、一発で通るわけもなく。ちなみに先のDebianで普通に映っていたのは、AMD GPUをそのまま使っていたからです。

面白いのはここからで、SSHでは普通に入れるし、ログを見るとi915(Intelドライバ)は内蔵パネルを正常に駆動できている。KWinも動いている。でも画面には何も映らない。

原因はgmuxというGPU切替器でした。この世代のMacBook Proは、内蔵パネルへの配線そのものをgmuxがAMD側/Intel側に物理的に切り替えています。そしてgmuxは起動のたびにAMD側にリセットされる。AMD GPUは無効化済みなので、パネルは「誰も描画していない側」に繋がったまま、というわけです。

…と、原因を分かったように書いていますが、白状すると原因究明も解決もほぼClaude Codeの仕事です。真っ暗でもSSHは通るので、エージェントがSSH越しにログを読み、仮説を立て、設定を変えて再起動。自分の仕事は「画面見てて!」と言われて「真っ黒」「映った!」と報告するだけ。人間がセンサー係👀

最終的に入った修正は以下の4点。正直すべてを理解できている自信はないですが、こういうことをやっているようです:

  1. gmuxを毎起動Intel側へ切り替えるsystemdサービス。定番のvga_switcherooはradeonドライバ不在だと機能しないため、gmuxのI/Oポートを/dev/port経由で直接叩く
  2. サスペンド復帰時にも再切替。gmuxは復帰のたびにAMD側へ戻るので、suspend.targetに紐付けた別サービスでもう一度切り替える
  3. AMD側のフレームバッファ(simpledrm)をlogindのシートから外すudevルール。これが残っているとKWinがIntel GPUの描画権限(DRMマスター)を取れず、全黒のまま
  4. KWinをi915に固定(KWIN_DRM_DEVICES)。この環境変数はコロン区切りなので、コロンを含む/dev/dri/by-pathのパスが渡せず、udevでコロン無しのシンボリックリンクを作る

という感じでデスクトップが表示されるように🙆‍♂️ 一人だったら確実に心が折れていたやつ。

副作用として、gmux切替後はテキストコンソール(Ctrl+Alt+F2のあれ)がパネルに映らなくなりますが、Tailscale経由でSSHできるので割り切りました。


2011年のGPUで2026年のツールを動かす

デスクトップが映った後にも、ちょいちょい「古さの壁」がありました。

Ghostty: ターミナルはmacOSと同じGhosttyを使いたかったのですが、GhosttyはOpenGL 4.3を要求します。この制約は実機に触る前、準備段階のエージェントの調査で発覚しました。「AMD GPU側なら対応してるのでは?」という淡い期待も、調べ直した上で「AMDもOpenGL 3.3止まりなので解決しません」ときっぱり潰されます。LIBGL_ALWAYS_SOFTWARE=1でソフトウェアレンダリングに切り替えて解決。

Zed: エディタのZedはVulkan必須。Intel HD 3000はVulkanドライバの対象より古い世代で、AMD側も同様。ZED_ALLOW_EMULATED_GPU=1でソフトウェアVulkan(llvmpipe)を許可して起動できました。

「ソフトウェアレンダリングで実用になるの?」と感じるけど、もともと軽量な2つのツールなら全然OK。


できあがったもの

最終的にこんな環境になりました:

  • NixOS + KDE Plasma 6
  • Cmdキーを主要修飾キー化: Cmd+C/V/X/Z/A/F、Cmd+Tabがそのまま効く
  • 日本語入力はfcitx5 + mozc、macOSと同じCmd+Spaceでトグル(USキー)
  • 使い慣れたターミナルとエディタ + Claude Code

Macの操作感をほぼそのまま持ち込めたので、「Linuxに移行した」というより「OSが若返った」感覚。15年前のマシンですが、ブラウジングとターミナル作業くらいなら普通にこなせます。

余談ですが、日本語入力にはWayland特有の罠があり、fcitx5を起動するだけでは入力できません。KWinの「仮想キーボード」設定でfcitx5を指定して初めて入力が繋がる、という点に少しハマりました。

ちなみに: T2チップ世代のMacならt2linux

「古いMacにLinux」つながりでもう一台。会社ではMac mini 2018がProxmox VEホストとして稼働中です。

2018年前後のIntel MacはT2セキュリティチップを搭載していて、そのままではLinuxのインストールに一癖あります。この世代はt2linuxプロジェクトのWikiとパッチ済みカーネルを頼るのが定番です。

t2linux: https://t2linux.org/

Intel Macのサポートが終わっていく時期ですが、Linuxの受け皿としてはまだまだ現役でいけます。

おわり

10年眠っていたマシンが、LUKS暗号化 + 最新デスクトップ + AIエージェントという今風の構成で日常サブ機に復活しました。

NixOS抜きでも古いMacのLinux化はできますが、「構成が全部リポジトリに残っていて、いつでも同じ状態を再現できる」「AIエージェントに文脈を丸ごと渡せる」という体験は宣言的設定ならでは。Nixが気になっていた人は、AIの手を借りられる今が始めどきかも。

たろう
たろう
フロントエンドエンジニア。

Related articles