by @nyarla

NixOS

とは?

NixOS の利点

基本的に NixOS は Nix package manager を核とした Linux Distribution で、 この Nix package manager は関数型なシステム設定記述言語である、

を使ってパッケージ定義やシステムの状態を定義していきます。

そのため NixOS ではシステム全体の状態の定義を、

というファイルを起点として定義していき、 システムの状態を更新するためにはシステム全体のリビルドが必要となる、 というスタイルになっています。

またこのシステム状態の定義の更新の際、リビルドが何らかの理由で成功しなかった場合には、 そもそもシステムの状態への変更が適用されないため、パッケージの更新などで、

パッケージが壊れててシステムが正常に動かなくなった

ということに遭遇する率がかなり減っています。

また、システムの更新履歴やそのシステムの起動時に使われたファイルなどは、 コマンドで明示的に削除しない限りファイル全体が残るようになっているため、 たとえば、

システムの定義更新自体は成功したけど、なんか上手いこと動いてないぞ……?

という時でも、reboot 時にマシンに残っている過去の定義へ戻すことが出来るので、 安心してシステムに大規模な変更を加える事も可能になっています。

NixOS の欠点

これらの欠点は NixOS のメリットの裏返しなのですが、NixOS はシステムを柔軟に定義したり、 システムのロールバックが気軽に行なえる反面、特にストレージの領域をかなり消費したりするため、 ストレージをそこそこに確保できない環境では、あまり向かない場合もあり得ます。

またシステム定義の更新の際、 nixpkgsmaster を追いかけていたりすると、 最新のパッケージ定義に対応するビルド済み binary cache が配信されていないこともあり、

と言った様な ビルド自体に時間が掛かるパッケージソースコードからビルドしだす 、 という場面に遭遇する場合も結構あります。

また、システムの根底の方にあるパッケージ定義をカスタマイズしていたりすると、 そのパッケージに依存するパッケージがすべてビルドし直しになったりもするので、 Gentoo Linux ほどではないにしろ、

パッケージ更新でビルドに時間を喰われる

という様な事がぽつぽつ起きて来たりもします。

とは言え、このビルド時間にまつわる話は nixpkgsmaster を追いかけたりせず、 stable なパッケージ定義の利用時にはあんまり遭遇しないハズなので、 その辺りは、

Archlinux の様に常に最新のパッケージを使いたい!

という事にこだわらなければ、まぁそれほどには困ることに成らないと思います。

NixOS の小ネタ

  1. VMware などを使いたい場合には Docker container を使え
  2. 他の Distro のバイナリーを使いたい? 実は出来るんだなこれが
  3. Archlinux 風に NixOS を使うには(上級者向け)

1. VMware などを使いたい場合には Docker Container を使う

まぁ VMware で無くとも良いんですが、 VMware の様に システムが Mutable であることを期待するソフトウェア は、 その構造上、たいてい System が Immutable な NixOS と相性が悪いんですが、 その辺りは Docker Container を使うことによってサクっと回避出来たりもします。

なお VMware Workstation Player を利用できる様にする具体的な方法については、

の中身を見て判断して欲しいのですが、基本的な流れとしては、

  1. VMware Host の Kernel Module を NixOS 側でビルドして有効にする
  2. VMware Workstation Player を Docker Container にインストールする
  3. VMware 入りコンテナに特権と必要な情報を渡して Docker Container から起動できる様にする

という様な流れで実際に使うことが出来ます。ただまぁ正解に辿り付くまでにはかなり大変でしたが。

また VMware ではなくとも、glibc などの ABI 違いにより NixOS で起動できないバイナリなどは、 Docker Container で他の動作可能な Distro のコンテナを用意することによって、 割とラクに動作させられたりもするので、その点でも便利です。

2. 他の Distro の実行バイナリは LD_LIBRARY_PATHpatchelf を使って利用可能にできる

例えば Web Browser の Vivaldi などはバイナリーリリースが基本で、 しかもメジャーな Linux Distribution にしか対応していないので、 NixOS 向けには当然リリースされていません。

また NixOS は標準的なファイル位置に glibc の ld-linux.so も無かったりもするので、 普通に Vivaldi のバイナリを実行するだけでは起動すらしないのですが、 NixOS ではこの辺りの面倒な事柄をなんとかするテクニックが公式に存在しており、 これは、

patchelf で Executable Binary に patch を当てる

と言うワリと力技っぽい方法でなんとかしています。

まぁ具体的には、

などを見るとなんとなくの流れは掴めると思うので、 そう言う場面に遭遇したらその辺りのテクニックを使う、というのは覚えておいて損はないです。

3. Archliux 風にローリングリリースで NixOS を使う

これはまぁ自分がやっている方法ですが、 私は nixpkgs の最新の定義ファイルを /etc/nixpkgsgit clone しており、 これを

nixos-rebuild -I nixpkgs=/etc/nixpkgs boot

と言った様な感じで指定することによって常に最新の nixpkgs の定義を使って、 システムの定義を更新していたりします。

とは言え、こう言う使い方をしていると時々は Chromium の リビルドなどが普通に降ってくる ので、

時間の余裕が有るときにシステムの定義を更新する

と言うことを心掛け、またいつでも任意の定義に戻れる様に、

git tag {YYYY}-{MM}-{DD}

と言った様な感じでタグ付けも行っています。(で、この辺りをサボると後でハマる……)

※ちなみにいつぞやの更新時はシステムのリビルドがだいたい 7 時間ぐらい掛りますた

その他