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.nixHome Manager で管理しているソフトウェアのうち、実際使ってるのは fzf だけ。残り 2 つは使う予定で先に設定を書いただけで、設定では無効にしてある
なぜ Channels から Flakes に移行したのか
Section titled “なぜ Channels から Flakes に移行したのか”configuration.nix に比べると、Flake は多くの問題を解決してくれる。全パッケージと依存関係のバージョンをロックでき、ひとつの設定ファイルでバージョン番号とコミットレベルまでシステム全体を再現できる。一方、configuration ではそれが難しく、Channel の更新に追従してしまう
| 特性 | Channels | Flakes |
|---|---|---|
| 依存 | 暗黙的 (channels) | 明示的 (inputs) |
| 再構築 | sudo nixos-rebuild switch | nh os switch . |
| 再現性 | 各自の channel バージョンに依存 | flake.lock で一貫性を保証 |
| 開発 | nix-shell | nix 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 に設定を任せられるから、移行も大して複雑じゃなかった
設定ファイルをちょっと紹介
Section titled “設定ファイルをちょっと紹介”まずは 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 には公開していないけど、時間ができたらやるつもり。最後にスクリーンショットを一枚:
