#nix

NixNG

NixNGは、NixOSから派生して開発中のLinuxディストリビューション です。NixOSに対して軽量で、コンテナ向けを謳っています。

NixOSからsystemdを省略し、パッケージセットを最小限に抑えることで 軽量化を図っているとのことです。たしかに、NixOSのコンテナイメージは けっこう重たいので、軽くなるなら間違いなく嬉しいところです。 また、systemdを省略したことでrunitなどより軽量なInitを採用できたり、 夢が広がりますよね。

ではNixNGは実際のところ、本家NixOSベースのイメージと比較して どれくらい軽量化されているのでしょうか? 両者のイメージを作成して、サイズを比較してみます。

検証方法

本家NixのイメージはDockerHubで配布されています。 これに相当する、Nixパッケージマネージャのみを含むイメージを NixNGで作成し、両者のサイズを比較します。

ディストロパッケージベースイメージ/ビルド
本家NixNix 2.32.2DockerHub nixos/nix:2.32.2
NixNGNix 2.32.2以下でビルドする

また、プラットフォームはx86_64-linuxで揃えます。

NixNGビルド用flake

検証用のflakeのプロジェクトを作成します。

flake.nix:

{
  inputs = {
    nixng.url = "github:nix-community/NixNG";
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  };
  outputs =
    {
      self,
      nixng,
      nixpkgs,
      ...
    }:
    {
      examples.nixng-nix = import ./examples/nixng-nix.nix {
        inherit (nixng) nglib;
        inherit nixpkgs;
        system = "x86_64-linux";
      };
    };
}

examples.nixng-nixが、作成したい比較対象のシステムです。 NixNGのリポジトリにある例を参考に、

examples/nixng-nix.nix:

{
  nglib,
  nixpkgs,
  system,
}:

nglib.makeSystem {
  inherit nixpkgs;
  inherit system;
  name = "nixng-nix";
  config =
    { pkgs, ... }:
    {
      dumb-init = {
        enable = true;
        type.shell = { };
      };
      nix = {
        enable = true;
        package = pkgs.nixVersions.nix_2_32;
        config = {
          experimental-features = [
            "nix-command"
            "flakes"
          ];
          sandbox = false;
        };
      };
    };
}

OCIイメージのビルドとロード

Dockerでイメージのtarファイルを生成します:

$ docker run --rm --platform linux/amd64 -v $(pwd):/work -w /work \
    nixos/nix:2.32.2 bash -c '
    {
        echo "filter-syscalls = false"
        echo "experimental-features = nix-command flakes"
    } >> /etc/nix/nix.conf
    nix build .#examples.nixng-nix.config.system.build.ociImage.stream
    ./result > nixng-nix-image.tar
    '

$ docker image load -i nixng-nix-image.tar 

ARMのmacOSのDocker Desktopだと、 Nixの設定にfilter-syscalls = falseを追加しないとエラーになる ので注意です。

結果

イメージサイズ

本家Nixのイメージは上記の過程で既に手元にあります。 さてさて、両者のサイズはどうなっているでしょう?

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nixos/nix    2.32.2    f9b3c7811e27   55 years ago   436MB
nixos/nix    latest    f9b3c7811e27   55 years ago   436MB
nixng-nix    latest    26361447b07f   55 years ago   356MB

本家のイメージは436MBなのに対し、NixNGは356MBとなり、約18%(80MB) の軽量化が確認できました。

/nix/store/の内容

どんなパッケージが省略されているのか気になりました。 まずパッケージ数を確認すると、

$ docker run --platform linux/amd64 nixos/nix:2.32.2 \
    sh -c 'ls /nix/store' 2>/dev/null | rg '^[a-z0-9]+-' | wc -l
     121
$ docker run --platform linux/amd64 nixng-nix \
    sh -c 'ls /nix/store' 2>/dev/null | rg '^[a-z0-9]+-' | wc -l
      81

本家Nixが121なのに対して、NixNGは81と、パッケージ数が40 少なくなっています。

差分を詳しく見てみます。各パッケージの細かいバージョンの違いを前処理:

$ docker run --platform linux/amd64 nixos/nix:2.32.2 \
    sh -c 'ls /nix/store' 2>/dev/null | rg '^[a-z0-9]+-' \
    | cut -d'-' -f2- \
    | sed -Ee 's#[0-9]{4}(-?[0-9]{2}(-?[0-9]{2})?)?[a-z]?#DATE#' \
        -e 's#[0-9]+\.[0-9]+([.p-][0-9]+)?#VERSION#' \
    | sort \
    | uniq \
    > nixos-nix-nix-store.txt

$ docker run --platform linux/amd64 nixng-nix \
    sh -c 'ls /nix/store' 2>/dev/null | rg '^[a-z0-9]+-' \
    | cut -d'-' -f2- \
    | sed -Ee 's#[0-9]{4}(-?[0-9]{2}(-?[0-9]{2})?)?[a-z]?#DATE#' \
        -e 's#[0-9]+\.[0-9]+([.p-][0-9]+)?#VERSION#' \
    | sort \
    | uniq \
    > nixng-nix-nix-store.txt

その上で差分を見ると:

--- nixos-nix-nix-store.txt	2025-11-08 21:45:41
+++ nixng-nix-nix-store.txt	2025-11-08 21:45:48
@@ -1,6 +1,5 @@
 acl-VERSION
 attr-VERSION
-audit-VERSION-lib
 aws-c-auth-VERSION
 aws-c-cal-VERSION
 aws-c-common-VERSION
@@ -14,73 +13,45 @@
 aws-checksums-VERSION
 aws-crt-cpp-VERSION
 aws-sdk-cpp-VERSION
-base-system
 bash-interactive-VERSION
-bash-interactive-VERSION-man
 bash-VERSION
 boehm-gc-VERSION
 boost-VERSION
 brotli-VERSION-lib
 busybox-VERSION
 bzip2-VERSION
-channel-nixos
-coreutils-full-VERSION
-coreutils-VERSION
+ca-certificates.crt
 curl-VERSION
-curl-VERSION-bin
-curl-VERSION-man
-db-VERSION
-dns-root-data-DATE
-editline-VERSION
-expat-VERSION
-findutils-VERSION
+dumb-init-VERSION
+editline-VERSION-unstable-DATE
 gcc-VERSION-lib
 gcc-VERSION-libgcc
-gdbm-VERSION-lib
-gettext-VERSION
-git-minimal-VERSION
+generate-shadow
 glibc-VERSION
-glibc-VERSION-bin
-gmp-with-cxx-VERSION
-gnugrep-VERSION
-gnused-VERSION
-gnutar-VERSION
-groff-VERSION
-gzip-VERSION
-gzip-VERSION-man
+group
+hwloc-VERSION-lib
 iana-etc-DATE
+icu4c-VERSION
 keyutils-VERSION-lib
 krb5-VERSION-lib
-ldns-VERSION
-less-668
-less-668-man
 libarchive-VERSION-lib
 libblake3-VERSION
-libbsd-VERSION
-libcap-ng-VERSION
-libcap-VERSION-lib
-libcbor-VERSION
 libcpuid-VERSION
-libedit-DATE-VERSION
-libfido2-VERSION
 libgit2-VERSION-lib
 libidn2-VERSION
-libmd-VERSION
-libpipeline-VERSION
 libpsl-VERSION
 libseccomp-VERSION-lib
 libsodium-VERSION
 libssh2-VERSION
 libunistring-VERSION
-libxcrypt-VERSION
 libxml2-VERSION
-linux-pam-VERSION
 llhttp-VERSION
 lowdown-VERSION-lib
-man-db-VERSION
-manifest.nix
 ncurses-VERSION
+ndig4f4dx8bmrmyr5vfm19g02r9l9ggm-source
 nghttp2-VERSION-lib
+nghttp3-VERSION
+ngtcp2-VERSION
 nix-cmd-VERSION
 nix-expr-VERSION
 nix-fetchers-VERSION
@@ -89,32 +60,20 @@
 nix-store-VERSION
 nix-util-VERSION
 nix-VERSION
-nss-cacert-VERSION
-openssh-VERSION
+nix.conf
+nixng-nixng-nix
+onetbb-DATE.VERSION
 openssl-VERSION
+passwd
 pcre2-VERSION
-pcsclite-VERSION-lib
+profile
 publicsuffix-list-0-unstable-DATE
 readline-VERSION
-root-profile-env
 s2n-tls-VERSION
-shadow-VERSION
-source
+service-dir
 sqlite-VERSION
-systemd-minimal-libs-VERSION
-tbb-DATE.VERSION
-tbb-DATE.VERSION-dev
-tcb-VERSION
-util-linux-minimal-VERSION-bin
-util-linux-minimal-VERSION-lib
-util-linux-minimal-VERSION-login
-util-linux-minimal-VERSION-mount
-util-linux-minimal-VERSION-swap
-wget-VERSION
-which-VERSION
+tzdata-DATE
 xgcc-VERSION-libgcc
 xz-VERSION
-zlib-ng-VERSION
 zlib-VERSION
 zstd-VERSION
-zstd-VERSION-bin

NixNGではsystemd (systemd-minimal-libs) が消えているのに加え、 他のパッケージもいろいろと省略されています。

感想

身も蓋もないことをいうと、軽くしたいならAlpine/Distroless使えよって話ですが、 Nixを使いたくて、少しでもクラウド利用料等を節約したいなら、 NixNGは選択肢に入るかなと思いました。いかがでしょう?