NixOS設定のflake化¶
NixOSのconfigurationは flake として定義することができる。
私は素朴な設定を好んでいるので、以前はこれをやっていなかったのだが、多くのプロジェクトがflakeとしてビルドできる形で存在していて(例: Zen)、それをそのままのconfigurationから取り入れるのが面倒だと感じたので素直にflake化したほうが良いと思っている。
メリットは以下
- 入力をflakeで管理できる
- nixpkgsしか使わないとしても、もともとのNixOSだとconfiguration.nixにあるnixpkgsは nix-channel というマシン固有の状態に依存しているが、flake化すると inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; と直接宣言でき、また解決された実体は flake.lock で固定される
- 外部のNixプロジェクトを扱いやすい
- ↑のZenの話もそうだし、home-managerもそう
- 1つのプロジェクトで複数のマシンの設定を管理
- そもそもflakeは自然にGitで管理できる
- 複数の output を指定できるので、一部を共通化したうえで、デスクトップマシン用、ラップトップ用、サーバー用…と変化をつけられる
- nix-darwinなどを使えばmacOSでさえも管理可能!
設定方法はかなり簡単。
今回は ~/.nixos/ にセットアップしていくことにする
- OS全体の設定だが、いつも使ってる管理ユーザのホームディレクトリに置いておいたほうがエディタで開きやすいしAIも使いやすいのでそうしておこう
とりあえずもとの /etc/nixos/configuration.nix /etc/nixos/hardware-configuration.nix を ~/.nixos/ にコピーする。その後、以下の flake.nix を作成。
{
description = "NixOS configuration for nixos";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
};
outputs = { self, nixpkgs, ... }:
{
nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
];
};
};
}
gitで管理していないとflakeにローカルツリーとして管理されるので、最初からgit配下に入れておこう。dirty状態にはなるもののコミットは一旦しなくてもOK。 git init git add . -v しておいて、以下で一旦テスト。
#.nixos の部分は outputs に入れた名前。
エラーが出なければ、
で実際に適用。