NixNG
NixNGは、NixOSから派生して開発中のLinuxディストリビューション です。NixOSに対して軽量で、コンテナ向けを謳っています。
NixOSからsystemdを省略し、パッケージセットを最小限に抑えることで 軽量化を図っているとのことです。たしかに、NixOSのコンテナイメージは けっこう重たいので、軽くなるなら間違いなく嬉しいところです。 また、systemdを省略したことでrunitなどより軽量なInitを採用できたり、 夢が広がりますよね。
ではNixNGは実際のところ、本家NixOSベースのイメージと比較して どれくらい軽量化されているのでしょうか? 両者のイメージを作成して、サイズを比較してみます。
検証方法
本家NixのイメージはDockerHubで配布されています。 これに相当する、Nixパッケージマネージャのみを含むイメージを NixNGで作成し、両者のサイズを比較します。
| ディストロ | パッケージ | ベースイメージ/ビルド |
|---|---|---|
| 本家Nix | Nix 2.32.2 | DockerHub nixos/nix:2.32.2 |
| NixNG | Nix 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は選択肢に入るかなと思いました。いかがでしょう?