用語の定義
用語の曖昧さは学習の妨げになるだけでなく、不毛な争議の原因にもなります。特にNixにまつわる用語は混同されやすいため、本書で使う用語を明確に定義しておきます。
本書では可能な限りバージョン2.20版Nix Reference Manualの13. Glossaryで定義されている用語を使います。Nix独自の用語はカタカナあるいはアルファベットで表記します[1]。
このセクションでは本書における「Nix」の意味を定義します。
Nix
Nixは単なるパッケージマネージャに過ぎず、以下のように様々な側面を持っています。
- パッケージマネージャとしてのNix
- ビルドシステムとしてのNix
- Nix言語(ドメイン固有言語)
- Nixpkgs(パッケージレジストリ)
- NixOS(Linuxディストリビューション)
全て「Nix」という名を冠しているので、文脈によっては混乱してしまうでしょう。
そこで本書では「Nix」という言葉を「NixOS/nixで開発されているパッケージマネージャ」という意味で使うことにします。
Nixは以下のような特徴・機能を持っています。
NixはあらゆるLinuxディストリビューションやmacOSをサポートするユニバーサルなツールです。通常のファイル構造(Filesystem Hierarchy Standard)から独立した場所でパッケージ管理を行うため、APT, Pacman, RPM, Homebrewなどのパッケージ管理システムと競合せず、またユーザー権限で動作するため、これらを完全に代替するものでもありません。
Nixは、OSのパッケージマネージャというよりも、プログラミング言語のパッケージマネージャ(Cargo, npmなど)に近いツールです。
本書ではNixのユニバーサルなツールとしての側面を重視し、その使い方を解説します。
Nix言語
Nix言語は、Nixで利用される専用のプログラミング言語(ドメイン固有言語)です。Nix言語とNix言語を利用するツール(=パッケージマネージャNix)の名前が同じなので、混乱を避けるために常に「Nix言語」と呼ぶことにします。
NixOS
パッケージマネージャとしてのNixとNixOSは別物です。
NixOSは、Nixを単なるパッケージマネージャとして利用しているわけではありません。NixOSではOSの設定(ユーザー、ネットワーク、サービス、ドライバー、etc)をNix言語で記述し、それをNixで評価・ビルドした後、NixOS側で変更を適用することで環境構築を行う特殊なLinuxディストリビューションです。
ユーザー権限で動作するNixと異なり、NixOSはroot権限の領域を操作することができるため、カーネルやドライバーといったシステム用のパッケージをインストールすることができます。
パッケージマネージャNixがNixOS/nixで開発が進められているのに対し、NixOSはNixOS/nixpkgsから提供されていることからも、両者が区別される存在であることが分かると思います。
本書ではNixOSについては取り扱いません。
「Instantiateされたstore derivationをrealiseする」というような奇妙な文章が度々出てきます。ご了承ください。 ↩︎