NixOS紹介
2014年9月24日
NixOSとは
NixOSはパッケージ管理の改善を目標とするリナックスディストリビューションです。 NixOSはNixというパッケージマネジャーを利用しています。
NixとNixOSが解決する問題
純粋関数型言語の概念を多く利用しているため、Nixは「純粋関数型」(Purely Functional)パッケージマネジャーと定義されています。 純粋関数型というのは副作用とグローバルステートがないと意味します。
純粋関数型
純粋というのはパッケージをインストールした場合に他のパッケージやシステムに影響は発生しないと意味します。 関数型というのはパッケージの結果はパッケージの「レシピ」と「材料」で決まります、同じレヒ日と材料は必ず同じ結果になると意味します。 — 各パッケージは独自の領域にファイルをインストールし、パッケージの「レシピ」を変更すると別な領域にインストールされると意味します。
その特徴で
- 同じパッケージの違うバージョンを同時に利用
- 一般ユーザのパッケージをインストール
- システムのロールバック
ができます。
Nixの仕組み
Nixストア
NixでインストールされるパッケージがNixストアーにインストールされます。 Nixストアーは/nix/store
以下となります。 インストールされるパッケージは必ずストアーのサブフォルダーに入ります。Nixストアーは読み込み専用となりますので、インストール後のパッケージを変更することができません。
例えば、tmuxは/nix/store/rlfwwcdkv96cbfbw72cs1b6xmzijch0x-tmux-2.1/
以下のフォルダーに入っています。 その中身は下記となります。
/nix/store/rlfwwcdkv96cbfbw72cs1b6xmzijch0x-tmux-2.1/
├── bin
│ └── tmux
├── etc
│ └── bash_completion.d
│ └── tmux
└── share
└── man
└── man1
└── tmux.1.gz
Nixストアーに同じパッケージの複数なバージョンが存在することができます
/nix/store/0rz3ghjq909wvp9f5gz1z2x7x02gqchg-tmux-2.0/
/nix/store/1kgk6lghy3k6l2wrjh6njrr6ljyir53a-tmux-2.0/
/nix/store/hy4wrcznn1lffbib75yn3d3dalpn3004-tmux-2.0/
/nix/store/ncq6j6n6l1cz826hhs2cb63zik2qrx27-tmux-2.0/
/nix/store/rlfwwcdkv96cbfbw72cs1b6xmzijch0x-tmux-2.1/
ストア内のフォルダー名前はハッシュ-パッケージ名-バージョン
となります。ハッシュはパッケージの「レシピ」と「材料」を合わせたハッシュとなります。 材料である依存パッケージもハッシュに影響するため、依存パッケージが変更される際にNixストアに新しいパッケージが作られます。そのためアップデートでソフトウェアがバグを発生した場合に古いバージョンにロールバックできます。
nixpkgs
nixpkgsはNixのパッケージレシピセットとなります。
nixpkgsの特徴は
- パッケージのレシピ集である
- 完結している
となります
レシピ
パッケージマネジャーでパッケージをインストールする際にパッケージの圧縮ファイルをダウンロードし、インストール事が一般となります。 Nixの場合はnixpkgsの中にパッケージレシピを利用してパッケージをインストールします。 Nixではパッケージのレシピをderivation(導出)と呼びます。
典型的な導出の例はhelloプログラムとなります
{ stdenv, fetchurl }:
stdenv.mkDerivation rec {
name = "hello-2.10";
src = fetchurl {
url = "mirror://gnu/hello/${name}.tar.gz";
sha256 = "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i";
};
doCheck = false;
meta = {
description = "A program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = http://www.gnu.org/software/hello/manual/;
license = stdenv.lib.licenses.gpl3Plus;
maintainers = [ stdenv.lib.maintainers.eelco ];
platforms = stdenv.lib.platforms.all;
};
}
導出の詳しい情報はNixマニュアルで確認できます。 meta
属性はパッケージのメタ情報であって、実際のパッケージインストールに使われないです。 この導出は関数であります(stdenv.mkDerivation
)一行目の{ stdenv, fetchurl }:
のは引数となります。 依存パッケージがある場合は引数で渡されます。Nixのビルドシステムと合わせるとコンパイルタイムの依存関係は完全である保証があります。
完結なパッケージセット
nixpkgsでは全ての導出が入っています。そのため依存関係も完結しています。 一般のパッケージではパッケージのデータベースは外部サーバにあり、利用するサーバや時間によってパッケージセットが異なる事があります。 Nixの場合にはパッケージの完結した導出セットがローカルマシンにあるため、外部パッケージデータベースの影響を受けません。 また、同じコマンドでインストールされるパッケージは必ず同じ結果を生成します。
NixOSの特徴