読了まで:約8分
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 はシステムを柔軟に定義したり、 システムのロールバックが気軽に行なえる反面、特にストレージの領域をかなり消費したりするため、 ストレージをそこそこに確保できない環境では、あまり向かない場合もあり得ます。
またシステム定義の更新の際、 nixpkgs
の master
を追いかけていたりすると、
最新のパッケージ定義に対応するビルド済み binary cache が配信されていないこともあり、
- Chromium や Firefox
- QtWebKit や QtWebEngine
- あとは wine など
と言った様な ビルド自体に時間が掛かるパッケージ を ソースコードからビルドしだす 、 という場面に遭遇する場合も結構あります。
また、システムの根底の方にあるパッケージ定義をカスタマイズしていたりすると、 そのパッケージに依存するパッケージがすべてビルドし直しになったりもするので、 Gentoo Linux ほどではないにしろ、
パッケージ更新でビルドに時間を喰われる
という様な事がぽつぽつ起きて来たりもします。
とは言え、このビルド時間にまつわる話は nixpkgs
の master
を追いかけたりせず、
stable なパッケージ定義の利用時にはあんまり遭遇しないハズなので、
その辺りは、
Archlinux の様に常に最新のパッケージを使いたい!
という事にこだわらなければ、まぁそれほどには困ることに成らないと思います。
[[NixOS]] の小ネタ
- VMware などを使いたい場合には Docker container を使え
- 他の Distro のバイナリーを使いたい? 実は出来るんだなこれが
- Archlinux 風に NixOS を使うには(上級者向け)
1. VMware などを使いたい場合には Docker Container を使う
まぁ VMware で無くとも良いんですが、 VMware の様に システムが Mutable であることを期待するソフトウェア は、 その構造上、たいてい System が Immutable な NixOS と相性が悪いんですが、 その辺りは Docker Container を使うことによってサクっと回避出来たりもします。
なお VMware Workstation Player を利用できる様にする具体的な方法については、
の中身を見て判断して欲しいのですが、基本的な流れとしては、
- VMware Host の Kernel Module を NixOS 側でビルドして有効にする
- VMware Workstation Player を Docker Container にインストールする
- VMware 入りコンテナに特権と必要な情報を渡して Docker Container から起動できる様にする
という様な流れで実際に使うことが出来ます。ただまぁ正解に辿り付くまでにはかなり大変でしたが。
また VMware ではなくとも、glibc
などの ABI 違いにより NixOS で起動できないバイナリなどは、
Docker Container で他の動作可能な Distro のコンテナを用意することによって、
割とラクに動作させられたりもするので、その点でも便利です。
2. 他の Distro の実行バイナリは LD_LIBRARY_PATH
と patchelf
を使って利用可能にできる
例えば Web Browser の Vivaldi などはバイナリーリリースが基本で、 しかもメジャーな Linux Distribution にしか対応していないので、 NixOS 向けには当然リリースされていません。
また NixOS は標準的なファイル位置に glibc の ld-linux.so
も無かったりもするので、
普通に Vivaldi のバイナリを実行するだけでは起動すらしないのですが、
NixOS ではこの辺りの面倒な事柄をなんとかするテクニックが公式に存在しており、
これは、
patchelf
で Executable Binary に patch を当てる
と言うワリと力技っぽい方法でなんとかしています。
まぁ具体的には、
などを見るとなんとなくの流れは掴めると思うので、 そう言う場面に遭遇したらその辺りのテクニックを使う、というのは覚えておいて損はないです。
3. Archliux 風にローリングリリースで NixOS を使う
これはまぁ自分がやっている方法ですが、
私は nixpkgs
の最新の定義ファイルを /etc/nixpkgs
に git 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 出来なくって詰む場合もある(つまり再インストール)
- 特に
nixpkgs
のmaster
を追いかけてたりすると、特にそうなり易い - とは言え、個人的にはバグを踏んだりした時以外はそう言う場面になったことはないけど
- 日本語での [[NixOS]] の情報は ほぼ無い
- と言うか私の書いた記事も含め、日本人の方が書いた記事ってほぼ見かけない……
- あと、私の書いた割とどうでも良い記事が引っ掛るぐらいに NixOS の日本語情報はない
- そのため、問題が起きた時は English を読んで Troubleshooting できないとツラい
- NixOS には Guix という派生っぽい Distro が有る
- これは Nix Expression Language の変わりに Lisp 系言語を使った GNU 系 Linux Distro
- Guix は NixOS で行なっている事を Lisp 系言語で再現した Distro だと思えば良い
- ただし私は使った事が無いため、具体的な中身がどこまで似ているのかは良く知らない
ibus-skk
は workaround 無しでは動かない- ibus で skk で使おうとすると一番ハマる事案
- 自分でも完全に解決できたワケではない
- 一応使う方法があるにはあるが、詳しいことは 私のシステム定義を見てくれ〜