カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

NixOS は良いぞ!という話

僕はここ一週間ぐらい、普段使いの OS として、

を使って、色々と大胆な Linux デスクトップ構成を試していたりしたんですが、 その過程の中で、色々と NixOS への知見やら、便利さが判ってきたので、 今日はその辺り書きたいと思います。

NixOS の利点

NixOS は、まあパッケージマネージャが関数型言語だったりして、 色々と独特な感じでは有るんですが、僕がここ一週間ぐらい使ってみて、

特にこれが便利!

と感じた利点は、

  1. システムの状態を設定ファイルで一括管理できる
  2. パッケージ定義を割と簡単に書き換えることが出来る
  3. システムの状態を手軽に巻き戻す事が出来る

と言った辺りです。

それで、 (1) に関しては、以前、 macOS で (と言うか OSX の頃に流行った) GitHub 社の Boxen や、 あるいは、Ansible とかそういう系統のソフトウェアが行なっていた事と被るんですが、 NixOS の package manager は、システムの設定が、/etc/nixos 以下に集約されており、 その設定ファイルに基づき、システムへの変更が反映される、という仕組みになっています。

そして、もちろん Adhoc なパッケージ追加なども出来るっちゃあ出来ますが、基本的には、

  • /etc/nixos/configuration.nix

を起点として、システムの状態を定義していく、と言うスタイルで環境構築した方が良く、 その方法を使うと、 Git などのバージョン管理システムと非常に相性が良いです。

また、 (2) と言う利点に関して言えば、システム設定などの定義ファイルで、 パッケージの中身を一部だけ書き換える便利関数がとか揃っているので、例えば

mlterm のコンパイルオプションを一部だけ書き換えたい!

みたいな時に、システムからパッケージの定義ファイルをコピーして、それを書き換えて、あとはコンパイル…… みたいな面倒な事はなく、便利関数使って定義を一部変更して、あとはシステムにそれを適用する、 と言う事を行うだけで、パッケージのコンパイルオプションの一部変更とかが手軽に出来ます。

さらに (3) に関しては、他の Linux などだと多分出来ないんじゃないか、と思うんですが、 NixOS だと、例えば、

Kernel modules の変更を加えたら、KP して Linux が boot 出来ないでござる

みたいな時に、

まず、とりあえず一つ前の boot した状態に rollback して boot!

みたいなコトが bootloader 経由で出来ます。

また、configuration.nix を Git などで管理しておけば、色々とシステムに不可逆な変更を加えていても、 git checkout で configuration.nix を元に戻して、システムが安定していた頃の設定に戻す、なんて事もでき、 これらの (1) と (2) と (3) を組み合わせると、

システムパッケージに修正を加えつつシステムに大胆な変更を加えてみて、 どうしてもダメだったら git checkout で configuration.nix を元に戻してから、 以前使っていた安定していた状態に rollback !!!

みたいなコトが出来ます。なので、システム設定を変更し放題です

NixOS の欠点

それで、そんな

システム設定変更し放題!

な NixOS にも、いくつかの欠点も有って、それは大体、次の通りだったりします:

  1. ストレージの容量をそこそこに良く喰う
  2. Adhoc なシステム設定が加えにくい (これは利点の裏返し)
  3. パッケージのバージョンや種類が、あまり充実してない面が有る (特に日本語)

まあ、NixOS の最大の利点である システムのロールバックし放題! という利点は、 いったいどの様に実現しているのか、って言ったら、それは、

以前の状態を再現するためのファイル全部システムに残す!

という、まあそりゃストレージ食って当然だよね、って言う手法を使っているので、 NixOS の古いパッケージに類いは、そこそこに掃除と言うかガベージコレクションしないと、 割と簡単に Disk full になります。例えば SSD でシステムパーティションの割り当て容量が少ないと特に。

また、 (2) に関して言えば、これは NixOS はシステムを構成する設定ファイルの類も、 すべて configuration.nix 経由で設定する、というスタイルで構成されているので、 まあ緊急時のアドホックな対応、というのには、あまり向かない面が有ります。

ただし、これは、configuration.nix 等を git などで管理して、システムへの変更をトラッキング出来る、 という利点の裏返しな欠点なので、まあそういうモノだと思うしかないです。

それで、最後の (3) に関しては、NixOS 自体、あんまり日本では普及してない以前に認知されてないっぽいし、 また世界を見渡しても、まだ、そんなには大規模に使われている感じではなさそうな感じなので、 ま、これについてもしゃーないかなぁと思ってます。はい。

まとめ

NixOS はまだまだマイナーっぽいし、あとパッケージ定義なども Archlinux とか Gentoo と比べると、 最新には追従し切れてえないっぽいので、その辺りの最新を常に追い掛ける、となると、 ちょっと不向きかなぁ、と思わないでもないものの、

システムへの大幅な変更を加えつつ、ダメだったらそこから前の状態にロールバック!!1

と言う事が非常に簡単に出来るので、まあ、僕みたいに常にシステムを弄くり回す、 と言う人には向いているかと思います。 システムを再インストールしないと再起不能、とかに成りにくいんで

また、僕は NixOS を使い出してから今日に至るまでに、

  1. Linux Kernel のバージョンを上げたり下げたり
  2. パッケージ定義の revision を stable から unstable を何回か切り替えたり
  3. システムへの変更を大胆に加えたあと、安定しなかったんんで元に戻したり

と言い様なコトを散々行なってきましたが、 まだ一度も再インストールはしていません

というか今のこの記事を書いているシステムは、変更適用回数が 200世代目を超えています が、 特にシステムがぶっ壊れて再起不能、とか一度も起きていませんし。

ただ、とは言えシステムが boot しない世代で、以前の世代を garbage collection とかしてしまうと、 流石に復帰は出来なかったりするとは思いますが。


とまあ、そんな感じで、

NixOS は良いぞ!

という話でした。

あと、この NixOS 、たぶんその性質から言って、今はもう半分ぐらい死語になりつつある DevOps とかと相性は良いはずだし、 また、macOS だと nixpkgs がたしか使えたはずなんで、まあその辺りから NixOS の世界に触れてみるのも良いかと思います。

ただし、基本的には英語圏の情報しかなく、 日本語の情報なんて、検索をすると自分のペラい日記が引っ掛るぐらいなので、 まあその辺りは諦めましょう。今はそういうモンです。はい。

というコトで、久しいぶりの力作な日記でした。NixOS は良いぞ……!