NixOSにFlakeを導入した

前回の記事にて、VirtualBox環境におけるNixOSの導入から初期設定(SSHログイン、ホスト名の設定、IPアドレスの割り当て)まで実施した。
この段階で、他のLinuxディストリビューションでも実施してきたSambaによるファイルサーバの構築やSFTPサーバの構築が可能な状態となった。しかし、せっかくNixOSを導入したのだからFlakesやhome-managerも使ってみたいという事で、今回は開発環境を管理する為のツールFlakeを導入してみた。
2025/4/6追記 NixOSネタの記事の一覧は、当記事内最下部の「NixOS関連の記事」欄内を参照。
 


Flakeとは
Nix言語の依存関係を管理する為のツールである。
Flakeを使う事で、プロジェクトの簡潔な定義や依存関係の明確化やバージョン管理などが可能になる。
SambaやSFTP等といったサーバ用途でNixOSを利用するとFlakeの恩恵は希薄になると思われるが、せっかくNixOSを導入したのだから、Flakeを導入し軽く触れてみようと思う。
 
Flakeに関しては以下のサイトが詳しい。
以下の画像ではVirtualBoxで半分隠れているが、Introductionのトップページに表示されている絵は所沢と言うより貞任高原(岩手県)の雰囲気である。
https://nixos-and-flakes.thiscute.world/ NixOS & Flakes Book


 


当方の環境
ホスト機:macOS 15.3.2 / MacBook Pro 2020 / RAM: 16GB / CPU: Intel Core i5 2.0GHz
仮想化環境:Oracle VirtualBox 7.1.4 r165100
ゲストOS:NixOS 24.11 (Vicuna)

NixOSはVirtualBoxの仮想マシンとして既に作成済みである。
VirtualBoxへの導入手順は前回の記事を参照。



NixOSにFlakeを導入する

当項目では、VirtualBoxにて動作しているNixOSにFlakeをインストールする。
対象のNixOSの情報は以下のとおり。

[user@testsv99:~]$ uname -a
Linux testsv99 6.6.82 #1-NixOS SMP PREEMPT_DYNAMIC Sun Mar  9 08:55:04 UTC 2025 x86_64 GNU/Linux

[user@testsv99:~]$ cat /etc/os-release 
ANSI_COLOR="1;34"
BUG_REPORT_URL="https://github.com/NixOS/nixpkgs/issues"
BUILD_ID="24.11.715519.ebe2788eafd5"
CPE_NAME="cpe:/o:nixos:nixos:24.11"
DEFAULT_HOSTNAME=nixos
DOCUMENTATION_URL="https://nixos.org/learn.html"
HOME_URL="https://nixos.org/"
ID=nixos
ID_LIKE=""
IMAGE_ID=""
IMAGE_VERSION=""
LOGO="nix-snowflake"
NAME=NixOS
PRETTY_NAME="NixOS 24.11 (Vicuna)"
SUPPORT_END="2025-06-30"
SUPPORT_URL="https://nixos.org/community.html"
VARIANT=""
VARIANT_ID=""
VENDOR_NAME=NixOS
VENDOR_URL="https://nixos.org/"
VERSION="24.11 (Vicuna)"
VERSION_CODENAME=vicuna
VERSION_ID="24.11"
[user@testsv99:~]$ 

 

1. Nixの動作確認
Nixが使える事を確認する。
NixOSでは別途インストールする事無くNixの使用が可能である。
nixコマンドをversionオプションを付けて実行すると、Nixのバージョンを確認する事が出来る。

[user@testsv99:~]$ nix --version
nix (Nix) 2.24.12

[user@testsv99:~]$ 

 
2. Flake使用の宣言
前回の記事でも編集したconfiguration.nixファイルにnix.settings.experimental-features = [ "flakes" ];を追記し、Flakeの使用を宣言する。

[user@testsv99:~]$ sudo vi /etc/nixos/configuration.nix
[sudo] password for user: 
:
省略
:
  nix.settings.experimental-features = [ "flakes" ];  ◻️◻️この行を追記
  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;
  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
  #  vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
    wget
    vim
    git
    wget
    curl
  ];
:
省略
:
[user@testsv99:~]$ 

 
上記の設定を反映させる為、nixos-rebuildコマンドでNixOS環境をリビルドする。

[user@testsv99:~]$ sudo nixos-rebuild switch
building Nix...
building the system configuration...
these 6 derivations will be built:
  /nix/store/lwwpjn6v41kf4qxv9shqr97abp7sjmsq-nix.conf.drv
  /nix/store/hikwfshnd3ch9zvrf6a7nmf5zfdlv7mc-X-Restart-Triggers-nix-daemon.drv
  /nix/store/y9y2z729rg4al36cv6zqfy0lywnksn51-unit-nix-daemon.service.drv
  /nix/store/85kbybh147nqnzpr5b2v02653xa30abw-system-units.drv
  /nix/store/npjqrsab5g1y3nrb14pbdi22gq3b9w2k-etc.drv
  /nix/store/xca66ipag4zr11bm3ymy39573sq39y3g-nixos-system-testsv99-24.11.715519.ebe2788eafd5.drv
building '/nix/store/lwwpjn6v41kf4qxv9shqr97abp7sjmsq-nix.conf.drv'...
Validating generated nix.conf
building '/nix/store/hikwfshnd3ch9zvrf6a7nmf5zfdlv7mc-X-Restart-Triggers-nix-daemon.drv'...
building '/nix/store/y9y2z729rg4al36cv6zqfy0lywnksn51-unit-nix-daemon.service.drv'...
building '/nix/store/85kbybh147nqnzpr5b2v02653xa30abw-system-units.drv'...
building '/nix/store/npjqrsab5g1y3nrb14pbdi22gq3b9w2k-etc.drv'...
building '/nix/store/xca66ipag4zr11bm3ymy39573sq39y3g-nixos-system-testsv99-24.11.715519.ebe2788eafd5.drv'...
activating the configuration...
setting up /etc...
reloading user units for user...
restarting sysinit-reactivation.target
the following new units were started: run-credentials-systemd\x2dtmpfiles\x2dresetup.service.mount, sysinit-reactivation.target, systemd-tmpfiles-resetup.service

[user@testsv99:~]$ 

 
3. nix.confファイルの作成
カレントディレクトリ内に.configディレクトリおよびその配下にnixディレクトリを作成し、Flakeが使用出来るようnix.confファイルを作成する。
自分の環境では、以下のファイルの作成および編集が無い状態ではFlakeを正常に動作させる事が出来なかった。

[user@testsv99:~]$ mkdir -p ~/.config/nix

[user@testsv99:~]$ echo "experimental-features = nix-command flakes" > ~/.config/nix/nix.conf 

 
4. 開発環境用のディレクトリの作成
自アカウントのホームディレクトリは以下の状態。現段階ではプロジェクトで使用する開発環境用のディレクトリは存在しない。
これより、プロジェクトで使用する開発環境で使用するディレクトリを作成する。

[user@testsv99:~]$ ls -la
total 20
drwx------ 4 user users 4096  3月 16 15:25 .
drwxr-xr-x 3 root    root  4096  3月 16 15:03 ..
-rw------- 1 user users  390  3月 16 15:24 .bash_history
drwxr-xr-x 3 user users 4096  3月 16 15:25 .config

[user@testsv99:~]$ 

 
今回は、自アカウントのホームディレクトリ内に開発環境用のディレクトリnix-testを使用する。
mkdirコマンドで開発環境用のディレクトリnix-testを作成し、nix-testディレクトリ内に移動。

[user@testsv99:~]$ mkdir -p nix-test

[user@testsv99:~]$ cd nix-test

 
5. flake.nixファイルの生成
nix flake initコマンドを実行し、プロジェクトを初期化する。
プロジェクトの初期化によりflake.nixファイルが生成される。

[user@testsv99:~/nix-test]$ nix flake init
wrote: /home/user/nix-test/flake.nix

[user@testsv99:~/nix-test]$ ls
flake.nix  shells

[user@testsv99:~/nix-test]$

 
6. プロジェクトで使用するツールの定義
当機にログインするのは自分のみではあるが、shell.nixファイルを作成し、プロジェクト内共通の開発環境で使用するツールを定義する。
今回は、プロジェクト内共通の開発環境で使用するツールとしてPythonとgitとDockerを指定。
Pythonのパッケージ名はPythonのバージョンによって異なる。パッケージ名は以下のリンク先でpythonで検索すると確認出来る。
https://search.nixos.org/packages

[user@testsv99:~/nix-test]$ vi shells/shell.nix

{ packages ? import <nixpkgs> {} }:

packages.mkShell {
  buildInputs = with packages; [
    python314
    git
    docker
  ];

  pure = true;

  shellHook = ''
    echo "Welcome to test development environment"
    echo "Python version 3.14.0"
  '';
}

[user@testsv99:~/nix-test]$ 

 
7. 開発環境とFlakeの統合
上記にて作成したプロジェクト内共通の開発環境をFlakeに統合させる。
flake.nixファイルを作成し、Nixで依存関係を管理する為のファイルを作成する。
導入したいパッケージはnixpkgツールを介して公式のリポジトリからインストールされる。
プロジェクト内共通の開発環境はdefaultとして定義されている。
現段階では使用しないが、もう一つの開発環境としてnodeも定義されている。

[user@testsv99:~/nix-test]$ vi flake.nix
{
  description = "test environment";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }: 
    flake-utils.lib.eachDefaultSystem (system:
      let
        packages = nixpkgs.legacyPackages.${system};
      in
      {
        devShells = {
          default = import ./shells/shell.nix { inherit packages; };
        # node = import ./environments/node/shell.nix { inherit packages; };
        };
      }
    );
}

[user@testsv99:~/nix-test]$ 

 
8. 依存関係およびバージョンの固定
Flakeの依存関係およびバージョンを固定する為、nix flake updateコマンドを実行する。
nix flake updateコマンドの実行によりflake.lockというロックファイルが生成され、依存関係およびバージョンが固定される。

[user@testsv99:~/nix-test]$ nix flake update
warning: creating lock file '/home/user/nix-test/flake.lock': 
• Added input 'flake-utils':
    'github:numtide/flake-utils/11707dc2f618dd54ca8739b309ec4fc024de578b?narHash=sha256-l0KFg5HjrsfsO/JpG%2Br7fRrqm12kzFHyUHqHCVpMMbI%3D' (2024-11-13)
• Added input 'flake-utils/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e?narHash=sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768%3D' (2023-04-09)
• Added input 'nixpkgs':
    'github:nixos/nixpkgs/6607cf789e541e7873d40d3a8f7815ea92204f32?narHash=sha256-cPfs8qMccim2RBgtKGF%2Bx9IBCduRvd/N5F4nYpU0TVE%3D' (2025-03-13)

[user@testsv99:~/nix-test]$ 


9. 作成した開発環境の使用準備
flake.nixファイルがあるディレクトリ内で以下のnix developコマンドを実行すると、上記で作成した開発環境の利用が可能になる。
nix developが正常に終了すると、上記のshell.nixファイルにて記載したechoの内容が出力される。

[user@testsv99:~/nix-test]$ nix develop
[0/5 built, 5/189/201 copied (814.1/1461.8 MiB), 175.5/344.5 MiB DL] fetching systemd-257.3 from https://cache.nixos.org
:
省略
:
Welcome to test development environment
Python version 3.14.0

[user@testsv99:~/nix-test]$ 

 
10. 開発環境下でPythonの動作確認
nix developコマンドを実行した後、shell.nixで指定したパッケージ(今回はPython 3.14)が使用可能か確認。
python -Vを叩いたらバージョンが返ってきた。Pythonが使用可能である事が分かる。
Pythonで何かツールを作成する際は、この環境の中にて実施する事となる。

[user@testsv99:~/nix-test]$ python -V
Python 3.14.0a5

[user@testsv99:~/nix-test]$ 

 
上記で作成した開発環境の利用をやめる際は、exitコマンドを実行する。
プロンプトの出力内容が変わらない為に開発環境から抜けた事が分かりづらいが、開発環境から正常に抜ける事が出来た事が分かる。
開発環境から抜けた状態で再度python -Vを叩くと、python: command not foundが返ってくる。

[user@testsv99:~/nix-test]$ exit
exit

[user@testsv99:~/nix-test]$ python -V
python: command not found

[user@testsv99:~/nix-test]$ 


今回はここまで。
NixOS上で開発環境を1つ作成し、その中でPythonが動作するところまで確認出来た。
この段階でNixOSの仮想マシンのvdiファイルのサイズを確認したら、SONiCやRHELよりも大きい6.9GBもあった。
NixOSを運用するにあたり、頻度はやや多めで定期的にファイルの掃除が必要なようだ。
 


振り返り
NixOSのインストール完了後からFlakeが正常に動作するようになるまでの間は苦戦の連続で、今回も3日間程時間を要した。しかし、こんなもの二度と使わねぇという負の感情までには至らなかった。
まだNixOSの沼にまだ片足を浅く突っ込んだ状態だが、NixOSでやってみたい事がいくつか有るので、もう少しの間片足を突っ込んだままでいようと思う。
Nixの本家サイトよりもNixOS & Flakes BookやZennやQiitaの記事の方が参考になった。UbuntuやArch Linuxと比較すると情報が少ないと聞いていたが、思っていた以上に情報は揃っていたように見受けられた。国内外の先達の皆様に感謝申し上げます。
 

 
参照サイト
https://nixos.org/ Nix & NixOS Declarative builds and deployments
https://nixos.org/manual/nixos/stable/ NixOS Manual
https://nixos-and-flakes.thiscute.world/ NixOS & Flakes Book
https://zenn.dev/stmn_inc/articles/create-environment-to-nix-flake Nix Flakeで作る開発環境管理
https://zenn.dev/asa1984/books/nix-introduction/viewer/11-flakes Nix入門 - 11 Flakes
https://zenn.dev/asa1984/articles/nixos-is-the-best NixOSで最強のLinuxデスクトップを作ろう
https://search.nixos.org/packages NixOS Search Packages



NixOS関連の記事
https://debslink.hatenadiary.jp/entry/20250311/1741649715 NixOSの沼に片足を突っ込んだ
https://debslink.hatenadiary.jp/entry/20250316/1742128054 NixOSにFlakeを導入した
https://debslink.hatenadiary.jp/entry/20250320/1742459549 NixOSの環境構築
https://debslink.hatenadiary.jp/entry/20250323/1742731080 NixOSでSFTPサーバの設定
https://debslink.hatenadiary.jp/entry/20250328/1743167901 NixOSでSambaによるファイルサーバの構築
https://debslink.hatenadiary.jp/entry/20250405/1743844940 NixOSでrsyslogの設定
https://debslink.hatenadiary.jp/entry/20250411/1744300480 NixOSでDNSサーバの構築
https://debslink.hatenadiary.jp/entry/20250413/1744551596 NixOSのシステムの再現性の検証
https://debslink.hatenadiary.jp/entry/20250418/1744924524 NixOSでPostfixとDovecotによるメールサーバの構築
https://debslink.hatenadiary.jp/entry/20250419/1745062553 NixOSでPostfixとDovecotによるメールサーバの構築 - SASL認証編
https://debslink.hatenadiary.jp/entry/20250421/1745236668 NixOSのパッケージやOSのアップデートに関するメモ
https://debslink.hatenadiary.jp/entry/20250428/1745795434 NixOSをCLIでインストールした
https://debslink.hatenadiary.jp/entry/20250503/1746235454 NixOSでnginxによるWebサーバの構築
https://debslink.hatenadiary.jp/entry/20250508/1746706416 NixOSでPrometheusとGrafanaによる監視基盤の構築
https://debslink.hatenadiary.jp/entry/20250510/1746884897 NixOSの導入にあたり参考になったサイト
https://debslink.hatenadiary.jp/entry/20250524/1748072722 NixOSを24.11から25.05にアップデートした
https://debslink.hatenadiary.jp/entry/20251214/1765688458 NixOSを25.05から25.11にアップデートした
https://debslink.hatenadiary.jp/entry/20260117/1768615582 Raspberry Pi 4BにNixOSを導入しファイルサーバを構築した
https://debslink.hatenadiary.jp/entry/20260503/1777775392 NixOSで構築したサーバの運用について