- Nixパッケージマネージャーを基盤とするNixOSは、システム全体をコードとして定義し、いつでも決定的・再現可能な状態へ復元できる構造を持つ
- すべての設定とパッケージを1つの宣言的な構成ファイルで管理し、新しいマシンでも同一の環境を単一のソースから再構築できる
- 6か月周期の安定したリリースと自動更新に加え、必要に応じてunstableチャネルによる最新ソフトウェアの試用もサポート
- 隔離された開発環境を提供し、システムを汚染せずにさまざまな言語やツールを試せるうえ、macOS・Linux間で一貫した開発体験を維持できる
- LLMコーディング時代の素早いツール切り替えにも対応し、Dockerより決定的でレイヤー化されたビルドモデルでデプロイまで一貫性を確保
NixOSの哲学と魅力
- NixOSの中核はLinuxディストリビューションではなく、Nixパッケージマネージャーにある
- NixOSは決定的で再現可能な関数型パッケージマネージャーの成果物であり、入力されたNix DSLに従ってOS全体を構成できる
- システムを再構築したり一部だけを変更したりでき、気に入らなければロールバックできる仕組みを備える
- 多くのOSが時間とともに不安定になっていく一方で、NixOSは状態を定義してビルドできる
- パッケージのインストール、設定変更、ツールの追加・削除による不明瞭な状態の蓄積を防ぐ
- システムをコードとして定義することで、いつでも同じ結果を再現できる
宣言的構成と単一ソース管理
- NixOSではパッケージ、設定、キーボードマッピングなどシステム全体を1つの宣言的構成として定義できる
- GNOME拡張の設定やキーボードマッピングの例のように、細かな動作までNix DSLで記述できる
- 新しいコンピューターでも単一のソースからシステム全体を再構築できる
- 手動設定や散在するスクリプト管理なしに、一貫したシステム状態の維持が可能
安定性と更新管理
- NixOSは6か月周期の予測可能なリリースを維持し、自動更新をサポートする
- 一般的なOSアップグレードで起こりがちな不安定化、通知、システムドリフトの問題を最小限に抑える
- 必要に応じてunstableチャネルを有効化し、最新ソフトウェアを試験的に利用できる
- HPのノートPCでもハードウェア互換性と安定性が高く、特別な設定なしですぐ使える
実験と開発環境の隔離
- NixOSは安全で低コストな実験環境を提供する
- パッケージをシステムに直接インストールせず、隔離されたshell環境で実行できる
- Nix DSLで依存関係、ビルド手順、成果物を宣言的に定義し、汚染のない開発環境を維持する
- macOSとLinuxの両方で同じNixパッケージマネージャーを使えるため、開発ツールと依存関係管理の一貫性を確保できる
- FreeBSD向けのコミュニティサポートも存在する
LLMコーディング時代との相性
- LLMベースのコーディングツールでは、特定バージョンのユーティリティ、コンパイラ、ランタイムを頻繁に切り替える必要がある
- Nixはこうした要件に合わせてツールを宣言的な入力として扱い、隔離環境で実行する
- たとえばRustの音声テキストエージェントをビルドする際、NixはRustツールチェーンを自動で読み込み、隔離されたビルド環境を構成する
- システム環境(
~/.cargo、~/.rustup、PATHなど)は変更しない
flake.nixとnix flake checkを通じて、エージェントの実験環境を再現可能なアーティファクトとして固定できる
- 一時的なセッションを検証可能なビルド単位へと変換する
デプロイと一貫した開発モデル
- NixはDockerより決定的でレイヤー化されたイメージビルド方式を提供する
dockerTools.buildLayeredImageを使って、小さく再現可能なDockerイメージを生成できる
- 同じ設定で別アーキテクチャでも同一の結果をビルドできる
- 同じモデルをノートPC、シェル、プロジェクト依存関係、CIパイプライン、デプロイ成果物まで一貫して適用できる
- 複数のツールを組み合わせる代わりに、1つの考え方でソフトウェアシステム全体を管理できる
結論
- NixOSは宣言的で、再現可能で、巻き戻し可能かつ安定したシステムの実装である
- 実験やアップグレードを恐れずに行え、急速に変化するツール環境でもシステムを汚染しない
- LLMコーディングエージェントのような最新の開発フローにおいても、安定性と柔軟性を同時に提供する
- NixOSはこうした哲学を日常の中で最も完全に実装した形である
8件のコメント
私も昔、半年弱NixOSを使っていたんですが、ほかのOSでは別に調べるまでもないようなとても簡単な作業が、いくらググっても解決できなくて、NixOSフォーラムのような場所で、あるNixOSの専門家?の方が記録しておいた解決策を見たんです。ところが、その数十行に及ぶhackyな解決策がいちばん「いいね」を集めているのを見て、これからのNixOS生活が真っ暗に感じられて、Archに戻りました……
それと、うろ覚えなんですが、
flakeだったか何かの機能が、ある場所ではベストプラクティスと言われ、ある場所では experimental とされ、またある場所ではその両方だったりして、そういう状態が何年も続いているのを見て、これはかなり苦労しそうだなと思いました..もちろん、デスクトップ環境全体を簡単にコード化できる体験は楽しかったです
Firebase StudioもNixを使用しています
おお…そうなんですね!
それはそうと、R.I.P. Firebase Studio (泣)
難しすぎます。少し試してみたけど諦めました…
(I use Arch btw)
知る人ぞ知る感じで使われていますね(笑)
宣言的な関数型言語で実現する再現可能なセットアップ
ラーニングカーブがとんでもなくきついです。再現性を保証するぶん、高いレベルが求められます。
flakeを使っても厄介です。それに内部的には
sqliteを使っているようですが、これも性能のばらつきがあって、一度環境を再現し直すのにかかる時間の fluctuation が少しあります。Hacker Newsのコメント
私はNixOSがAIツールとの相性という点で群を抜いていると思う。
他のOSではAIにシステム設定を任せるのは難しいが、NixOSは宣言的でロールバック可能な構造のおかげで信頼できる。
PulseaudioからPipewireへ移行したり、Hyprlandをインストールしたりする作業をClaudeやCodexに任せようとは思わないが、NixOSならGrokにでも任せられるくらい自信がある。
変更内容を事前に確認でき、いつでも元に戻せる安定性が核心だ。
開発者なら「AIが管理するLinuxデスクトップ」を夢見て、NixOSを試してみることを勧める。まずはClaudeに「FlakeベースのGnome設定をVMで実演できるようにして」と頼むところから始めればいい。
ClaudeがGNOMEのdconf設定を宣言的に調整するのを見ると驚かされる。
ただしAIはNixエコシステムの複雑な文脈を理解できず、ときどき見当違いの結果を出すこともある。
Nixの非定形なラムダ構造やモジュール間の暗黙的スコープのせいで、人間だけでなくAIにとっても難しいと感じる。
だからこそ、プロジェクトの構造やパターンを明確に定義しておくことが重要だ。それでもNixベースのテンプレートを作る過程は楽しく、生産的だ。
HyprlandのインストールにわざわざLLMを使う必要があるだろうか? 単に
sudo dnf install hyprlandで十分だ。Nixが「AIフレンドリー」なのではなく、人が直接扱うには面倒だからLLMを使いたくなるだけのように思える。
複数マシンの設定を「ビジネスプロファイル」として管理し、各マシンに必要なrepoと設定を自動配布している。
会社の同僚はもともとWindowsユーザーだったが、今では日常的にNixOSを使っている。
ハードウェア設定もすべて宣言的に管理しており、私の設定はGitHub公開リポジトリにある。フィードバック歓迎だ。
新しい構造へ設定を移したり、複数のWM/DEテスト環境を作ったりするときも、Claudeが反復作業の大半を処理してくれる。
今ではシステムが完全に安定していて、手作業でやることはほとんどない。
他のOSではこうした信頼を持つのは難しい。
その代わりDockerスクリプトで開発環境を管理していたが、今ではNixとAIの相性は完璧だと感じている。
これからはAIがより扱いやすいソフトウェアがたくさん出てくる気がする。
30年間Windowsを使っていたが、1年前にNixへ完全移行した。
もうWindowsに戻るつもりはまったくない。
OS全体の設定がGitリポジトリに入っている点がとても気に入っている。
Nixなしで開発するのは、Gitなしでコーディングするのと同じくらい非効率だ。
一度設定してしまえば、その後の新しいシステムのセットアップは非常に簡単になる。
各アプリを独立した環境で動かしても、システム全体には影響しないようにしたい。
NixOSはそういう未来へ向かう道の一つだと思う。
Nvidia GPUも問題なく動き、Gamescopeよりずっと安定している。
NixOSをもっと好きになりたいが、ドキュメント不足が最大の問題だ。
情報がさまざまなフォーラムや古いブログ、issueに散らばっている。
どちらも更新されているが、検索するたびにどちらが最新なのか変わる。
nixpkgsをクローンして直接読むのがいちばん早い。
NixOSをノートPC用OSとして使ってみたが、長所と短所がはっきりしていた。
宣言的設定とスナップショット機能は革新的だったが、パッケージ/サービスの区別やFlakeの概念は混乱しやすかった。
KDEをインストールすると最小構成しか入らず追加設定が必要で、ドキュメントもバージョンごとに違っていて追うのが大変だった。
結局、安定したマシンが必要で断念したが、システム管理者には素晴らしい選択肢だと思う。
Determinate SystemsのインストーラはデフォルトでFlakeを有効にしてくれる。
/etc/nixosの設定をGitリポジトリに移せるし、nixos-install --flake <repo>コマンドで完全な設定のデプロイが可能だ。Home-managerを併用すればユーザーディレクトリまで宣言的に管理できる。
/etcファイルはenvironment.etcで、.configファイルはhome-managerオプションで管理できる。関連リンク: environment.etc オプション, home-manager オプション
mkOutOfStoreSymlink関連の文書を探していたら、「簡単だから文書は不要」という回答を見て笑ってしまった。それでもNixOSの利点があまりに大きいので、ホームラボ → ノートPC → デスクトップの順で完全移行を進めている。
ただし文書の状況は今でも絶望的だ。
つまり、package.jsonとlockファイルの役割をNixレベルで果たすものだ。
以前からNixOSは好きだったが、LLM時代になってさらに好きになった。
Codexに「このサーバー設定を修正してワイルドカード証明書が動くようにして」と頼むと、5分で解決してくれる。
再現可能なサーバー管理がここまで簡単になったのは初めてだ。
NixOSに移行してから、aptやbrewで管理していた時代が石器時代の技術のように感じられる。
CopilotのようなAIツールとの相性も素晴らしい。
問題を解決するには一般的なLinux以上に深い理解が必要だ。
その代わり、複雑さを最初にまとめて支払う構造になっている。
nix-shellで一時的なインストールをしたり、設定ファイル一つでインストール済みの全パッケージを確認できたりするのが最高だ。
自動スナップショットのおかげで実験が怖くない。失敗しても前の世代で起動すれば終わりだ。
昔はカーネルパラメータの変更が怖かったが、今では気軽に試せる。
Lispが好きなのでGuix Systemも検討したが、実用性の面ではNixOSのほうが上だ。
NixOSの独特なファイルシステム構造さえなければと思う。
複数バージョンのPythonを同時に使う問題を解決するためのアプローチなのだろうが、私には不要だ。
単にすべてのマシンで同じ設定を保ちたいだけだ。
今はFedora bootcイメージとPodmanを試しているが、
nixos-rebuild switchのような即時反映機能がなくて不便だ。結局、簡単に実験できるNixと標準的なファイルシステムのFedoraの間のトレードオフになる。
NixOS最大の利点はCIキャッシュの決定論的再現性だ。
毎回パッケージを再ビルドする必要がなく、開発環境のセットアップも簡単だ。
たとえばTangledはCIシステム全体をNixで構築していて、GitHub Actionsのキャッシュ問題を完全に解決した。
システム全体ではないが、devenv.shをよく使っている。
ローカルコンテナよりずっと簡単に開発環境を構成できる。
asdfの
.tool-versionsのように簡単にバージョンを揃える方法がなくて残念だ。Nix界隈では「それは間違ったアプローチだ」と言われるが、私はやはり個別バージョンを固定したい。
pkgs.mkShellでも似た環境を作れるのに、なぜあえてdevenvを使うのか気になる。私はNixOSも好きだが、Guixのほうをより好んでいる。
Guile言語のほうが馴染みがあり、ドキュメントもより充実している。両者は姉妹関係のようなものだと思う。
**実際のプログラミング言語(Scheme)**を使っている点が大きな利点だ。
単なる設定言語よりはるかに強力な基盤を持っている。