NixOS

とは?

  • いわゆる Linux Kernel を用いた Linux Distribution の一つ
  • Nix という関数型パッケージマネージャが特長で、System が Immutable に定義できる
  • なお System が Immutable なので、VMware などのソトウェアとは相性が悪い

NixOS の利点

  • システム全体の定義を Immutable に定めることが出来る。またロールバックも出来る
  • そのため Chef とか Puppet とか Ansible とかが不要。その辺り nixpkgs が面倒見てくれる
  • また過去にインストールしたが不要になったパッケージなどを GC して一括削除が可能

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

  • Nix Expression Language

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

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

  • /etc/nixos/configuration.nix

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

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

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

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

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

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

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

NixOS の欠点

  • システムのロールバックか可能な反面、GC しないと不要なファイルがストレージを圧迫する
  • System が Immutable なので Mutable な System を想定する VMware などとの相性が非常に悪い
  • また NixOS と言えども、ファイル破損やファイルシステム破損、バグなどで boot しない時もある

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

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

  • Chromium や Firefox
  • QtWebKit や QtWebEngine
  • あとは wine など

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

また、システムの根底の方にあるパッケージ定義をカスタマイズしていたりすると、 そのパッケージに依存するパッケージがすべてビルドし直しになったりもするので、 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 を利用できる様にする具体的な方法については、

Naoki OKAMURA / nixos-configurations · GitLab

My configuration.nix and dotfiles for NixOS or nixpkgs

https://gitlab.com/nyarla/nixos-configurations

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

  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時間ぐらい掛りますた

その他

  • Nix Package Manager は 他の Linux Distro や macOS でも使える
    • ただしシステムの Rollback などは出来ない
    • また一応は他のパッケージマネージャと共存可能(例えば Homebrew とか)
    • とは言え Nix Package Manager は NixOS で使うのが一番強力ではある
  • システムの Garbage Collection の実行は、システムが動作するのを確認してから行うこと
    • これをサボると Rollback 出来なくって詰む場合もある(つまり再インストール)
    • 特に nixpkgsmaster を追いかけてたりすると、特にそうなり易い
    • とは言え、個人的にはバグを踏んだりした時以外はそう言う場面になったことはないけど
  • 日本語での NixOS の情報は ほぼ無い
    • と言うか私の書いた記事も含め、日本人の方が書いた記事ってほぼ見かけない……
    • あと、私の書いた割とどうでも良い記事が引っ掛るぐらいに NixOS の日本語情報はない
    • そのため、問題が起きた時は English を読んで Troubleshooting できないとツラい
  • NixOS には Guix という派生っぽい Distro が有る
    • これは Nix Expression Language の変わりに Lisp系言語を使った GNU 系 Linux Distro
    • Guix は NixOS で行なっている事を Lisp 系言語で再現した Distro だと思えば良い
    • ただし私は使った事が無いため、具体的な中身がどこまで似ているのかは良く知らない
  • ibus-skk は workaround 無しでは動かない
    • ibus で skk で使おうとすると一番ハマる事案
    • 自分でも完全に解決できたワケではない
    • 一応使う方法があるにはあるが、詳しいことは 私のシステム定義を見てくれ〜

nyarlaが大体

Scrapbox でコメントや意見を書く