NixOSのシステムの再現性の検証

前回の記事では、DNSサーバを実現させる為のツールであるBINDをNixOSに導入し、クライアント端末にて正引きや逆引きの名前解決の動作確認を行った。
今回は、NixOSの特徴であるシステムの再現性を利用し、新規に作成したNixOSの仮想マシンに.nixファイルを適用させて前回の記事で構築したDNSサーバと同一のものを作成。前回同様にクライアント端末にて名前解決の動作確認し、挙動が前回と同一である事を確認した。
過去の記事について NixOSネタの記事の一覧は、当記事内最下部の「NixOS関連の記事」欄内を参照。



NixOSのシステムの再現性ついて
同じNixOSのバージョンという環境にて、同じ設定ファイルを使えばいつでもどこでも何台でも同じシステムの再現が可能である事を指す。スナップショットという表現の方がわかりやすいだろう。
あらかじめパッケージをインストールする必要は無く、準備した各nixファイル(インストールするパッケージの指定、各パッケージの設定、サービスの設定、ネットワークの設定、ユーザの設定など)を新たに立てたNixOSに放り込んでnixos-rebuildコマンドで適用させる事で、同一のシステムが構築出来るというものである。
ただし、NixOSのシステムを構築してから月日が経つにつれカーネルやパッケージのバージョンは少しづつ新しくなっていくので、nixos-rebuildを実行した段階での最新版のカーネルやパッケージが適用される。完璧に全く同じシステムという訳でないので、再現性という表現は適切ではないかもしれない。

サーバを自動で立ち上げたい場合や開発チーム内で同一の環境を立ち上げたい場合、NixOSではバージョン管理された環境構成ができるので、いつでも今の状態だけでなく昔の状態も再現出来る。これは、他のLinuxディストリビューションとは異なり、設定は全て.nixファイルにまとめて記載しコマンド1つで同じシステムをいくつも構築出来るという特徴が有るゆえに可能となっている。



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



今回の要件
前回と同じく、NixOSがDNSサーバ、Debian GNU/Linuxがクライアントとする。クライアントは前回で使用したものを今回も使用する。
Debian GNU/LinuxからNixOS(DNSサーバ)に対し正引き・逆引きで名前解決の確認とgoogle.co.jpのNSレコードを確認する。

ざっくりとした要件は以下のとおり。
・BINDの設定のみならずシステムの設定は前回の記事と同一のものを使用する。
・.nixファイルは予め保存してあるものを手動で投入する。
・動作確認も前回の記事と同一の内容を実行する。
  


注意事項
① VirtualBoxの仮想マシンが入っているフォルダをzipなどで固めた物を、別のPCやサーバ等のVirtualBox VMsフォルダ内に展開し.vboxファイルをダブルクリックする事で、即座に仮想マシンを再現する事が出来る。台数が少ない場合は圧倒的にこのやり方の方が早い。VirtualBox環境では、同一の仮想マシンを2台以上このやりかたで再現させる場合、仮想HDD(.vdiや.vmdk等のファイル)のUUIDを手動で変更し、全台UUIDが重複しないようにする。
② 当記事の手順で複数台のNixOSを立ち上げる際は、IPアドレスやホスト名などの重複に注意。
 


NixOSのインストールと初期設定

1. NixOSのインストール
NixOSのインストールは以下の記事の内容を実行した。
https://debslink.hatenadiary.jp/entry/20250311/1741649715 NixOSの沼に片足を突っ込んだ

NixOSのインストールの完了後、NixOSにログインする。

<<< Welcome to NixOS 24.11.715519.ebe2788eafd5 (x86_64) - tty1 >>>

Run 'nixos-help' for the NixOS mannual.

nixos login:

 
2. NixOSにSSHログインする為の設定
設定ファイルの編集および作成の為、nix-shellコマンドでvimが一時的に利用可能な状態にする。
nix-shellによってvimが使用可能な状態になると、プロンプトが[nix-shell:~]$ に変化する。

[user@nixos:~]$ nix-shell -p vim
this path will be fetched (8.47 MiB download, 41.71 MiB unpacked):
  /nix/store/szfi0xd0cwdaldhkp8vlgi7jfv662nmd-stdenv-linux
  /nix/store/1nd5npbp1jfwrwnfygfnxwc8d6a3kxpd-vim-9.1.1046
copying path '/nix/store/szfi0xd0cwdaldhkp8vlgi7jfv662nmd-stdenv-linux' from 'https://cache.nixos.org' ...
copying path '/nix/store/1nd5npbp1jfwrwnfygfnxwc8d6a3kxpd-vim-9.1.1046' from 'https://cache.nixos.org' ...

[nix-shell:~]$

 
インストール直後のNixOSは、IPアドレスがDHCPにより動的にアサインされている。
SSHでNixOSにログインし各.nixファイルをコピー&ペーストで作成したい為、ip add sコマンドを叩いてNixOSにアサインされているIPアドレスを確認する。
以下の例では、インターフェースenp0s3に192.168.3.30がアサインされている事が分かる。

[nix-shell:~]$ ip add s
1:  lo:  <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
     inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
     inet6 ::1/128 scope host noprefixroute
        valid_lft forever preferred_lft forever
2:  enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
     link/ether 08:00:27:d0:ce:a6 brd ff:ff:ff:ff:ff:ff
     inet 192.168.3.30/24 brd 192.168.3.255 scope global dynamic noprefixroute enp0s3
        valid_lft 85850sec preffered_lft 85850sec
:
省略
:
[nix-shell:~]$

 
NixOSにsshログイン出来るようにする為、/etc/nixos/ssh.nixファイルを以下の内容で作成。
※/etc/nixos/configuration.nixファイル内に記載する事も可能。

[nix-shell:~]$ sudo vi /etc/nixos/ssh.nix 
{
  services.openssh.enable = true;
}

 
/etc/nixos/configuration.nixファイルのimportセクションに、上記のssh.nixを追加しssh.nixの内容を読み込ませる設定を投入する。

[nix-shell:~]$ sudo vi /etc/nixos/configuration.nix
:
imports =
  [ # Include the results of the hardware scan.
    ./hardware-configuration.nix
    ./ssh.nix    ◻️◻️この行を追記
  ];
:
省略
:

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

[nix-shell:~]$ sudo nixos-rebuild switch
building Mix...
building the system configuration...
these 19 derivations will be built:
  /nix/store/7xi8dznn5cifanqb8qj9q01pka01fska-system-path.drv
  /nix/store/g3qkrfsmus3n4b9bsp19vsmpagbvfdp9-dbus-1.drv
  /nix/store/wa5vk3q6xp1sixagkfv2bbqcnv4hjh8y-X-Restart-Trigers-dbus.drv
  /nix/store/49rwr25cqflwgwvv7yzc8ip3xzi1hgj3i-unit-dbus-service.drv
:
省略
:
[nix-shell:~]$ 

 
3. NixOSの再起動
リビルドの実行後、NixOSを再起動させる。
再起動の完了後、ターミナルやTera Term等を立ち上げて、SSHで上記で確認したIPアドレスを叩きNixOSにログインする。

[nix-shell:~]$ sudo reboot
:
省略
:

 


NixOSの設定投入

NixOSにログインした後、再度nix-shell -p vimを投入しvimを読み込ませる。
その後、準備した.nixファイルをNixOSに投入しまくる。
まず始めに/etc/nixos/configuration.nixファイルを開き、一旦中身を全て消去した後、あらかじめ準備したconfiguration.nixファイルの中身を全て貼り付ける。
※以下の設定例は行数多めにつき、Webブラウザによって全て表示しきれない事があります。その場合は黒塗りの箇所をスクロールする事で終わりまで表示する事が出来ます。

[user@nixos:~]$ 

[user@nixos:~]$ nix-shell -p vim

[nix-shell:~]$ 

[nix-shell:~]$ sudo vi /etc/nixos/configuration.nix

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      ./ssh.nix
      ./zsh.nix
      ./nvim.nix
      ./chrony.nix
      ./named.nix
    ];

  # Bootloader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  networking.hostName = "testsv99"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.
  networking.interfaces.enp0s3.ipv4.addresses = [{
    address = "192.168.3.247";
    prefixLength = 24;
  }];
  networking.defaultGateway = "192.168.3.1";
  networking.nameservers = [ "192.168.3.247" ];
  networking.hosts = {
    "127.0.0.1" = [ "localhost" "localhost.localdomain" ];
    "192.168.3.247" = [ "testsv99" "testsv99.local" ];
  };

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Enable networking
  networking.networkmanager.enable = true;

  # Set your time zone.
  time.timeZone = "Asia/Tokyo";

  # Select internationalisation properties.
  i18n.defaultLocale = "en_US.UTF-8";

  i18n.extraLocaleSettings = {
    LC_ADDRESS = "en_US.UTF-8";
    LC_IDENTIFICATION = "en_US.UTF-8";
    LC_MEASUREMENT = "en_US.UTF-8";
    LC_MONETARY = "en_US.UTF-8";
    LC_NAME = "en_US.UTF-8";
    LC_NUMERIC = "en_US.UTF-8";
    LC_PAPER = "en_US.UTF-8";
    LC_TELEPHONE = "en_US.UTF-8";
    LC_TIME = "en_US.UTF-8";
  };

  # Configure keymap in X11
  services.xserver.xkb = {
    layout = "us";
    variant = "";
  };

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.user = {
    isNormalUser = true;
    description = "user";
    extraGroups = [ "networkmanager" "wheel" ];
    packages = with pkgs; [];
  };

  # 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
    zsh
    neovim
    chrony
    rsyslog
    bind
  ];

  # 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; 

    nix.gc = {
    automatic = true;
    dates = "weekly";
    options = "--delete-order-than 7d";
  };

  # List services that you want to enable:

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

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;
  networking.firewall.enable = true;
  networking.firewall.allowPing = true;
  networking.firewall.interfaces."enp0s3".allowedTCPPorts = [ 22 53 123 ];
  networking.firewall.interfaces."enp0s3".allowedUDPPorts = [ 53 123 ];

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "24.11"; # Did you read the comment?

}

 
/etc/nixos/nvim.nixファイルを作成し、Neovimの設定を貼り付けて保存する。

[nix-shell:~]$ sudo vi /etc/nixos/nvim.nix
{
  programs.neovim = {
    enable = true;
    defaultEditor = true;
    configure = {
      ignorecase = true;
      wrapscan = true;
      showmode = true;
      showmatch = true;
    };
  };
}

 
/etc/nixos/zsh.nixファイルを作成し、zshの設定を貼り付けて保存する。

[nix-shell:~]$ sudo vi /etc/nixos/zsh.nix
{
  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/hechtia/.zsh_history";
      promptInit = ''
        PROMPT="[%m:%~ %']# "
      '';
    };
  };
}

 
/etc/nixos/chrony.nixファイルを作成し、chronyの設定を貼り付けて保存する。

[nix-shell:~]$ sudo vi /etc/nixos/chrony.nix
{
  services.chrony = {
    enable = true;
    servers = [ "ntp.nict.jp" ];
    serverOption = "iburst";
  };
}

 
最後に、/etc/nixos/named.nixファイルを作成しBINDの設定を貼り付けて保存する。
※以下の設定例は行数多めにつき、Webブラウザによって全て表示しきれない事があります。その場合は黒塗りの箇所をスクロールする事で終わりまで表示する事が出来ます。

[nix-shell:~]$ sudo vi /etc/nixos/named.nix
{ pkgs, ... }:
{
  services.bind.enable = true;
  services.bind.listenOn = [ "any" ];
  services.bind.ipv4Only = true;
  services.bind.forwarders = [ "8.8.8.8" "192.168.3.1" ];
  services.bind.cacheNetworks = [ "any" ];
  services.bind.extraConfig = ''
      acl internal-network {
      192.168.0.0/16;
      172.16.0.0/12;
      10.0.0.0/8;
      localhost;
    };
  '';
  services.bind.extraOptions = ''
      recursion yes;
  '';
  services.bind.zones = {
    "testsv99.local" = {
      allowQuery = [ "internal-network" "any" ];
      master = true;
    };
    "3.168.192.in-addr.arpa" = {
      allowQuery = [ "internal-network" "any" ];
      master = true;
    };
  };
services.bind.zones."testsv99.local".file = pkgs.writeText "testsv99.local" ''
$TTL 86400
@ IN SOA testsv99.local. root.testsv99.local. (
2025041101 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
);
 IN NS testsv99.local.
 IN A 192.168.3.247
testsv99 IN A 192.168.3.247
bind IN A 192.168.3.247
'';
services.bind.zones."3.168.192.in-addr.arpa".file = pkgs.writeText "testsv99.rev" ''
$TTL 86400
@ IN SOA testsv99.local. root.testsv99.local. (
2024122001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
);
 IN NS testsv99.local.
247 IN PTR testsvii.
'';
}

 
以上をもって、zshとNeovimとchronyとBINDの設定投入とインストールの準備が出来た。
ここでsudo nixos-rebuild switchコマンドを叩き、上記のツールのインストールと設定反映を実行する。
ビルドが完了したら、NixOSを再起動させる。

[nix-shell:~]$ sudo nixos-rebuild switch 
building Nix...
building the system configuration...
these 68 derivations will be built:
  /nix/store/00fjjx45wa1gxxsrjvmplwwblaqpphv6-manifest.vim.drv
  /nix/store/0akcxq30dh51dddpb5q7jq5h1ylm1fdp-unit-script-network-addresses-enp0s3-start.drv
  /nix/store/0dd8zwwhzq6qagrncpjgm3aiz1ch3kxb-neovim-ruby-env.drv
  /nix/store/crp8f31a5dqfhnwg7jb25nfpcygfry5f-nixos-tmpfiles.d.drv
:
省略
:
[nix-shell:~]$

[nix-shell:~]$ sudo reboot

Broadcast message from root@nixos on pts/1 (Sun 2025-04-13 14:54:42 JST):

The system will reboot now!
:
省略
:

 


動作確認

上記にてnixos-rebuild switch コマンドを実行した結果、エラーを吐く事無く終了した。
NixOSの再起動の完了後、設定内容が正しく反映されているか確認する。
当記事では。コマンドを叩き想定どおりの結果が返ってきた事で正常に設定内容が反映されているものとする。
 
NixOSにログインし、chronyc sourcesコマンドを叩いてchronydがアクセスしている現在の時間ソースの情報を確認する。ntp.nict.jpのIPv6なアドレスが返ってきたので、正常に時間ソースにアクセス出来ていると判断する。

[testsv99:~ ]# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 2001:ce8:78::2                1   7   377    11  -1214us[-1507us] +/-   13ms
[testsv99:~ ]#

 
続いてDNSサーバ(BIND)の動作確認に入る。
systemctl status bind.serviceコマンドを叩き、BINDサービスが正常に立ち上がっているか確認する。
Active: の行が active (running) になっている事と、ログの中にエラー等が出力されていない事から、BINDが正常に動作出来ていると判断する。

[testsv99:~ ]# sudo systemctl status bind.service
● bind.service - BIND Domain Name Server
     Loaded: loaded (/etc/systemd/system/bind.service; enabled; preset: ignored)
     Active: active (running) since Sun 2025-04-13 14:54:59 JST; 2min 31s ago
 Invocation: 1b519719b33942b382fb8cfb00a15e21
       Docs: man:named(8)
    Process: 797 ExecStartPre=/nix/store/k7xa5h1pwv7hlc4s2n10lk4p305kq0a6-unit-script-bind-pre-start/bin/bind-pre-start (code=e>
    Process: 814 ExecStart=/nix/store/cx9bax06pm55f9srbm3ib3nr50zk8iqh-bind-9.18.33/sbin/named -u named -4 -c /nix/store/kycjzh>
   Main PID: 825 (named)
         IP: 7.5K in, 1.4K out
         IO: 8M read, 0B written
      Tasks: 12 (limit: 4662)
     Memory: 15.2M (peak: 15.6M)
        CPU: 122ms
     CGroup: /system.slice/bind.service
             └─825 /nix/store/cx9bax06pm55f9srbm3ib3nr50zk8iqh-bind-9.18.33/sbin/named -u named -4 -c /nix/store/kycjzhqq2c150h>

Apr 13 14:54:59 testsv99 named[825]: automatic empty zone: RESOLVER.ARPA
Apr 13 14:54:59 testsv99 named[825]: command channel listening on 127.0.0.1#953
Apr 13 14:54:59 testsv99 named[825]: managed-keys-zone: loaded serial 0
Apr 13 14:54:59 testsv99 named[825]: zone test.local.zone/IN: loaded serial 2025041101
Apr 13 14:54:59 testsv99 named[825]: zone 3.168.192.in-addr.arpa/IN: loaded serial 2024122001
Apr 13 14:54:59 testsv99 named[825]: all zones loaded
Apr 13 14:54:59 testsv99 named[825]: running
Apr 13 14:54:59 testsv99 systemd[1]: Started BIND Domain Name Server.
Apr 13 14:54:59 testsv99 named[825]: managed-keys-zone: Initializing automatic trust anchor management for zone '.'; DNSKEY >
Apr 13 14:54:59 testsv99 amed[825]: managed-keys-zone: Initializing automatic trust anchor management for zone '.'; DNSKEY >
[testsv99 :~ ]# 

 
ここでもう一度sudo systemctl status bind.serviceを入力する。
入力の途中で先程叩いたコマンドのサジェスチョンが表示され、zsh.nixで設定した内容がシステムに反映されている事が確認出来る。

[testsv99 :~ ]# sudo systemctl status bind.service


クライアント側にてDNSサーバによる名前解決の動作確認を実施する。
digコマンドをDNSサーバのホスト名を付けて叩き、上記で設定したDNSサーバの名前解決が正常に出来ているか確認する。
ANSWER SECTION: の出力内容のとおり、正引きの名前解決が正常に動作している事が分かる。

[hogehoge@jpmtkvmsv99 ~]$ dig testsv99.local

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> testsv99
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6623
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 0023f19014cece100100000067fbad117bc1deb5bb28ca3d (good)
;; QUESTION SECTION:
;testsv99.			IN	A

;; ANSWER SECTION:
testsv99.local.	86400	IN	A	192.168.3.247

;; Query time: 3 msec
;; SERVER: 192.168.3.247#53(192.168.3.247) (UDP)
;; WHEN: Sun Apr 13 15:01:32 JST 2025
;; MSG SIZE  rcvd: 143

[hogehoge@jpmtkvmsv99 ~]$ 

 
digコマンドを-xのオプションを付けて叩き、上記で設定したDNSサーバの逆引きの名前解決が正常に出来ているか確認する。
ANSWER SECTION: の出力内容のとおり、逆引きの名前解決が正常に動作している事が分かる。

[hogehoge@jpmtkvmsv99 ~]$ dig -x 192.168.3.247 

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> -x 192.168.3.247
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54081
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 714a05cb67c6847e0100000067fbad7f1614f91dc24534f0 (good)
;; QUESTION SECTION:
;247.3.168.192.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
247.3.168.192.in-addr.arpa. 86400 IN	PTR	testsv99.

;; Query time: 3 msec
;; SERVER: 192.168.3.247#53(192.168.3.247) (UDP)
;; WHEN: Sun Apr 13 15:02:39 JST 2025
;; MSG SIZE  rcvd: 108

[hogehoge@jpmtkvmsv99 ~]$ 

 
最後に、digコマンドをgoogle.co.jpを付けて叩いて、上記で設定したDNSサーバの正引きの名前解決が正常に出来ているか確認する。
ANSWER SECTION: の出力内容のとおり、外部のサービスも正引きの名前解決が正常に動作している事が分かる。

[hogehoge@jpmtkvmsv99 ~]$ dig google.co.jp

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> google.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37654
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 28d46b381fb1f3e70100000067fbada90bd8bbd07bb2bb52 (good)
;; QUESTION SECTION:
;google.co.jp.			IN	A

;; ANSWER SECTION:
google.co.jp.		45	IN	A	172.217.175.35

;; Query time: 47 msec
;; SERVER: 192.168.3.247#53(192.168.3.247) (UDP)
;; WHEN: Sun Apr 13 15:03:45 JST 2025
;; MSG SIZE  rcvd: 85

[hogehoge@jpmtkvmsv99 ~]$

 

今回はここまで。
1台のみではあるが、インストール直後のNixOSにあらかじめ用意した.nixファイルを適用させる事で、前回の記事にて構築したDNSサーバを再現させる事が出来た。今回は手動で.nixファイルをコピー&ペーストで適用させた為、他のLinuxディストリビューションで言うドットファイルや/etcディレクトリ配下のファイルをコピー&ペーストで貼り付けて環境構築する事とあまり変わらないかもしれない。しかし台数や設定ファイルが多くなると、NixOpsというDevOpsなツールを使用する事で今回やったような事を全台自動で行う事が可能となる。
 


振り返り
今回は手動で実施したが、それでもDebian GNU/LinuxやRHELなどのインストールや環境構築などと比較しても半分以下の時間で構築出来てしまった。
当方の環境のマシンスペック上、何台もの仮想マシンを一度に立ち上げるのは厳しい事がある為、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で構築したサーバの運用について