NixOS + home-manager で環境構築した覚書

盆栽置き場 github.com


自宅外でコード書く必要が出たので、中古でレッツノートLX6(Core i7, 16GB, US配列)を買いました。これで手元のPCは全部で5台です。

Windowsでの開発ならWSL2上でubuntu環境を立てるのですが、メモリ16GBだと動作速度に少々不安があります。なので、もともと入っているWindows10は潰して何かしらのLinuxディストリビューションを入れようと考えました。

それはいいのですが、毎回毎回あたらしいPCが手元にくるたびに、同じような手順を踏んで環境構築するのは流石に面倒になってきました。特にLinuxディストリビューションで日本語まわりの設定をするのは非常に面倒です。面倒なので2年ほど日本語化せずに使い続けているPCがあります。

どうしようかと思案しているとき、少し前にNixOSで最強のLinuxデスクトップを作ろうという記事を読んだのを思い出しました。

NixOSは、純粋関数型パッケージマネージャであるNixをベースにしたLinuxディストリビューションです。NixOSではなんと環境構築を完全に宣言的に行うことができます。つまり、望む環境の状態をコードで記述してNixOSに処理させることで、自動的にパッケージのインストールやシステムの設定などを行ってくれるのです。

かっこいい~

Nix環世界

あちこち記事を読んでみて、Nixまわりを以下のように理解しました。

NixとはUnix環境向けのパッケージマネージャ + ビルドツールのことであり、また、このシステムのための純粋関数型言語の名称でもあります。Nixで取り扱えるパッケージは、Nixpkgsというパッケージリポジトリ上に集められています。

NixOSは、言語設定、キーボードレイアウト、ブートオプションなど、OSの設定管理にNixを採用しているLinuxディストリビューションです。この、システム設定をNixで記述し管理できる仕組みをNixOS modulesと呼びます。

NixOS modulesの古典的な設定方法は/etc/nixos/configuration.nixファイルに記述していくことです。しかし、この方法にはデータソースがnix-channelに依存してしまうこと、バージョンロックの仕組みがないことの2点により、再現性を担保できないという問題がありました。

そのため、NixOS modulesを管理するための機能として、2021年にFlakesが実験的に追加されました。これはpackage.jsonCargo.tomlのようなもので、flake.nixに依存関係や各種設定を記述していきます。2024年3月現在、このFlakesを用いた環境構築が一般的なようです。

NixOS modulesはシステムの環境構築に重きを置いており、ユーザーの環境構築を行うには少し物足りない部分があります。そのため、home-managerというnix-community製のユーザー環境構築ツールがあります。NixOS modulesはもちろんNixOSの機能ですが、こちらのhome-managerはNixOSに限らず、どのプラットフォームでも導入することができます。母艦はNixOS + home-managerで環境を作っておき、サブや仕事用の環境はMacOS + home-manager、ということもできます。

NixOSのインストール、Flakeとhome-managerの有効化

NixOSで最強のLinuxデスクトップを作ろう

特筆することはなく、上述の記事の手順通りに進めればすべてがうまくいきます。 そのうえでいくつか。

設定のモジュール化

設定ファイルは時間の経過とともに秘伝のタレのようになっていくことが予想されるので、早めにディレクトリを切るなり、共通化できそうなところはまとめておくなりしておくとよさそうです。 このあたりはNixOS & Flakes Book の Modularize Your NixOS Configuration の章が参考になります。

github.com mitchellh 氏のflake.nixを眺めていると、MBPのとき、WSLのとき…と、設定ファイルを出し分けしていてスマートです。

Git 管理している場合、flakes は作業ツリーのファイルのみを参照してビルドする

For flakes in git repos, only files in the working tree will be copied to the store. Flakes - NixOS Wiki

あたらしいファイルやディレクトリを作成してビルドするとき、git add .して作業ツリーに上げるのを忘れるとファイルを認識してくれないのでうまく動きません。これを忘れていたため、「なぜかフォルダが無いって言われてる…」と1時間つぶしてしまいました。

ビルドコマンドを忘れるのでそのメモ

NixOSのビルド

sudo nixos-rebuild switch --flake .#hostname

home-managerのビルド

rm flake.lock
git add .
nix run nixpkgs#home-manager -- switch --flake .#username@hostname

追記:2024/03/11

nixos-and-flakes.thiscute.world

コマンド簡略化のためにjustを使うといいと書いてある。

nixos-and-flakes.thiscute.world

NeovimやZshの設定を変更したら、再ビルドしないといけない…めんどうだ…と思ったら、こちらもソリューションが提示されている。


home-managerは、令和版dotfiles盆栽という趣を感じます。形式がバラバラだったソフトウェアの設定をNix言語で統一して書けるというのは嬉しいかもしれません。Nix言語で書くといっても、こまごまとした設定はJSONみたいな書き味なので分かりやすくていいですね。

コマンドを叩いてあれこれ設定していくのがどうにも苦手だったので、NixOS modulesのように設定ファイルに記述していくだけで済むというのはとても楽です。

Nix、いいですね。