コンテンツにスキップ

configuration.nix から Flake へ

目次

受験まで残り 240 日を切って、時間がカツカツでブログを書く余裕もあまりない。でも鯖の民に「さすがに一本くらい書け、じゃないとサイトが永遠に空っぽだぞ」と詰められたので、一念発起。日記を書く習慣はあるんだけど、ちょっと私的すぎるので公開はしない

とはいえ忙しい中でも色々やってはいて、例えば先週末にはずっとやりたかった Flake への移行を済ませた。CodeX CLI の助けで大して時間もかからず、AI Agent に一番面倒なところを任せたらほぼ一発で通った。現在のディレクトリ構成はこんな感じ:

.
├── flake.lock
├── flake.nix
├── home
│ └── modules
│ ├── dae.nix
│ ├── fzf.nix
│ └── niri.nix
├── Justfile
└── nixos
├── configs
│ ├── dae
│ │ └── config.dae
│ └── niri
│ └── config.kdl
├── hosts
│ └── kokosa
│ ├── default.nix
│ └── hardware.nix
└── modules
├── boot.nix
├── desktop.nix
├── locale.nix
├── networking.nix
├── nix-settings.nix
├── packages.nix
├── security.nix
├── services.nix
└── users.nix

Home Manager で管理しているソフトウェアのうち、実際使ってるのは fzf だけ。残り 2 つは使う予定で先に設定を書いただけで、設定では無効にしてある


なぜ Channels から Flakes に移行したのか

Section titled “なぜ Channels から Flakes に移行したのか”

configuration.nix に比べると、Flake は多くの問題を解決してくれる。全パッケージと依存関係のバージョンをロックでき、ひとつの設定ファイルでバージョン番号とコミットレベルまでシステム全体を再現できる。一方、configuration ではそれが難しく、Channel の更新に追従してしまう

特性ChannelsFlakes
依存暗黙的 (channels)明示的 (inputs)
再構築sudo nixos-rebuild switchnh os switch .
再現性各自の channel バージョンに依存flake.lock で一貫性を保証
開発nix-shellnix develop

nh は NixOS のヘルパーツールだけど、configuration モードだと挙動が微妙だった。Flake にしてからすごく使いやすいツールだと分かった。おすすめ

また Flake は Inputs を使って他の Flakes(例:sodiboo/niri-flake)を簡単に参照できるため、公式にサポートされていないソフトウェアも宣言的に管理できる。Niri は HM で管理するつもりはもともとない

開発環境の面でも、GitHub/Codeberg 上の多くのオープンソースプロジェクトのルートに flake.nix が置かれているのに気づくだろう。このファイルがあれば Nix で開発環境を丸ごと再現でき、ホストシステムからも隔離される——たった一行の nix develop だけで。最近の Nix プロジェクト(Nix プロジェクトでなくても)はみんなこれを使い始めている。だって便利だから

もちろん欠点もある。API は不安定(2019 年から今も “experimental”)だし、Git が必須だし、他にも色々落とし穴がある。Determinate Nix がかなり解決してくれるけど、一部(nixd など)はクローズドソース。Flake には穴が多いけど、Channels よりは便利。それに今は AI に設定を任せられるから、移行も大して複雑じゃなかった


まずは flake.nix

{
description = "Kokosa's Nix Flake";
inputs = {
# Nixpkgs & NUR
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nur.url = "github:nix-community/NUR";
# Flake-parts
flake-parts.url = "github:hercules-ci/flake-parts";
# Home Manager
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
# Other
hid-bpf-uclogic.url = "github:dramforever/hid-bpf-uclogic";
};
outputs = inputs @ {
nixpkgs,
flake-parts,
...
}:
flake-parts.lib.mkFlake {inherit inputs;} {
systems = ["x86_64-linux"];
perSystem = {pkgs, ...}: {
formatter = pkgs.alejandra;
};
flake = {
nixosConfigurations.kokosa = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
inherit inputs;
};
modules = [
./nixos/hosts/kokosa/default.nix
];
};
};
};
}

インポートしている唯一のファイル default.nix は、元々このマシンの configuration.nix だったもの。今は見る影もなく変わってしまって、元は巨大な一枚岩だったのが、複数の小さなファイルにスライスされて import で束ねられている。それ以外では、このファイルには home-manager の設定しか入っていない

imports = [
inputs.home-manager.nixosModules.home-manager
../../modules/nix-settings.nix
../../modules/networking.nix
../../modules/security.nix
../../modules/packages.nix
../../modules/services.nix
../../modules/desktop.nix
../../modules/locale.nix
../../modules/users.nix
../../modules/boot.nix
./hardware.nix
];

それ以外は元の設定とほぼ変わらない。まだ GitHub には公開していないけど、時間ができたらやるつもり。最後にスクリーンショットを一枚:

ご機嫌
ご機嫌