NixOS は、Nixパッケージマネージャー をベースとした自由かつオープンソース のLinuxディストリビューションである。NixOS はシステムの更新をアトミックに行い[ 5] 、宣言的 に環境構築を行えるシステムにより高い再現性と移植性を担保している。[ 6]
NixOSはNixパッケージマネージャーを通じてNixPkgs を主とした複数のパッケージリポジトリを利用できる。パッケージ構成および設定は特別に設計された遅延評価 を行う関数型プログラミング 言語であるNix言語 を通じて定義される。
歴史
Nixは2003年、エルコ・ドルストラ(Eelco Dolstra)率いる研究プロジェクトとして立ち上げられた。信頼性の高いデプロイ 手段の探求を目的としたこの研究の成果は、ドルストラの博士論文 The Purely Functional Software Deployment Model にまとめられ、宣言的かつ純粋関数的に扱う、全く新しいソフトウェア構成へのアプローチを提示した。ユトレヒト大学のエルコ・フィッセルにより監修されたDolstraの研究は、Nixの理論的基礎を築いた[ 7] 。
2006年、アルミン・ヘメル(Armjin Hemel)はNixの思想をLinuxディストリビューションに統合する試みを行い、NixOSのプロトタイプ実装が同氏の修士論文の一部として初めて公開された。[ 8]
2015年、純粋関数的なソフトウェアデプロイモデルを実装するプロジェクトの支援、ならびにNixOSとそのエコシステムの開発への継続的な支援を提供する目的で、NixOS Foundation がオランダ にて設立された。[ 9]
Wikiの沿革
コミュニティによる最初の NixOS wiki は2010年から2011年頃に立ち上げられた。ドキュメントの一元化および共同での知見の共有を目標としていたが、wikiの維持に対するコミュニティの関心が薄れていくにつれ、古く不正確な情報が多くを占めるようになった。
2015年11月、ロク・ガルバス(Rok Galbas)は彼のトーク番組である Make Nix Friendlier for Beginners にてwikiの頽廃した現状を指摘し、コミュニティに大きな議論の波を引き起こした。この時多くの開発者がNixパッケージマネージャーのドキュメントサイトとの統合を主張したが、終いにこの対応が取られることはなかった。[ 10]
2016年中旬、モデレーション不足によってwikiはスパムボットで溢れかえった状態となり、同年8月に編集のロックダウンが行われた。ロックダウン解除を議論するため GitHub に issue が2017年2月に開かれたが、論争は解決に至らないまま終了した。最終的に、2017年5月にてwikiは恆久的に運用停止することとなり、Archive.org に内容がアーカイブとして公開された。[ 11]
Wikiの不在を埋めるため、Jörg Thalheim (Mic92) が2017年4月にnixos-users GitHub Wiki を立ち上げた。GitHub wiki プラットフォームの編集・加筆を迅速に行える特性によりコミュニティの参入は容易になったが、検索機能や目次といった基本的な機能に欠けていたことがユーザー体験の低下につながり、代替としてMediaWikiベースのwikiがTristan Helmich (fadenb) によって立ち上げられた。nixos-users GitHub Wiki のコンテンツはFelix Richter (makefu)によりMediaWiki側へと移行された。[ 12]
2024年1月、新しく公式wikiを樹立するための運動が開始され、現在使われているWikiが発足した。この「復活」は、「NixOSユーザーのために正確かつ統一されたされたドキュメントを維持する」というコミュニティの意志の表れとされた。[ 13]
バージョン歴史
Name
Date
NixOS 13.10 "Aardvark"
000000002013-10-01-0000 2013年10月
NixOS 14.04 "Baboon"
000000002014-04-01-0000 2014年4月
NixOS 14.12 "Caterpillar"
000000002014-12-01-0000 2014年12月
NixOS 15.09 "Dingo"
000000002015-09-01-0000 2015年9月
NixOS 16.03 "Emu"
000000002016-03-01-0000 2016年3月
NixOS 16.09 "Flounder"
000000002016-09-01-0000 2016年9月
NixOS 17.03 "Gorilla"
000000002017-03-01-0000 2017年3月
NixOS 17.09 "Hummingbird"
000000002017-09-01-0000 2017年9月
NixOS 18.03 "Impala"
000000002018-03-01-0000 2018年3月
NixOS 18.09 "Jellyfish"
000000002018-09-01-0000 2018年9月
NixOS 19.03 "Koi"
000000002019-03-01-0000 2019年3月
NixOS 19.09 "Loris"
000000002019-09-01-0000 2019年9月
NixOS 20.03 "Markhor"
000000002020-03-01-0000 2020年3月
NixOS 20.09 "Nightingale"
000000002020-09-01-0000 2020年9月
NixOS 21.05 "Okapi"
000000002021-05-01-0000 2021年5月
NixOS 21.11 "Porcupine"
000000002021-11-01-0000 2021年11月
NixOS 22.05 "Quokka"
000000002022-05-01-0000 2022年5月
NixOS 22.11 "Raccoon"
000000002022-11-01-0000 2022年11月
NixOS 23.05 "Stoat"
000000002023-05-01-0000 2023年5月
NixOS 23.11 "Tapir"
000000002023-11-01-0000 2023年11月
NixOS 24.05 "Uakari"
000000002024-05-01-0000 2024年5月
NixOS 24.11 "Vicuna"
000000002024-11-01-0000 2024年11月
NixOS 25.05 "Warbler"
000000002025-05-01-0000 2025年5月
NixOS は一年に二回、それぞれ5月末と11月末に安定版のリリースを行っている。[ 14] [ 15] [ 16]
機能
NixOSのグラフィカルインストーラー
宣言的な構成
NixOSでは、カーネルからアプリケーション、システムパッケージ、設定ファイルに至るまで、Nix言語で書かれた記述に基づいてNixパッケージマネージャーによって管理される。新しい構成の反映は古いバージョンの上書きを伴わない。[ 17]
NixOSのシステムは、グローバルな設定ファイル(通常/etc/nixos
に存在する)に、 望む機能を記述することで構成できる。例として、下記はSSHデーモンを実行するミニマルなマシンの設定である。[ 18]
{
boot. loader. grub. device = "/dev/sda" ;
fileSystems. "/" . device = "/dev/sda1" ;
services. sshd. enable = true ;
}
設定ファイルを変更した後、nixos-rebuild
コマンドを使用してシステム構成を(設定ファイルに基づいて)更新できる。コマンドの実行はパッケージのダウンロードとインストール、追加の設定ファイルの生成など、新しい構成を反映するために必要なすべての操作を自動的に行う。
アトミックで信頼性の高いアップデート
Nix言語の純粋関数 的な特性により、システムの状態にかかわらず、同じ設定ファイルの評価は常に同じ結果をもたらす。
NixOSはシステム構成の管理にトランザクション的なアプローチを採用しており、アップグレードなどの構成変更をアトミックに行う。例として、システム構成の更新が停電などによって中断されたとしても、システムは変更する前、もしくは完全に更新された状態を一貫に保つ。[ 19]
ロールバック
システム更新の結果が望ましいものではなかった場合、nixos-rebuild switch --rollback
コマンドを利用して古いバージョンの構成にロールバックできる。すべてのシステム構成のバージョンはブート時のメニューに表示され、例えば新しい構成バージョンのシステムが起動できない場合、古い構成バージョンに切り替えて起動することができる。
NixOSの宣言的な構成方法により、システム設定を容易に別のマシンで再現することができる。設定ファイルを別のマシンにコピーし、更新コマンドを実行するだけで、(ユーザーデータなどNixパッケージマネージャによって管理されていない部分を除いて)全く同じシステム構成(カーネル、アプリケーション、システムサービスなどを含む)を再現できる。
ソースコードビルドとバイナリキャッシュの併用
NixOSにおけるパッケージのインストールは、ソースからパッケージをビルドする手順の記述を評価することで行われる。この設計はユーザーによる柔軟なカスタマイズを容易にするが、記述を更新するごとにパッケージを再ビルドする必要が生じ、多量の時間がかかってしまう。そこで、リモートパッケージリポジトリにあらかじめ全パッケージのビルド結果をキャッシュし、パッケージのインストール時に利用可能なビルド結果がある場合、それを直接ダウンロードして利用できる方法が導入されている。ビルド設定の変更、または--option substitute false
をインストール時の引数として指定した場合、パッケージはソースからビルドされる。これらの措置により、Nixはソースベースの柔軟性とバイナリベースの効率性を両立しているといえる。[ 21]
一貫性
Nixパッケージマネージャーは、実行中のシステムがシステムの論理と一致していることを保証する。言い換えれば、パッケージの操作が行われた際、関連するすべてのパッケージも再ビルドされる。例えばカーネルを変更したとすると、関連するカーネルモジュールがすべて再ビルドされる。同様に、ライブラリがアップグレードされると、そのライブラリに(静的にリンクされているパッケージをも含めて)関連する全てのパッケージが、新しいバージョンのライブラリを使うように再ビルドされる。
ユーザー間におけるパッケージ管理
NixOSでは、個別のユーザーがパッケージをインストールするのに特権を必要としない。全システム共通のプロファイル以外に、ユーザー別にそれぞれ独自のプロファイルが割り当てられているため、たとえ同じパッケージの違うバージョンを複数のユーザーがインストールしていたとしても、これらのパッケージは共存できる。複数のユーザーが同じバージョンの同パッケージをインストールしようとすると、パッケージのダウンロードおよびビルドは一回だけ行われる。
Nixはこの操作が安全であることを保証している。なぜなら、システム設定によって明示的に信頼されたユーザーだけが derivationの生成結果を制御できるビルドパラメーター(ビルドサンドボックスに不純物を追加したり、信頼されていないSubstituterー追加のNixストアーを利用するなど)の使用を許可されているからである。そのようなパラメーターが含まれていない場合、ユーザーはビルドにシステムより信頼されたsubstituter、もしくは暗黙的に信用されるローカルのサンドボックス化されたビルド環境のみ使用できる。
実装
NixOSはパッケージ管理にNix (パッケージ管理システム) を利用している。すべてのパッケージは独立した状態でNixストアに保存される。
インストールされたパッケージは、ビルド過程に入力されたすべての情報に基づいて一意なハッシュ値を与えられる。ビルド手順を変更すると異なるハッシュ値が生成され、異なったパッケージとしてNixストアにインストールされる。この仕組みは設定ファイルの管理にも使用され、設定の更新が過去の設定履歴を上書きしないための措置として導入されている。
この特異なパッケージ管理方法により、NixOSのディレクトリ設計は Filesystem Hierarchy Standard に準拠していない。唯一の例外は、/bin/sh
がNixストアにインストールされたbashへのシンボリックリンクとして存在していることである(例:/nix/store/s/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-bash-4.3.43/
)。システムワイドの設定ファイルを保持する/etc
ディレクトリは存在こそするが、その内容のほとんどは/nix/store
に存在するビルド生成物へのシンボリックリンクである(例:/nix/store/s2sjbl85xnrc18rl4fhn56irkxqxyk4p-sshd_config
)。これは、複数のバージョンのパッケージが共存できるように、/bin
のようなグローバルディレクトリを回避したためである。
反響
2015年にDistroWatch WeeklyでNixOS 15.09をレビューしたジェシー・スミス(Jesse Smith)はこう書いている:
NixOSは、システムの変更をいわば「世代」ごとに分けることで、パッケージアップグレードの際の心配をなくしているところがとても気に入っています。エンドユーザーからすると、NixOSの動作は他のLinuxディストリビューションとそう変わりません。NixOSは初心者向けではありませんし、汎用のオペレーティングシステムとして使われることも意図されていないと思いますが、Nixという非常に興味深い技術を検証するためのプレイグラウンドとしては充分に機能しています。この技術はさらなる探索とより多くのディストリビューションによる採用に値すると考えています。
2022年に書かれたFull Circle 紙の NixOS 21.11 "Porcupine"レビュー記事はこう結んでいる:
NixOS Gnome 21.11からは、律儀かつ克明、エレガントな印象を受けた。あなたがGnomeデスクトップのファンなら、気に入るものがたくさん見つかるだろう。このディストリビューションの欠点は、アップデートなどを含むパッケージ管理の学習曲線が険しいことだ。どのディストリビューションから来たとしても、Nixをうまく扱えるようになるまでには、学ぶことがたくさんあるはずだ。
[ 22]
The Register のリーアム・プルーヴン(Liam Proven)による NixOS 22.11「Raccoon」のレビュー:
ほんの2、3年前のNixOSの評価と比較すると、インストールして動作させるのは非常に簡単であることがわかった。このことは、ツールが順調に成熟し、特定の水準に達したことを示唆しているが、初めて使う立場からすると、比較できる事前の基準線がない。これは伝統的なディストリビューションでは決してなく、伝統的なUnixですらないが、うまく動作している上、独特の魅力を私たちは見出した。
[ 23]
DistroWatch のジェシー・スミスによるNixOS 23.11 「Tapir 」のレビュー:
NixOSは、私が使っている間にどんなエラーにも遭遇しなかったという点で、稀有な逸品と言えましょう。動作は安定しており、私のハードウェアとうまく動作し、実行中は一つたりとも問題に遭遇しませんでした。あなたがシステム管理者で、複数のマシンに同一のディストリビューション環境をデプロイ(またはメンテナンス)したいのであれば、NixOSは試してみるだけの価値があると思います。
[ 24]
関連項目
脚注
注釈
^ NixOSは複数の言語で書かれている。(2025年一月時点)
^ NixOSに含まれているソフトウェアの中には異なるライセンスを持つものもある。例えば、Linuxカーネル はGNU GPLv 2でライセンスされている。(2025年一月時点)
出典
^ “Community - nixos.org ”. 2022年9月23日時点のオリジナルよりアーカイブ 。2022年9月23日閲覧。
^ “NixOS/nixos-foundation - Github ”. GitHub . 2022年9月23日時点のオリジナルよりアーカイブ 。2022年9月23日閲覧。
^ “Release 208” . 28 October 2015. 2025年5月13日閲覧 .
^ “nixpkgs/COPYING at master · NixOS/nixpkgs · GitHub ”. Github.com. 2015年9月19日閲覧。
^ “What Is an Immutable Linux Distro, and Should You Use One? ”. HowToGeek.com (2023年12月6日). 2023年12月7日時点のオリジナルよりアーカイブ 。2023年12月7日閲覧。
^ “DistroWatch.com: NixOS ”. Distrowatch.com. 2015年9月19日閲覧。
^ Dolstra, Eelco (2003). “Integrating Software Construction and Software Deployment” . Software Configuration Management . Lecture Notes in Computer Science. 2649 . pp. 102–117. doi :10.1007/3-540-39195-9_8 . ISBN 978-3-540-14036-8 . オリジナルの2019-04-21時点におけるアーカイブ。. https://nixos.org/~eelco/pubs/iscsd-scm11-final.pdf
^ Dolstra. “Purely Functional System Configuration Management ”. www.usenix.org . 2024年3月4日閲覧。
^ “Stichting NixOS Foundation ”. Nixos.org. 2015年9月19日閲覧。
^ Garbas (2015年). “Make Nix Friendlier for Beginners ”. media.ccc.de. 2024年12月31日閲覧。
^ “NixOS Wiki Archive ”. 2024年1月1日閲覧。
^ Helmich. “MediaWiki for NixOS ”. 2024年1月1日閲覧。
^ “NixOS Wiki: History ”. NixOS Wiki . 2024年11月28日閲覧。
^ “Governance ”. Nixos.org. 2020年8月16日時点のオリジナル よりアーカイブ。2020年8月28日閲覧。
^ “Nix RFCS (Request for Comments) ”. GitHub (2021年12月17日). 2024年12月31日閲覧。
^ “Release Announcements ”. Nixos.org. 2023年12月9日閲覧。
^ Dolstra, Eelco; Hemel, Armijn (7 May 2007). Purely Functional System Configuration Management (PDF) . 11th USENIX workshop on Hot topics in operating systems . San Diego, California, USA: USENIX Association. 2020年7月10日時点のオリジナル (PDF) よりアーカイブ. 2023年7月19日閲覧 .
^ “About NixOS ”. Nixos.org. 2015年9月19日閲覧。
^ van der Burg, Sander; Dolstra, Eelco; de Jonge, Merijn (20 October 2008). Atomic Upgrading of Distributed Systems (PDF) . 1st International Workshop on Hot Topics in Software Upgrades . Nashville, Tennessee, USA: Association for Computing Machinery. doi :10.1145/1490283.1490294 . ISBN 978-1-60558-304-4 . 2021年11月13日時点のオリジナル (PDF) よりアーカイブ. 2023年7月19日閲覧 .
^ NixOS Manual - Rolling Back Configuration Changes , Nixos.org, https://nixos.org/manual/nixos/stable/#sec-rollback
^ Dolstra, Eelco (7 November 2005). Secure Sharing Between Untrusted Users in a Transparent Source/Binary Deployment Model (PDF) . 20th IEEE/ACM International Conference on Automated Software Engineering . Long Beach, California, USA: Association for Computing Machinery. doi :10.1145/1101908.1101933 . ISBN 978-1-58113-993-8 . 2021年11月13日時点のオリジナル (PDF) よりアーカイブ. 2023年7月19日閲覧 .
^ Hunt, Adam (2022年10月28日). “Review - NixOS ”. Full Circle Magazine (英語 : Full Circle Magazine ) . 2022年10月28日時点のオリジナルよりアーカイブ 。2022年10月28日閲覧。
^ Proven, Liam. “NixOS 22.11 'Raccoon': Like a proof of concept you can do things with OSes ”. 2024年12月31日閲覧。
^ Smith, Jesse. “NixOS 23.11 ”. 2024年12月31日閲覧。
外部リンク