Installing NixOS on Raspberry Pi 4

Michael Lynch

Raspberry Pi 4にNixOSをインストールする

原文は Michael Lynch により に公開されました。 このブログを購読する

Nixは、ソフトウェア環境をコードで定義できるツールです。Nixにはいくつかのコンポーネントがありますが、私にとって特に興味深いのはNixOSで、Nixのツールを使ってOS全体の設定をプレーンテキストファイルで定義できる点です。

私がNixを試し始めたのはごく最近のことで、学ぶべきことは山ほどあります。最初に試したことのひとつがRaspberry PiにNixOSをインストールすることでしたが、最初の数回は失敗に終わりました。見つかるNixOSのPi向けチュートリアルは、どれも不完全か古くなっていました。

そこで、Raspberry Pi 4にNixOSをインストールするための完全かつ動作確認済みのガイドをお届けします。私自身NixOS初心者なので、このガイドはNix初心者向けに書いていますが、Raspberry PiとLinuxに関する基本的な知識があることを前提としています。

必要なもの

このチュートリアルを進めるには、以下のものが必要です:

  • 2GB以上のRAMを搭載したRaspberry Pi 4
  • 8GB以上のmicroSDカード
  • microSDカードリーダー
  • microSDカードを書き込むための別のコンピューター

NixOS microSDイメージのダウンロード

まずは、以下のリンクからNixOSのmicroSDイメージをダウンロードしてください:

より新しいイメージは、Nixのビルドサーバーで緑色のチェックマークが付いた最新のビルドを確認することで見つけられます。

私は最近、より新しいビルド(nixos-image-sd-card-25.05beta741800.78886a72ed11、2025-01-19にビルド)でもこの手順を試しましたが、インストールは失敗しました。その後のnixos-buildステップで、手元のPi 4の2GBのRAMを使い切ってしまったのです。

NixOS microSDイメージの展開

NixOSチームはmicroSDイメージをZstandardという圧縮形式で圧縮しています。これはFacebookが開発したオープンソースの圧縮形式です。

NixOSイメージを展開するには、お使いのプラットフォーム向けの最新版Zstandardをダウンロードしてください:

ZstandardツールとNixOSのmicroSDイメージの両方を用意できたら、次のコマンドで.img.zstファイルを展開します:

zstd --decompress 'nixos-sd-image-23.11pre515819.8ecc900b2f69-aarch64-linux.img.zst'

このZstandardファイルを展開すると、nixos-sd-image-23.11pre515819.8ecc900b2f69-aarch64-linux.imgというファイルが生成されるはずです。

NixOS microSDイメージの書き込み

イメージを展開したら、お好みのmicroSD書き込みツールを使ってmicroSDに書き込んでください。

microSDに書き込む際は、.img.zstファイルではなく.imgファイルを選択してください。ほとんどの書き込みツールはZstandard形式に対応していません。

方法1: balenaEtcher

どのmicroSD書き込みツールを使えばよいかわからない場合は、balenaEtcherをおすすめします。使いやすく、主要なOSすべてで動作します。

balenaEtcherのスクリーンショット

方法2: caligula

balenaEtcherはNixOSでは利用できないため、NixOSをお使いの場合はcaligulaが良い代替手段になります:

caligula burn \
  nixos-sd-image-23.11pre515819.8ecc900b2f69-aarch64-linux.img.zst

caligulaはZstandardによるファイル圧縮にネイティブ対応しているため、事前にイメージを展開する必要はありません。

microSDカードをPiに挿入する

microSDへの書き込みが終わったら、Raspberry PiのmicroSDスロットに挿入します:

Raspberry PiのmicroSDスロットに挿入されたmicroSDの写真

書き込み済みのmicroSDカードをPiのmicroSDスロットに挿入します。

ディスプレイとキーボードをPiに接続する

ほとんどのRaspberry Pi用イメージは、初回起動時にネットワーク経由でデバイスにアクセスする方法を提供していますが、NixOSではその方法が見つかりませんでした。そのため、何が起きているか確認するには、一時的にキーボードとHDMIディスプレイをPiに接続する必要があります。

NixOSの起動中にRaspberry Piに接続されたHDMIディスプレイとキーボードの写真

NixOSには完全にネットワーク経由でインストールする方法がないため、初期セットアップ中はキーボードとHDMIディスプレイを接続する必要があります。

このチュートリアルでは、私はTinyPilotを使ってPiを操作しています。これはまさにこのような状況のために私が作ったデバイスです。

Raspberry Pi 4に接続されたTinyPilotの写真Plasmaデスクトップ環境でNixOSを実行中のシステムをTinyPilotで操作しているスクリーンショット

キーボードを行き来する手間を省くため、TinyPilotデバイスを使ってRaspberry PiにNixOSをインストールしました。

このチュートリアルでTinyPilotは必須ではありません。通常のキーボードとHDMIディスプレイでも同様に進められます。

NixOSシステムを起動する

いよいよ本番です。Raspberry Piの電源を入れてください。

すべてがうまくいけば、次のような起動シーケンスが表示されるはずです:

Raspberry Pi 4でのNixOS microSDイメージの起動成功の様子。

NixOSのコマンドプロンプトが表示されれば、起動は完了です:

[nixos@nixos~:]$

起動に失敗した場合は、Piのブートローダーを最新バージョンに更新してから、再度お試しください。

SSHアクセスを有効にする(任意)

Raspberry Piを扱う際は、別のキーボードで入力するよりもSSHの方がはるかに便利だと感じています。

新規インストールしたNixOSシステムでSSHアクセスを有効にするには、2つの方法があります。

方法1: パスワードを設定する

NixOSシステム上で次のコマンドを実行すると、デフォルトのnixosユーザーアカウントにパスワードを設定できます:

passwd

パスワードを設定したら、通常通りNixOSシステムにSSH接続できます:

ssh [email protected]

方法2: SSH鍵を追加する

システムにSSH公開鍵をauthorized keyとして追加する方法もあります。

GitHubでSSH鍵を使って認証している場合、GitHubを利用すると公開SSH鍵をどのデバイスにも簡単にダウンロードできます:

GITHUB_USERNAME='your-github-username' # Replace this.

mkdir -p ~/.ssh && \
  curl "https://github.com/${GITHUB_USERNAME}.keys" > ~/.ssh/authorized_keys

certificate is not valid yetというエラーが表示された場合は、Piがまだシステム時刻を同期中であることを意味します。60秒ほど待ってから、再度コマンドを実行してください。

NixOSシステムに公開SSH鍵を追加できたら、通常通りSSH接続できます:

ssh [email protected]

NixOS設定ファイルを作成する

これでNixOSの中に入りました!

まだ最小限のNixOS環境で何もインストールされていないため、できることはあまりありません。

NixOSの体験をより面白いものにするために、デスクトップGUIといくつかのアプリケーションをインストールしてみましょう。まずは、私のNixOS設定ファイルのサンプルをダウンロードしてください:

curl \
  --show-error \
  --fail \
  https://mtlynch.io/nixos-pi4/configuration.nix \
  | sudo tee /etc/nixos/configuration.nix

この時点でnanovimを使って/etc/nixos/configuration.nixに変更を加えることができます。ファイル上部のhostnameuserpasswordの値を変更するとよいでしょう。

sudo nano /etc/nixos/configuration.nix

まだ設定ファイルを完璧に仕上げる必要はありません。NixOSでは、どのオプションもいつでも気が変われば変更でき、変更の適用は設定ファイルを再度編集するだけで簡単に行えます。

configuration.nixファイルに満足できたら、次のコマンドを実行して設定をシステムに適用し、再起動してください:

sudo nixos-rebuild boot && \
  echo "install complete, rebooting..." && \
  sudo poweroff --reboot

再起動が完了すると、次のような画面が表示されるはずです:

これでPiはGnomeデスクトップ環境でNixOSが動作している状態になりました!

上記のデフォルトのconfiguration.nixファイルを使用した場合、ユーザー名はtempuser、パスワードはsomepassです。

NixOSでいろいろ試してみる

これでNixOSシステムが起動して実行されている状態になりました。

あとは自由にNixOSを探索できますが、新しいシステムで試せる初心者向けの実験を2つ紹介します。

実験1: デスクトップ環境を変更する

上記のconfiguration.nixファイルはGnomeデスクトップ環境を使用することを前提としていますが、別のものが好みかもしれません。Microsoft Windowsのデザインに似たPlasmaというデスクトップマネージャーもあります。

NixOSシステムをGnomeの代わりにPlasmaを使用するように変更するには、テキストエディタでconfiguration.nixファイルを開きます:

sudo nano /etc/nixos/configuration.nix

ファイル内で次の行を探してください:

    displayManager.gdm.enable = true;
    desktopManager.gnome.enable = true;

これらの行を次のように置き換えてください:

    displayManager.sddm.enable = true;
    desktopManager.plasma5.enable = true;

変更を適用するには、ファイルを保存してnanoを終了し、次のコマンドを実行します:

sudo nixos-rebuild boot && sudo reboot

再起動すると、次のようなデスクトップが表示されるはずです:

Plasmaデスクトップ環境でNixOSを実行中のシステムをTinyPilotで操作しているスクリーンショット(ログイン画面)Plasmaデスクトップ環境でNixOSを実行中のシステムをTinyPilotで操作しているスクリーンショット(デスクトップ画面)

NixOSでデスクトップマネージャーをGnomeからPlasmaに切り替えるのは、わずか2行の変更で済みます。

デスクトップ環境全体の変更が、たった2行の変更で完了しました。

実験2: アドホックなソフトウェア環境を作成する

私が見つけた中で最もとっつきやすいNixツールのひとつがnix-shellです。指定した任意のソフトウェアパッケージを使って、その場でソフトウェア環境を作成できます。

nix-shellはシステム上の他の設定には影響を与えないため、他のものを壊す心配なく新しいツールを自由に試すことができます。

数年前に書いた、古いバージョンのNode.jsに依存するプロジェクトに遭遇することがあります。nvmのようなツールでNodeのバージョンを並行してインストールしようとしたこともありますが、結局nvmの使い方や正しい設定方法を思い出すのに20分もかかってしまいます。

nix-shellはパッケージをインストールするための汎用ツールですが、nvmのような言語固有の開発ツールよりも便利だと感じています。

Node.js 18.xを使ったnix-shell環境を作成する方法は次の通りです:

$ nix-shell --packages nodejs-18_x
these paths will be fetched (11.25 MiB download, 52.36 MiB unpacked):
  /nix/store/87kgx3ym4kgmqwaijckqvbfrkzm8ax75-nodejs-18.2.0
copying path '/nix/store/87kgx3ym4kgmqwaijckqvbfrkzm8ax75-nodejs-18.2.0' from 'https://cache.nixos.org'...

[nix-shell:~]$ node --version
v18.2.0

[nix-shell:~]$ npm --version
8.9.0

環境を使い終わったら、Ctrl+Dを押すかexitと入力するだけです。

同じ方法でNode.js 16.xの環境を作成する方法は次の通りです:

$ nix-shell --packages nodejs-16_x
these paths will be fetched (10.77 MiB download, 50.24 MiB unpacked):
  /nix/store/1ba3sqw3rkadg2ksywqc85lq2hvx9fvk-nodejs-16.15.0
copying path '/nix/store/1ba3sqw3rkadg2ksywqc85lq2hvx9fvk-nodejs-16.15.0' from 'https://cache.nixos.org'...

[nix-shell:~]$ node --version
v16.15.0

[nix-shell:~]$ npm --version
8.5.5

トラブルシューティング

最新のPiブートローダーに更新する

NixOSで起動時の問題が発生している場合は、PiのブートローダーとEEPROMを更新する必要があるかもしれません。

最新ビルドのRaspberry Pi OS(別名「Raspbian」)を起動し、次のコマンドを実行して最新のブートローダーをインストールしてください:

sudo raspi-config nonint do_boot_rom E1 && \
  sudo reboot

EEPROMを更新するには、次のコマンドを実行してください:

sudo apt update && \
  sudo apt install --yes rpi-eeprom && \
  sudo rpi-eeprom-update -a && \
  sudo reboot

私がテストしたPi 4デバイスでは、NixOS 23.11のディスクイメージはそのまま起動したため、上記の手順は必要ありませんでした。

付録: 失敗した試み

このチュートリアルを作成する過程で、うまくいかなかった方法が数多くありました。同じ手順を他の人が再試行して時間を無駄にしないよう、ここにまとめておきます。


Alex Groleau氏(NixOSドキュメントチーム)には、このガイドへのご協力とNixOS公式Raspberry Piチュートリアルでのご尽力に感謝します。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。

コメント