NixOSの環境構築

前回の記事では、NixOS上でのプロジェクトの簡潔な定義、依存関係の明確化、バージョン管理を目的としてFlakeを導入した。
本記事の投稿時点ではFlakeの活用には至っていないが理解を深めたいと考えている。その為、今後導入予定のツールのインストールや設定が一通り完了した段階で、改めてFlakeに取り組む予定だ。
本記事の執筆時点では、シェルやエディタやNTP等のツールのインストールや設定が未着手だった為、今回はそれらのツールのインストールと設定を行った。
2025/4/6追記 NixOSネタの記事の一覧は、当記事内最下部の「NixOS関連の記事」欄内を参照。
 


当記事の対象のツール
今回は以下をインストールし環境設定を実施した。設定ファイル(.nixファイル)に書き込む設定オプションの豊富さから、シェルはzsh、エディタはNeovimに乗り換えた。
zsh:bashから乗り換え
Neovim:Vimから乗り換え
chrony:新規インストール
Neofetch:新規インストール



当方の環境
ホスト機: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の設定ファイルの保存場所
configuration.nixファイルやssh.nix等、拡張子がnixなファイルが設定ファイルである。
導入したツールの設定ファイルは、大まかに言うと以下の4つである。
UbuntuやCentOSなどのようなメジャーなLinuxディストリビューションのようにホームディレクトリ内にドットファイルを置いても設定内容を読み込んでくれるが、そのやり方はNixOSにおいては一般的ではないようである。
 
/etc/nixos/configuration.nixファイル
システム全体の設定は、/etc/nixos/configuration.nixファイルを編集する。
上記のツールを含め、NixOSで動作するツールの多くがconfiguragtion.nixファイルにてオプションの設定が可能である。しかしツールの挙動に関する設定は、自分はツール毎にファイルを作成する方が好みである。
 
/etc/nixosディレクトリ内のファイル
ツール毎に設定ファイルを作成する事も出来る。上記と同じくシステム全体に適用される。
/etc/nixos/ssh.nixや/etc/nixos/zsh.nixや/etc/nixos/chrony.nixなど、/etc/nixosディレクトリ内にファイルを置いて編集する。UbuntuやCentOSなどで言う、/etcディレクトリ配下のファイルのような感じである。
NixOSのインストール直後の段階では/etc/nixosディレクトリ内は空っぽな状態につき、管理者にてファイルを作成する必要が有る。
 
プロジェクトのディレクトリ内にあるファイル
前回の記事(https://debslink.hatenadiary.jp/entry/20250316/1742128054 NixOSにFlakeを導入した)にて作成したプロジェクトのディレクトリ~/nix-testが該当する。
当方の環境ではFlakeは導入済みではあるが、当記事の投稿の段階ではFlakeでの管理にはまだ至っていない。
 
各ユーザのホームディレクトリ内にあるファイル
~/.config/nixpkgs/config.nix等のファイルをユーザ毎に作成して設定を書く事が可能。
システム全体ではなく、ユーザ毎に適用される。
 


ツールのインストールと設定

1. zshの導入
NixOSに触れ始める少し前にやった家の中の大掃除にて以下の本が見つかった事をきっかけに、zshの勉強を兼ねてインストールした。
https://www.amazon.co.jp/dp/4774138649/ zshの本
/etc/nixos/configuration.nixファイル内の導入するパッケージを記載する箇所にて、以下のようにzshを追記しインストールの設定。

  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
    curl
    zsh   ◻️◻️この行を追記
  ];
:
省略
:

 
続いて、上記と同じ/etc/nixos/configuration.nixファイル内にて、この後作成する/etc/nixos/zsh.nixを読み込ませる設定を追記する。

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      ./ssh.nix
      ./zsh.nix   ◻️◻️この行を追記
    ];
:
省略
:

 
続いて/etc/nixos/zsh.nixファイルを作成し以下を記載する。
記載した設定内容の意味は以下のとおり。
programs.zsh.enable:zsh実行の有効化
programs.zsh.enableCompletion:サブコマンドの自動補完機能
programs.zsh.autosuggestions:コマンド実行履歴に基付くコマンド候補の補完機能
programs.zsh.syntaxHighlighting:コマンドラインにシンタックスハイライト機能
programs.zsh.shellAliases:zshのエイリアス設定
programs.zsh.histSize:コマンド履歴の上限数
programs.zsh.histFile:コマンド履歴の保存先
programs.zsh.promptInit:zshのプロンプトを設定

{
  programs = {
    zsh = {
      enable = true;
      enableCompletion = true;
      autosuggestions.enable = true;
      syntaxHighlighting.enable = true;
      shellAliases = {
        ls = "ls -la";
        df = "df -h";
        free = "free -m";
      };
      histSize = 2000;
      histFile = "$HOME/.zsh_history";
      promptInit = ''
        PROMPT="[%m:%~ %']# "
      '';
    };
  };
}

 
zshのオプションの設定後、/etc/nixos/configuration.nixファイルの下の方にzshを有効にする設定を追記する。

  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

   users.defaultUserShell=pkgs.zsh;   ◻️◻️この行を追記

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;
:
省略
:

 
設定を終えたら、上記の設定内容を反映させる為にnixos-rebuildコマンドを叩いてリビルドする。

[user@nixos:~]$ sudo nixos-rebuild switch
building Mix...
building the system configuration...
:
省略
:
[user@nixos:~]$ 

 
リビルド時にシェルがbashからzshに切り替わった為、プロンプトの出力内容も変わった。
プロンプトの出力内容に変化が無い場合はNixOSから一旦ログアウトし、ログイン。
versionオプションを付けてzshの動作確認。

[testsv99:~ ]# zsh --version
zsh 5.9 (x86_64-pc-linux-gnu)
[testsv99:~ ]# 


尚、上記では/etc/nixos/configuration.nixファイルと/etc/nixos/zsh.nixの2つのファイルに分けてzshの導入設定およびzshの環境設定を行ったが、/etc/nixos/configuration.nixファイルにまとめて設定を行う事も出来る。
その場合、以下を/etc/nixos/configuration.nixファイルに追記し、nixos-rebuildコマンドでリビルド、zshの動作確認という流れになる。

{
  programs.zsh.enable = true;
  programs.zsh.enableCompletion = true;
  programs.zsh.autosuggestions.enable = false;
  programs.zsh.enableLsColors = false;
  programs.zsh.syntaxHighlighting.enable = true;
  programs.zsh.shellAliases = {
    ls = "ls -la";
    df = "df -h";
    free = "free -m";
    };
  programs.zsh.histSize = 2000;
  programs.zsh.histFile = "$HOME/.zsh_history";
  programs.zsh.promptInit = ''
    PROMPT="[%m:%~ %']# "
  '';
}


2. Neovimの導入
20年近くも間vimを使い続けてきたが、以下のサイトにて.nixファイルで設定可能なオプションを検索したらvimのオプションが非常に少なかった為、neovimに乗り換えた。
https://search.nixos.org/options? NixOS Search - Options

使用するエディタを変更する際は、/etc/nixos/configuration.nixファイルにて以下を修正し、sudo nixos-rebuild switch を叩いてneovimを読み込ませる。
viやvimコマンドではなくnvimコマンドでファイルの編集が可能になった事を確認してから、neovimの設定に進む。

  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
    neovim    ◻️◻️vimからneovimに修正
    git
    curl
    zsh
  ];
:
省略
:

 
続いて、上記と同じ/etc/nixos/configuration.nixファイル内にて、この後作成する/etc/nixos/nvim.nixを読み込ませる設定を追記する。

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      ./ssh.nix
      ./zsh.nix
      ./nvim.nix   ◻️◻️この行を追記
    ];
:
省略
:

 
続いて、/etc/nixos/nvim.nixファイルを作成し以下を記載する。
記載した設定内容の意味は以下のとおり。
programs.neovim.enable:Neovim実行の有効化
programs.neovim.defaultEditor:Neovimをデフォルトのエディタとして使用する
programs.neovim.vimAlias :vimを叩くとNeovimが立ち上がる
programs.neovim.configure.ignorecase:大文字小文字の区別をしない
programs.neovim.configure.wrapscan:最後尾まで検索したら次の検索で先頭に戻る
programs.neovim.configure.showmode:Neovimのモードを表示する
programs.neovim.configure.showmatch:括弧の入力時に、対の括弧を表示する

{
  programs = {
    neovim = {
      enable = true;
      defaultEditor = true;
      vimAlias = true;
      configure.ignorecase = true;
      configure.wrapscan = true;
      configure.showmode = true;
      configure.showmatch = true;
    };
  };
}

 
上記の設定を終えたら、設定内容を反映させる為にnixos-rebuildコマンドを叩いてリビルドする。

[testsv99:~ ]# sudo nixos-rebuild switch
building Mix...
building the system configuration...
:
省略
:
[testsv99:~]# 

 
リビルドの完了後にNeovimの動作確認。versionオプションを付けて実行し、バージョンを出力。
neovimの実行コマンドはnvimである。
併せて、vimが使えなくなった事も確認。

[testsv99:~ ]# nvim --version
NVIM v0.10.2
Build type: Release
LuaJIT 2.1.1713773202
Run "nvim -V1 -v" for more info
[testsv99:~ ]#
[testsv99:~ ]# vim --version
vim: command not found
[testsv99:~ ]# 

 

尚、上記では/etc/nixos/configuration.nixファイルと/etc/nixos/nvim.nixの2つのファイルに分けてNeovimの導入設定および環境設定を行ったが、zshと同様に/etc/nixos/configuration.nixファイルにまとめて環境設定も出来る。
以下を/etc/nixos/configuration.nixファイルに追記し、nixos-rebuildコマンドでリビルド、Neovimの動作確認という流れになる。

{ 
  programs.neovim.enable = true;
  programs.neovim.defaultEditor = true;
  programs.neovim.vimAlias = true;
  programs.neovim.configure.ignorecase = true;
  programs.neovim.configure.wrapscan = true;
  programs.neovim.configure.showmode = true;
  programs.neovim.configure.showmatch = true;
}

 

3. 時刻同期の設定(chronydの導入)
UbuntuやRHEL等で運用するファイルサーバ(Sambaサーバ)がchronyでNTPサーバと時刻同期しているように、
NixOSでもchronyでNTPサーバと時刻同期させてみようという事で、chronyを導入した。

/etc/nixos/configuration.nixファイル内の導入するパッケージを記載する箇所にて、以下のようにchronyを追記しインストールの設定。

  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
    neovim
    git
    curl
    zsh
    chrony  ◻️◻️この行を追記
  ];
:
省略
:

 
続いて、上記と同じ/etc/nixos/configuration.nixファイル内にて、この後作成する/etc/nixos/chrony.nixを読み込ませる設定を追記する。

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      ./ssh.nix
      ./zsh.nix
      ./chrony.nix ◻️◻️この行を追記
    ];
:
省略
:

 
続いて、/etc/nixos/chrony.nixファイルを作成し以下を記載する。
記載した設定内容の意味は以下のとおり。
services.chrony.enable:chronyの有効化
services.chrony.servers:時刻同期先のNTPサーバ
services.chrony.serverOption:初回の時刻同期に要する時間を短縮する
services.chrony.enableRTCTrimming:システムクロックに対するオフセットの追跡と自動調整を有効化
services.chrony.autotrimThreshold:指定した秒を超えて時刻がずれたら、時刻調整を実行
services.chrony.initstepslew.enabled:時刻のずれをゆるやかに修正

{
  services = {
    chrony = {
      enable = true;
      servers = [ "ntp.jst.mfeed.ad.jp" ];
      serverOption = "iburst";
      enableRTCTrimming = true;
      autotrimThreshold = 20;
      initstepslew.enabled = true;
    };
  };
}

 
設定を終えたら、設定内容を反映させる為にnixos-rebuildコマンドを叩いてリビルドする。

[testsv99:~ ]# sudo nixos-rebuild switch
building Mix...
building the system configuration...
:
省略
:
[testsv99:~ ]#

 
リビルドの完了後、chronyc sourcesコマンドを叩いてchronyの動作確認。
chronydがNTPサーバと時刻同期している事がわかる。

[testsv99:~ ]# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* ntp3.jst.mfeed.ad.jp          2   6    17    37   -258us[-2012us] +/-   47ms

[testsv99:~ ]# 

 

尚、上記では/etc/nixos/configuration.nixファイルと/etc/nixos/chrony.nixの2つのファイルに分けてchronyの導入設定および環境設定を行ったが、
上記のzshやnvimと同様に、/etc/nixos/configuration.nixファイルにまとめて設定を行う事も出来る。
以下を/etc/nixos/configuration.nixファイルに追記し、nixos-rebuildコマンドでリビルド、chronyの動作確認という流れになる。

{
  services.chrony.enable = true;
  services.chrony.servers = [ "ntp.jst.mfeed.ad.jp" ];
  services.chrony.serverOption = "iburst";
  services.chrony.enableRTCTrimming = true;
  services.chrony.autotrimThreshold = 20;
  services.chrony.initstepslew.enabled = true;
}

 

4. Neofetchの導入
Neofetchとは、Linuxのみならず*BSDやMacOS等のシステム情報をCUIにて出力するスクリプトである。
Neofetchを実行したシステムのOSやカーネルや稼働時間やリソース情報などを出力し、テキストベースでわかりやすく表示される事が特徴である。
家で稼働しているOpenBSDやDebian GNU/Linuxと同様に、NixOSにもインストールした。

/etc/nixos/configuration.nixファイル内の導入するパッケージを記載する箇所にて、以下のようにneofetchを追記しインストールの設定。

  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
    neovim
    git
    curl
    zsh
    chrony
    neofetch  ◻️◻️この行を追記
  ];

 
設定を終えたら、設定内容を反映させる為にnixos-rebuildコマンドを叩いてリビルドする。

[testsv99:~ ]# sudo nixos-rebuild switch
building Mix...
building the system configuration...
:
省略
:
[testsv99:~ ]#

 
リビルドの完了後、neofetchコマンドを実行しneofetchの設定ファイルを生成させる。
/etc/nixos/neofetch.nixファイルを作成しようと思っていたのだが、以下のサイトにてneofetchのオプションを検索したもののヒット無し。
よってホームディレクトリ内に生成される~/.config/neofetch/.configファイルにて設定した。
https://search.nixos.org/options?

~/.config/neofetch/.configファイルを編集後、neofetchコマンドを叩いて動作確認を実施。
 

 

5. ガベージコレクションの自動実行の設定
週に1度ガベージコレクションを実行し、不要なストアオブジェクト(どのProfileのどの世代にもリンクされていないNix Store内のパッケージ)を自動的に判別し削除。
パッケージのインストールや削除を頻繁にやっているのであれば、有効にしたい機能。

:
省略
:
  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;
  nix.settings.experimental-features = [ "flakes" ];

  nix.gc = {    ◻️◻️この行を含め下5行を追記
    automatic = true;
    dates = "weekly";
    options = "--delete-order-than 7d";
  };
:
省略
:

 

6. Firewallの設定は?
UbuntuやCentOS等で使われているfirewalldやOpenBSDで使われているPFに相当する、Firewallの機能について。
NixOSにはデフォルトで完全に設定されたfirewallが実装されている。
カスタマイズしたポート番号でポートを開けたい場合を除いて、NixOSのFirewallを手動で設定する必要は無い。NixOSにて何らかのサーバを動作させていると、通信が発生した際にそのサーバに関連するモジュールがポートを開くため。
勿論、別のFirewallのパッケージを導入する事は可能である。
 

7. 導入したツールの実行ファイルのパスは?
whichコマンドを叩いてパスを確認しようとすると、UbuntuやCentOS等の環境では目にしないパスが返ってくる。
whichコマンドやwhereコマンドを叩いて出力されるパスはプロファイルへのシンボリックリンクである。
実体は/nix/storeディレクトリ配下に保存される。
設定を反映させると新しいプロファイルが作成され、現環境のプロファイルとして更新される...という流れとなる。

以下の例では、whichコマンドを叩いた結果、nvimのプロファイルへのシンボリックリンクが出力され、realpathコマンドでシンボリックリンクを検索すると、現環境のnvimのパスが出力される。

[testsv99:~ ]# which nvim
/run/current-system/sw/bin/nvim
[testsv99:~ ]# 
[testsv99:~ ]# realpath /run/current-system/sw/bin/nvim
/nix/store/zz56rxxgp9zn58c0y6mykb4gj7iminiw-neovim-0.10.2/bin/nvim
[testsv99:~ ]#

 

8. パッケージのアップデート
パッケージ名を指定して実行すると、対象のパッケージを更新する。
パッケージ名無しで実行すると環境そのものを更新する。apt updateやyum updateのような感じ。

[testsv99:~ ]# nix-env -u 
evaluation warning: _1password has been renamed to _1password-cli to better follow upstream name usage
evaluation warning: The package set `androidndkPkgs_23b` has been renamed to `androidndkPkgs_23`.
evaluation warning: Use 'brasero-unwrapped' instead of 'brasero-original'
evaluation warning: cinnamon.bulky was moved to top-level. Please use pkgs.bulky directly.
:
省略
:
[testsv99:~ ]# 

 

今回はここまで。
ZshとNeovimとChronyとNeofetchをNixOSにインストールし、Zsh、Neovim、Chronyについては、ドットファイルや/etcディレクトリ配下の設定ファイルと同様の設定を.nixファイルに記述し、簡単な動作確認まで実施した。
Neofetchに関しては、UbuntuやCentOSと同様に、実行ユーザーのホームディレクトリ内に生成される.config/neofetch/configファイルを編集し、neofetchコマンドを実行して動作確認を行った。
この段階で、NixOSの挙動について気になる点が発生した。VirtualBox上で動作しているNixOSのVDIファイルのサイズが、NixOSのインストール直後と比べて約2倍に膨れ上がっている事に気付いた。
 


振り返り
まだNixOSには片足を突っ込んだ程度で、初期設定やツールの導入を進めている段階に過ぎず深い部分には触れていない。その為、現時点ではNixOSに挫折するまでには至っていない。その理由として以下の点が考えられる。

① 想定以上に情報が充実している。公式・非公式のドキュメントに加え、ZennやQiitaや個人ブログなどに先人たちの知見が蓄積されている。勿論、CentOSやUbuntuといったメジャーなLinuxディストリビューションと比べると情報は少ないが、それでも十分に参考になる資料がある。
② 今年に入ってから、普段利用しているWebブラウザのFirefoxに自動翻訳機能が追加された為、本家サイトやNixOS & Flakes Bookなどが以前よりも読みやすくなった。
③ 家庭で利用しているOpenBSDやDebian GNU/Linux、業務で利用しているOracle Linuxなどと比較せず、NixOSをまったく別のものとして捉えている。
④ 多くのNixOSユーザとは目指しているゴールが異なる。自分のゴールは、OpenBSDやAlpine Linux、Debian GNU/Linuxで行っていたことをNixOSで再現する事にある。
 
 

参照サイト
https://nixos.org/ Nix & NixOS Declarative builds and deployments
https://nixos.org/manual/nixos/stable/ NixOS Manual
https://search.nixos.org/packages NixOS Search Packages
https://search.nixos.org/options? NixOS Search Options
https://zenn.dev/asa1984/articles/nixos-is-the-best NixOSで最強のLinuxデスクトップを作ろう
 

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で構築したサーバの運用について