用語の定義
用語の曖昧さは学習の妨げになるだけでなく、不毛な争議の原因にもなります。特にNixにまつわる用語は混同されやすいため、本書で使う用語を明確に定義しておきます。
本書では可能な限りバージョン2.20版Nix Reference Manualの13. Glossaryで定義されている用語を使います。Nix独自の用語はカタカナあるいはアルファベットで表記します[1]。
このセクションでは本書における「Nix」の意味を定義します。
Nix
Nixはパッケージマネージャ兼ビルドシステムです。NixOSではありません。
Nixはユーザー権限で動作するツールであり、UNIX系システムであればどのOSでも動作します。Debian, Ubuntu, Fedora, Arch Linux, macOS, etc...いずれのOSでもNixを使うことができます。また、Nixのパッケージを管理するNixストアは既存のファイル構造から独立しているため、apt, pacman, rpm, brewなどのパッケージ管理システムと競合しません。
Nixの機能は主にパッケージ管理とビルドですが、両者を区別することにあまり意味はありません。ビルドシステム視点では依存関係解決のためにパッケージ管理システムが必要であり、逆にパッケージマネージャ視点からはパッケージを作成するためのビルドシステムが必要です。パッケージ管理とビルドは相補的な関係になっています。
よって、「パッケージマネージャNix」と言うときは、Nixのビルドシステムとしての側面も含むことに留意してください。本書では「Nix」を「パッケージマネージャNix」という意味で使います。
Nix言語
Nix言語は、Nixで利用される専用のプログラミング言語(ドメイン固有言語)です。Nix言語とNix言語を利用するツール(=パッケージマネージャNix)の名前が同じなので、常に「Nix言語」と呼び、パッケージマネージャNixとは明確に区別します。
NixOS
パッケージマネージャNixとNixOSは別物です。
Debian/Ubuntuのパッケージマネージャがapt、Fedoraのパッケージマネージャがdnfであるように、NixOSのパッケージマネージャがNixです。一つ大きく異なるのが、Nix自体はNixOSから独立していることです。例えば、aptはDebian/Ubuntuでしか動作せず、FedoraやArch Linuxで使用することはできません。一方、NixはユニバーサルなパッケージマネージャなのでLinuxであればどのディストリビューションでも使用することができます(さらにはmacOSでも使用できます)。
基本的にユニバーサルなパッケージマネージャはroot権限を要する操作を行うことができず、この点はNixも同様です。
NixOSはNix言語でシステムの設定(ユーザー、ネットワーク、サービスなど)を記述し、それをコマンドで適用することでシステムを構築します。NixOSは設定ファイルの評価やパッケージのビルドまでをNixで行い、root権限を要するような実際にシステムに変更を加える操作は別のプログラムが行っています。
本書はNix単体の解説に焦点を当てているため、NixOSについては取り扱いません。
「Instantiateされたstore derivationをrealiseする」というような奇妙な文章が度々出てきます。ご了承ください。 ↩︎