nixos-limaを開発環境として使う
はじめに
2年ほど前からプライベートでも業務でも、開発環境の構築にはNixを利用してきた。
昨年秋ごろ、突如降ってきたやんごとなき事情により、業務用MacBookでのNix利用が禁止されてしまった。 それまでは何の問題もなく使えていたし、社内にもflake.nixを配置したリポジトリが多数あったにも関わらず、である。 一時期はこのあたりの決定権を持つ人たちを説得するため、いろいろと働きかけてはみたが、議論が進む気配はなく、こんなことに時間や労力を割くのもばかばかしいと思うに至るまでそう時間はかからなかった。
とはいえ、使い慣れたツールを使えない環境で成果を出せと言われても無理な話だ。どうにかして業務端末上でNixを利用して開発環境を用意する方法はないかと考えてみた。 まず思いついたのはDockerコンテナ内で開発を完結させる方法だ。コンテナの中でならNixを使っても問題ないだろう。 ただ、MacBook、それも私の貸与されているMacBook Airはあまりメモリに余力はない。Docker Desktopを常時走らせてその上で開発用のコンテナを動かすのは若干心細い。 であれば、そもそもコンテナではなく仮想マシンならどうか。ということで考えたのが、LimaでNixOSのVMを立て、その中で開発をするという方法である。
NixOS on Lima
Lima上にNixOSのVMを立てる試みは、既に前例がたくさんあったので参考にさせてもらった。
これらの記事でも参照されている nixos-lima の成果物を利用した。
構築にあたってつまづいたポイントは多々あったが、最終的にはLima用の次のようなYAMLファイルを用意して起動するようにした。 https://github.com/rinx/dotfiles/blob/8d77fc6628d4455db77394dedf9e24618e64cb57/macos/lima/nixos.yaml
limactl start コマンドを次のように実行すればLima VMが起動する。
❯ limactl start github:rinx/dotfiles
開発環境としてこのLima VMを利用するにあたって、要点は次のとおり。
- SSH Agent Forwardingを設定
- GPG Agent Forwardingを設定
- VM内からxdg-openを利用できるようにするUnix Domain SocketをForwarding
- VM起動後の初期設定のためのスクリプトを案内するmessage
1や2はよくある設定なので、見た通り設定すれば良い。
3はVM内で xdg-open コマンドに見せかけたスクリプトを実行すると、Unix Domain Socket経由でホスト側の open コマンドを叩く仕組みのために用意してある。
これは、VM内のNeovimから何かしらのURLをホスト側のブラウザで開きたいことが多々あったため自作した。(https://tangled.org/rinx.tngl.sh/xsr)
同じ仕組みは割とよくあるものなので、 Using open, pbcopy and pbpaste over SSH などを参考にすると良い。
4は limactl start 実行時に表示されるメッセージを定義している。
GPG pubkeyやownertrustのimportなど、必ず実行しておくべきもろもろのスクリプトをここに書いておくと、実際に開発作業をするときに設定不備で時間を奪われることがないので助かる。
NixOSイメージのCI上でのビルド
Lima用のYAML上で参照するVM用イメージは、自分のリポジトリのGitHub Actions上でビルドし、Release AssetsとしてPublishしている。
例: https://github.com/rinx/dotfiles/releases/tag/2026.06.20
自動ビルドの仕組み自体はほとんどnixos-limaのものを流用して構築している。
とはいえ、私も実際に導入しているカスタム部分はそう多くはない。主要なところは次の2点くらいだ。
dockerdをサービスとして起動する- Kitty用のterminfoを事前に導入しておく
実際利用してみて
この開発環境を実際に利用しはじめたのは今年の4月ごろからで、おおよそ3ヶ月間運用してきたわけだが、個人的な感触としてはかなり良い。 まず、ホストOS上に余計なソフトウェアを導入する必要がない。Limaだけ入れておけば開発環境をVMイメージとしてダウンロードして起動ができるので、とても衛生的に感じる。 もし利用しているうちにVM上に何か問題が生じたとしても、VMを消して起動し直せば良い、という前提があるのは気持ちの面でも非常に楽だ。
また、同様の仕組みでsandbox.yamlというLima用のYAMLも用意してある。 これは、Claude CodeなどのAIエージェントに自由に触らせる用のVMを立てるために利用している。自分が触るのとほぼ同じ環境をAIが自由に触れるようにして(最悪壊してもいいように)提供することで、開発効率を高めようという試みだ。 こちらも今のところうまく活用できているのではないかと感じている。
一方で、唯一懸念される点としては、nixos-limaはLima公式からサポートされているイメージではない点だ。そのため、Lima側に破壊的変更があると稀にイメージが起動できなくなる可能性がある。 実際、Limaがv2.1.0で導入した変更により、それまで起動できていたものが起動できなくなった。このときはnixos-limaにパッチを当てて問題を解決した。
ちなみに「VM上でNixOSを開発環境として利用する」というのは mitchellh/nixos-config でも紹介されているように、それなりに歴史と実績のある方法と言える。 万人に受ける方法ではないが、ハマるところにはハマるタイプの手法なのではないかと思う。