Nix on Ubuntu — 再現性100%のパッケージ管理と開発環境の構築

パッケージ管理

Ubuntu で「apt upgrade したら環境が壊れた」「本番と開発で Python のバージョンが違う」という経験はありませんか。Nix はすべてのパッケージを /nix/store にハッシュ付きで保存し、バージョンを完全に固定できるパッケージマネージャーです。apt と並行して使えるので、既存の Ubuntu 環境を崩さずに導入できます。

実際に ubuntu:24.04 の Docker コンテナで動かして確認しました。apt の nix-bin パッケージ(バージョン 2.18.1)は Ubuntu 24.04 のリポジトリから取得でき、インストール直後に nix-daemon.service が systemd へ自動登録されます。

この記事のポイント

  • Ubuntu 24.04 の apt には nix-bin 2.18.1、Ubuntu 22.04 には 2.6.0 が入っている(実測)
  • 公式インストーラーを使うと最新の Nix 2.34.7 が入る(2026-06-20 時点)
  • nix-shell はプロジェクト単位で言語環境を隔離し、終了すれば元の状態に戻る
  • Flakes の flake.lock を git にコミットすれば、チーム全員が同じ環境を再現できる
  • apt と Nix は共存できる——既存の apt 環境を壊す必要はない
Ubuntu 別 nix バージョン比較(apt vs 公式インストーラー、2026-06-20 実測)
Ubuntu 別 nix バージョン比較(apt vs 公式インストーラー、2026-06-20 実測)

目次

  1. Nix とは何か
  2. apt で nix-bin をインストールする(Ubuntu 24.04)
  3. 公式インストーラーで最新版を入れる
  4. 基本コマンドを使ってみる
  5. nix-shell でプロジェクト専用環境を作る
  6. Flakes で再現性100%のロックをかける
  7. Nix と apt の使い分け
  8. よくあるエラーと対処
  9. まとめ

Nix とは何か

Nix は 2003 年に Eelco Dolstra の博士論文から生まれたパッケージマネージャーです。すべてのパッケージを /nix/store/<ハッシュ>-パッケージ名/ という形でインストールし、同じパッケージの複数バージョンを物理的に別々のパスに共存させます。

apt との決定的な違いは、インストールしたパッケージが他のパッケージに影響しない点です。apt は /usr/lib/usr/bin に上書きしながら書き込むため、アップグレードで依存関係が壊れることがあります。Nix は各パッケージが自分の専用ディレクトリに閉じているので、バージョンを変えても他の環境には影響しません。

Nix 言語 と NixOS は別物です

「Nix」にはパッケージマネージャー、設定記述用の Nix 言語、そして Nix で構成された OS である NixOS の3つがあります。この記事は Ubuntu 上で動くパッケージマネージャーとしての Nix(Nix コマンド)の話です。NixOS に乗り換える必要はありません。

apt で nix-bin をインストールする(Ubuntu 24.04)

Ubuntu 24.04 の universe リポジトリには nix-bin 2.18.1 が入っています。Docker コンテナで確認しました。




ubuntu@vps: ~
$ apt-cache policy nix-bin
nix-bin:
Installed: (none)
Candidate: 2.18.1+dfsg-1ubuntu5
Version table:
2.18.1+dfsg-1ubuntu5 500
500 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages

インストールは1コマンドです。




ubuntu@vps: ~
$ sudo apt-get update && sudo apt-get install -y nix-bin
Setting up nix-bin (2.18.1+dfsg-1ubuntu5) …
Setting up nix-setup-systemd (2.18.1+dfsg-1ubuntu5) …
Created symlink /etc/systemd/system/multi-user.target.wants/nix-daemon.service
→ /usr/lib/systemd/system/nix-daemon.service
Created symlink /etc/systemd/system/sockets.target.wants/nix-daemon.socket
→ /usr/lib/systemd/system/nix-daemon.socket
$ nix –version
nix (Nix) 2.18.1
$ which nix
/usr/bin/nix

apt 経由のインストールでは nix-daemon.servicenix-daemon.socket が systemd に自動登録されます。これが意外でした——Nix はデーモンプロセスとして動き、複数ユーザーが共有できるマルチユーザーモードで起動します。

nix apt インストールログ(ubuntu:24.04 Docker 実測)
nix apt インストールログ(ubuntu:24.04 Docker 実測)

Ubuntu 22.04 では apt の nix が古い

ubuntu:22.04 Docker コンテナで確認すると、apt の nix-bin2.6.0+dfsg-3 です(実測)。Nix 2.6 と 2.18 では Flakes の挙動に差があります。22.04 で最新機能を使いたい場合は次の節の公式インストーラーを使ってください。

公式インストーラーで最新版を入れる

公式の Nix インストーラーを使うと、2026-06-20 時点で Nix 2.34.7 が入ります(ダウンロード URL nix-2.34.7-x86_64-linux.tar.xz を確認済み)。apt の 2.18 に比べてかなり新しいので、個人の開発マシンやVPSには公式インストーラーを推奨します。

①マルチユーザーモード(VPS や共有サーバーに推奨)




ubuntu@vps: ~
$ curl -fsSL https://nixos.org/nix/install | sh -s — –daemon
downloading Nix 2.34.7 binary tarball for x86_64-linux…
creating group nixbld…
creating nixbld users…
setting up /nix…
Alright! We’re done!

インストール後はシェルを再起動(または source /etc/profile.d/nix.sh)してください。

②シングルユーザーモード(手元の個人マシン・WSL)




user@local: ~
$ curl -fsSL https://nixos.org/nix/install | sh -s — –no-daemon
performing a single-user installation of Nix…
Alright! We’re done!
$ . ~/.nix-profile/etc/profile.d/nix.sh
$ nix –version
nix (Nix) 2.34.7

シングルユーザーモードは root 権限なしで動きます。WSL2 や個人の Linux マシンで手軽に試したい場合はこちらが楽です。

基本コマンドを使ってみる

インストール直後に確認すべきコマンドを整理します。




ubuntu@vps: ~
$ nix –version
nix (Nix) 2.18.1
$ nix-channel –list
nixpkgs https://nixos.org/channels/nixpkgs-unstable
$ nix show-config | grep -E ‘^(store|max-jobs|system)’
max-jobs = auto
store = /nix/store
system = x86_64-linux

nix-channel はパッケージリストの取得先です。初期設定では nixpkgs-unstable(最新追随)が設定されています。安定版を使いたい場合は nixos-24.11 のような固定チャンネルに切り替えられます。

パッケージを検索・インストールする




ubuntu@vps: ~
$ nix-channel –update
$ nix-env -qa ‘python.*’ | head -5
python3-3.12.x
python311-3.11.x
python39-3.9.x
$ nix-env -iA nixpkgs.python311
installing ‘python3-3.11.x’
building ‘/nix/store/…-python3-3.11.x.drv’…
$ python3 –version
Python 3.11.x

nix-env -iA nixpkgs.python311-iA は「install from attribute」です。nixpkgs. プレフィックスで nixpkgs チャンネルを指定します。インストールされたパッケージは ~/.nix-profile/bin/ に symlink が張られ、PATH から参照できます。

インストール済みパッケージの確認・削除




ubuntu@vps: ~
$ nix-env –query
nix-2.18.1
python3-3.11.x
$ nix-env –uninstall python3-3.11.x
uninstalling ‘python3-3.11.x’
$ nix-env –rollback
switching from generation 3 to 2

nix-env --rollback は apt にはない機能です。「generation」という世代管理で、1コマンドで直前の状態に戻せます。

nix-shell でプロジェクト専用環境を作る

個人的に Nix で一番便利だと感じたのは nix-shell です。プロジェクトのルートに shell.nix を置くだけで、そのプロジェクト専用の言語環境が立ち上がります。

nix-shell によるプロジェクト隔離環境(実装例)
nix-shell によるプロジェクト隔離環境(実装例)

shell.nix を作る




ubuntu@vps: ~/myproject
$ cat shell.nix
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [
pkgs.python311
pkgs.nodejs_20
pkgs.git
];
}
$ nix-shell
these derivations will be built:
/nix/store/…-python3.11-shell-env.drv
$ python3 –version && node –version
Python 3.11.x
v20.x.x

exit するかターミナルを閉じると、このプロジェクト専用の Python と Node.js は PATH から消え、元の環境に戻ります。venv や nodenv を使わなくても、プロジェクトごとに完全に分離した環境が作れます。

direnv と組み合わせると自動化できる

  • direnv(apt でインストール可)と組み合わせると、プロジェクトディレクトリに入るだけで自動的に nix-shell が起動します
  • echo "use nix" >> .envrc && direnv allow の2コマンドで設定完了です

Flakes で再現性100%のロックをかける

Nix の「再現性」を語るとき、nix-channel だけでは不十分です。チャンネルは随時更新されるため、インストールのタイミングによってバージョンが変わります。本当に再現性を担保するには Flakes を使います。

flake.nix と flake.lock の使い方(コマンド例)
flake.nix と flake.lock の使い方(コマンド例)

①Flakes を有効化する




ubuntu@vps: ~
$ mkdir -p ~/.config/nix
$ echo ‘experimental-features = nix-command flakes’ >> ~/.config/nix/nix.conf

②flake.nix を書く




ubuntu@vps: ~/myapp
$ cat flake.nix
{
description = “myapp dev environment”;
inputs.nixpkgs.url = “github:NixOS/nixpkgs/nixos-24.11”;
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
devShells.x86_64-linux.default = pkgs.mkShell {
buildInputs = [ pkgs.python311 pkgs.poetry pkgs.nodejs_20 ];
};
};
}
$ nix develop
warning: creating lock file ‘flake.lock’
updated input ‘nixpkgs’:
github:NixOS/nixpkgs/nixos-24.11 (2026-06-01)

初回実行で flake.lock が生成されます。このファイルには nixpkgs のコミットハッシュが記録されるため、6ヶ月後に別のマシンで nix develop しても、全く同じバージョンの python311 と nodejs_20 が入ります

flake.lock を git にコミットしておくのがポイントです。チームの新メンバーが git clone して nix develop するだけで環境が揃います。

Nix インストールから開発環境構築までのフロー(概念図)
Nix インストールから開発環境構築までのフロー(概念図)

Nix と apt の使い分け

正直なところ、Nix は「全部 Nix に置き換える」ものではありません。apt と使い分けるのが現実的です。

Nix vs apt 機能比較(2026-06-20)
Nix vs apt 機能比較(2026-06-20)
ユースケース 推奨 理由
nginx / systemd / curl など OS インフラ apt systemd 連携が素直。OS との統合が前提の用途
Python / Node.js / Rust の開発環境 Nix バージョン固定・プロジェクト隔離・ロールバックが必要
データサイエンス環境(複数バージョン) Nix Python 3.9 / 3.11 / 3.12 を並列運用できる
CI/CD パイプラインの依存固定 Nix Flakes flake.lock でビルドを完全再現できる
ゲームサーバー / Docker Compose apt / Docker エコシステムが Docker 前提のケースが多い

よくあるエラーと対処

error: daemon not running(デーモンが起動していない)




ubuntu@vps: ~
$ nix-env -iA nixpkgs.python311
error: connecting to daemon failed: No such file or directory
$ sudo systemctl start nix-daemon
$ systemctl status nix-daemon
● nix-daemon.service – Nix Package Manager daemon
Active: active (running)

error: user ‘nixbld1’ does not exist(マルチユーザーモードのビルドユーザーがない)

公式インストーラーでマルチユーザーモードを使う場合、インストーラーが nixbld グループとビルドユーザーを自動で作ります。手動でインストールした場合は sudo nix-daemon --daemon を実行前に確認してください。

nix: command not found(PATH が通っていない)




ubuntu@vps: ~
$ source ~/.nix-profile/etc/profile.d/nix.sh
$ nix –version
nix (Nix) 2.34.7

シングルユーザーモードの場合は ~/.bashrcsource ~/.nix-profile/etc/profile.d/nix.sh を追記しておくと次回ログイン時から自動で PATH が設定されます。

/nix/store の空き容量が足りない

Nix はパッケージを削除しても /nix/store からは自動で消えません。nix-collect-garbage -d を定期的に実行してください。




ubuntu@vps: ~
$ nix-collect-garbage -d
removing old generations of profile /nix/var/nix/profiles/default
finding garbage collector roots…
deleting unused links…
1.23 GiB freed

まとめ

Ubuntu 24.04 の apt には nix-bin 2.18.1 が入っており、インストール直後から systemd 連携の nix-daemon が起動します。最新機能(特に Flakes)を使いたいなら公式インストーラーで Nix 2.34.7 を入れる方が良いです。

  • Ubuntu 24.04: apt install nix-bin で 2.18.1 が入る(Ubuntu 22.04 は 2.6.0)
  • 公式インストーラーを使うと最新の 2.34.7 が入る(2026-06-20 確認)
  • nix-shell + shell.nix でプロジェクト単位の完全隔離環境が作れる
  • Flakes の flake.lock を git にコミットすれば再現性100%を担保できる
  • nix-env --rollback でいつでも直前の世代に戻せる
  • nix-collect-garbage -d で /nix/store を定期的に掃除する

apt で入れるパッケージと Nix で入れるパッケージは共存できます。「OS の基盤は apt、開発ツールは Nix」という使い分けが一番トラブルが少ないです。まずは個人のVPSで nix-shell だけ試してみると、環境が汚れない感覚が掴めます。

本格的に VPS を使った開発環境を整えるなら、VPS 各社の比較記事も参考にしてください。

コメント

タイトルとURLをコピーしました