NixOSのパッケージやOSのアップデートに関するメモ

前回の記事では、NixOS上で動作するメール転送エージェントPostfixおよびメール配信エージェントDovecotに対してSASL認証を有効化し、クライアント側に電子メールクライアントnPOPを導入して送受信の動作確認を行った。
NixOSを導入してから1ヶ月以上が経過したが、他のLinuxディストリビューションやOpenBSDのようなパッケージ管理やシステムアップデートを一度も実施していなかったことに気付いた。
本記事は、NixOSをサーバ用途で運用する環境における、パッケージおよびシステムのアップデート手法に関する備忘録である。
過去の記事について NixOSネタの記事の一覧は、当記事内最下部の「NixOS関連の記事」欄内を参照。
2025/5/24追記 NixOS 24.11から25.05へのアップデートに関しては以下の記事を参照
https://debslink.hatenadiary.jp/entry/20250524/1748072722 NixOSを24.11から25.05にアップデートした
 


当方の環境
ホスト機:macOS 15.4.1 / MacBook Pro 2020 / RAM: 16GB / CPU: Intel Core i5 2.0GHz
仮想化環境:Oracle VirtualBox 7.1.6 r167084
ゲストOS:NixOS 25.05 unstable、NixOS 23.11(Tapir)
パッケージのアップデートはNixOS 25.05(unstable版)で実行、OSのアップデートは別途23.11の仮想マシンを立てて24.11にアップデートを実施。当環境ではNixOSをサーバ用途で利用している為、Flakeとhome-managerは未導入の状態で当記事の内容を実行した。
 


今回の要件
パッケージのアップデートは、約1ヶ月前にzipファイルで保存しておいたNixOS 24.11の環境をVirtualBox上で起動し、その中で実施した。1ヶ月も経過していれば、何らかのパッケージに更新が入っている可能性が高いと考えたためである。
OSのアップデートについては、NixOS 23.11を新規にインストールした環境に対し、当記事執筆時点での最新版であるNixOS 24.11へのアップグレードを試みた。
 


サーバOSとしてのNixOSにおけるパッケージの管理
NixOSを開発環境として利用している場合、多くはnix-envやnix profileコマンドを用いて、パッケージのインストールやアップデートを行っているだろう。ここで言う「開発環境」とは、いわゆるネットワークエンジニアやサーバ管理者の間で使われる「本番環境/開発環境」といった意味ではなく、ソフトウェア開発を行うためのローカル環境を指している。
/etc/nixos/configuration.nixファイルに、サーバ関連の設定やシェルやエディタ、その他必要なパッケージを記述し、sudo nixos-rebuild switch を実行して環境を構築している場合、nix-envを使用してもOSやパッケージのアップデートは反映されない。
NixOSをサーバ専用機として運用し、導入するすべてのパッケージを/etc/nixos/configuration.nixファイルに記述し、nixos-rebuild switchコマンドで管理している環境においては、パッケージおよびOSのアップデートはnix-channelコマンドを用いて行う必要がある。
 


システムおよびインストール済みパッケージのアップデート
RHELやUbuntuなどのようなLinuxディストリビューションをサーバ用途で導入・運用している場合、管理者ではないユーザ達が各々パッケージを導入し利用しているというケースは無いだろう。NixOSがRHELやUbuntu等で立てたサーバのような運用をするのであれば、nix-envとは別のコマンドを使用する事となる。
 
1. アップデート前の確認
OSやパッケージのアップデートの前に、現環境のバージョンを出力させる。
以下はNixOSのシステム情報。
当記事では、OSやパッケージの更新が頻繁に行われているであろうNixOS 25.05 unstable版を使用した。

[testsv99:~ ]$ uname -a     
Linux testsv99 6.12.21 #1-NixOS SMP PREEMPT_DYNAMIC Fri Mar 28 21:03:33 UTC 2025 x86_64 GNU/Linux
[testsv99:~ ]$ 

 
続いて、インストール済みパッケージであるzsh、Nvim、gitの現段階のバーションを出力する。

[testsv99:~ ]$ zsh --version
zsh --version
zsh 5.9 (x86_64-pc-linux-gnu)
[testsv99:~ ]$ 
[testsv99:~ ]$ 
[testsv99:~ ]$ nvim -V1 -v
nvim -V1 -v
NVIM v0.11.0
Build type: Release
LuaJIT 2.1.1741730670

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "
/nix/store/cmsbdfr6c1wbgzx6f6hl63z31m4mnym3-neovim-unwrapped-0.11.0/share/nvim
"
Run :checkhealth for more info
[testsv99:~ ]$ 
[testsv99:~ ]$ 
[testsv99:~ ]$ git -v
git -v
git version 2.49.0
[testsv99:~ ]$ 

 
NixOSでインストール済みのパッケージのバージョンを確認する方法として、上記のようにコマンドを叩いてバージョンを出力させる方法の他に、/nix/storeの中のディレクトリ名から判断する事も出来る。パッケージがビルドされる際に生成されるディレクトリで、hash値-パッケージ名-バージョン という構文になっている。

[jpmtkvmsv99:~ ]$ ls /nix/store | grep zsh- 
dr-xr-xr-x    3 root root       4096 Jan  1  1970 206i88qsxylfad59k03jpdg7wz45srry-zsh-5.9-info
dr-xr-xr-x    3 root root       4096 Jan  1  1970 4i106x14nzsl2wslv549mvrw1gjzkqm4-zsh-syntax-highlighting-0.8.0
dr-xr-xr-x    6 root root       4096 Jan  1  1970 4s5j74mqdljf0m753lsfkd1jp236zrf7-zsh-5.9
-r--r--r--    1 root root       1729 Jan  1  1970 5a65r349fs70zgvyigxmy1jsqks8752i-zsh-syntax-highlighting-0.8.0.drv
dr-xr-xr-x    3 root root       4096 Jan  1  1970 7ib0yp3mq6bvgqm6bkdzp2nj86l6niyj-nix-zsh-completions-0.5.1
-r--r--r--    1 root root       3616 Jan  1  1970 9fbmhrdcpnfbqz9hghap2lnjlkarbzsh-source.drv
dr-xr-xr-x    3 root root       4096 Jan  1  1970 amxlah1q7813daibv9nn0ird8ybdpvwk-zsh-5.9-man
:
省略
:
[jpmtkvmsv99:~ ]$ 

 

2. システムおよびパッケージのアップデート
作業前のバージョン確認を終えたところで、sudo nix-channel --updateコマンドを叩き、現在使用しているNixOSチャンネル(パッケージのソース)の最新版を取得する。
Debian系Linuxディストリビューションで言うsudo apt updateコマンドのようなものである。

[testsv99:~ ]$ sudo nix-channel --update
[sudo] password for hechtia: 
unpacking 1 channels...
[testsv99:~ ]$ 

 
続いてsudo nixos-rebuild switch --upgradeコマンドを叩き、システムをビルドしてパッケージをアップデートする。RHEL系Linuxディストリビューションで言うsudo yum upgradeコマンド、Debian系Linuxディストリビューションで言うsudo apt upgradeコマンドのようなものである。

[testsv99:~ ]$ sudo nixos-rebuild switch --upgrade
unpacking 1 channels...
this derivation will be built:
  /nix/store/vrr4j3f9maabvcby60wzavmvxqpa1d7y-nixos-rebuild.drv
these 146 paths will be fetched (60.17 MiB download, 282.24 MiB unpacked):
  /nix/store/zlhxfnpm04w3gyv4v4dvd9x4aj4nghfw-acl-2.3.2
  /nix/store/gki9d8dw4r9ri6zx44vsj90dnn9zji48-attr-2.5.2
  /nix/store/cwbwsvdvsl91v4lbn62s8br1svk350ax-audit-4.0.3-lib
  /nix/store/dhr0ibhw6jgrdf89dq9ynkak3cyxay47-aws-c-auth-0.8.1
:
省略
:
starting the following units: audit.service, chronyd.service, kmod-static-nodes.service, logrotate-checkconf.service, mount-pstore.service, network-setup.service, NetworkManager.service, nscd.service, resolvconf.service, systemd-modules-load.service, systemd-oomd.socket, systemd-sysctl.service, systemd-vconsole-setup.service, virtualbox.service
the following new units were started: NetworkManager-dispatcher.service, sshd-unix-local.socket, sshd-vsock.socket, sysinit-reactivation.target, systemd-hostnamed.service, systemd-tmpfiles-resetup.service
Done. The new configuration is /nix/store/yz332ykxbmfivb2v7snymgzipcsb8g61-nixos-system-testsv99-25.05pre785698.b024ced1aac2
[testsv99:~ ]$ 

 
エラーを吐かずビルドが正常に終了したら、rebootコマンドを叩いてNixOSを再起動させる。
NixOSの再起動の完了後、NixOSにログインしアップデート後のバージョンを確認する。

以下はNixOSのシステム情報。
NixOSのカーネルのバージョンが6.12.21から6.12.23にアップデートされた事が分かる。

[testsv99:~ ]$ uname -a  
Linux testsv99 6.12.23 #1-NixOS SMP PREEMPT_DYNAMIC Thu Apr 10 12:39:41 UTC 2025 x86_64 GNU/Linux
[testsv99:~ ]$ 

 
続いて、インストール済みパッケージであるzsh、Nvim、gitの現段階のバーションを確認するも、これらのパッケージのアップデートは無かった為、当記事ではコマンドの出力結果は割愛する。新規構築からの期間が短かすぎたようだ。もっと前にNixOSでサーバを立てていたら、どれかはアップデートされたかもしれない...
 


NixOSのアップデート
UbuntuやRHEL等といったメジャーなLinuxディストリビューションではパッケージのアップデートと共にOSのアップデートが実行される。
NixOSの場合、パッケージのアップデートとは別の手順でOSのアップデートを実行する。
今回はNixOSのバージョン23.11から当記事の投稿の段階で現行バージョンである24.11にアップデートした。

アップデート前の環境は以下のとおり。

[testsv99:~ ]# cat /etc/os-release 
BUG_REPORT_URL="https://github.com/NixOS/nixpkgs/issues"
BUILD_ID="23.11.7870.205fd4226592"
DOCUMENTATION_URL="https://nixos.org/learn.html"
HOME_URL="https://nixos.org/"
ID=nixos
LOGO="nix-snowflake"
NAME=NixOS
PRETTY_NAME="NixOS 23.11 (Tapir)"
SUPPORT_END="2024-06-30"
SUPPORT_URL="https://nixos.org/community.html"
VERSION="23.11 (Tapir)"
VERSION_CODENAME=tapir
VERSION_ID="23.11"
[testsv99:~ ]# 

 
最初にsudo nix-channel --addコマンドでNixOSのチャンネルをアップデート先のバージョンに指定する。
以下の例ではバージョン23.11から24.11にアップデートしたい為、チャンネルをnixos-24.11に指定している。
続けて、sudo nix-channel --updateコマンドでチャンネルをアップデートする。nix-channel --updateコマンドは、他のLinuxディストリビューションで言うyum updateやapt updateのようなものである。

[testsv99:~ ]# sudo nix-channel --add https://nixos.org/channels/nixos-24.11 nixos
[testsv99:~ ]# 
[testsv99:~ ]# sudo nix-channel --update nixos
unpacking channels...
[testsv99:~ ]#

 
NixOSおよびNixOSのシステムパッケージをビルドする。
ここでOSとパッケージが新しいバージョンに更新される。nixos-rebuild switch --upgradeコマンドは、他のLinuxディストリビューションで言うyum upgradeやapt upgradeのようなものである。

[testsv99:~ ]# sudo nixos-rebuild switch --upgrade
unpacking channels...
this derivation will be built:
  /nix/store/569hxi68m1cvblc1d5nsk1gzq8chw7dv-nixos-rebuild.drv
these 141 paths will be fetched (55.08 MiB download, 251.88 MiB unpacked):
  /nix/store/dyizbk50iglbibrbwbgw2mhgskwb6ham-acl-2.3.2
  /nix/store/vlgwyb076hkz7yv96sjnj9msb1jn1ggz-attr-2.5.2
  /nix/store/wgjik20k56ih5a8y1b9zqxfs1ya9sxxy-audit-4.0
:
省略
:
sysinit-reactivation.target, systemd-boot-random-seed.service, systemd-bootctl.socket, systemd-creds.socket, systemd-hostnamed.service, systemd-hostnamed.socket, systemd-journald-audit.socket, systemd-tmpfiles-resetup.service
[testsv99:~ ]# 

 

エラーを吐く事無く完了した。
これでNixOSのアップデートが完了。/etc/os-releaseの内容を出力し、NixOSのバージョンが上がっている事を確認。
BUILD_IDおよびVERSIONとVERSION_IDが24.11になっている事が分かる。

[testsv99:~ ]# cat /etc/os-release 
ANSI_COLOR="1;34"
BUG_REPORT_URL="https://github.com/NixOS/nixpkgs/issues"
BUILD_ID="24.11.716947.26d499fc9f1d"
CPE_NAME="cpe:/o:nixos:nixos:24.11"
DEFAULT_HOSTNAME=nixos
DOCUMENTATION_URL="https://nixos.org/learn.html"
HOME_URL="https://nixos.org/"
ID=nixos
ID_LIKE=""
IMAGE_ID=""
IMAGE_VERSION=""
LOGO="nix-snowflake"
NAME=NixOS
PRETTY_NAME="NixOS 24.11 (Vicuna)"
SUPPORT_END="2025-06-30"
SUPPORT_URL="https://nixos.org/community.html"
VARIANT=""
VARIANT_ID=""
VENDOR_NAME=NixOS
VENDOR_URL="https://nixos.org/"
VERSION="24.11 (Vicuna)"
VERSION_CODENAME=vicuna
VERSION_ID="24.11"
[testsv99:~ ]# 

 


NixOSと他のLinuxディストリビューションとの対比

以下の表は、NixOSのパッケージのアップデートやOSのアップデートで使用するコマンドと、他のLinuxディストリビューションで使用するコマンドの比較である。
管理者権限で実行する際は、コマンドの頭にsudoを付けて実行する必要がある。
尚、以下の表はどのWebブラウザからアクセスしても表示が崩れないように画像ファイルを貼り付けたものである。


 

今回はここまで。
インストール済みパッケージのアップデート方法についてGoogle検索すると、ユーザ環境においてnix-envコマンドを使用する手法が多く紹介されている。自分の環境でも当初はnix-envによるアップデートを試みたが何も更新されず、原因を調査したところ、nix-envでインストールされたパッケージは同じくnix-envによってのみアップデートされることがわかった。

その後、/etc/nixos/configuration.nixファイルに必要なパッケージを記述し構築した環境においては、パッケージおよびOSのアップデート手順が異なることを学んだ。他のLinuxディストリビューションにおけるyumやaptのようなユーザ単位ではない、システム全体のパッケージ管理手法を知ることで、NixOS をサーバOSとして運用する際の理解が一段深まった。
 


注意事項
当環境のように、NixOSにFlakeやhome-managerを導入せずサーバ用途のみで利用している環境においては、OSのやパッケージのアップデートは当記事の内容でサクッと実行出来るが、NixOSでは一般的であろう、Flakeが導入されている環境ではいくつかの問題点が有るため対処が必要である。
この問題点に関しては以下のサイト内の「NixOSにおける自動更新の難しさ」を参照。
https://blog.anqou.net/2025/03/nixos-unattended-upgrade/#fnref-inconsistent-flake-lock ぼくのかんがえたさいきょうの NixOS 自動更新

この問題点の詳細な内容に関しては以下のサイトを参照。
https://aires.fyi/blog/why-is-enabling-automatic-updates-in-nixos-hard Why is enabling automatic updates in NixOS so hard?
 


振り返り
NixOSではユーザ環境毎やプロジェクト毎にパッケージの管理が出来る。Flakeやhome-managerを利用してこなかった為に、それに気が付くまで結構な時間を要した。NixOSの説明の中でプロジェクト毎の管理やユーザ毎の管理というくだりが有っても意味があやふやなままNixOSを利用し続けていたが、当記事の内容を実施した事でその意味を把握する事が出来た。
 


 


参照サイト
https://nixos.org/ Nix & NixOS Declarative builds and deployments
https://nixos.org/manual/nixos/stable/ NixOS Manual
https://nixos.org/manual/nixos/stable/#sec-upgrading Upgrading NixOS
https://yaaamaaaguuu.hatenablog.com/entry/2020/04/27/011043 私的Nixosアップデートメモ 20.03
https://qiita.com/hnakano863/items/8cab4d7bd7778850b549 Nixパッケージマネージャーの使い方
 


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を導入しファイルサーバを構築した