Installing NixOS on Raspberry Pi 4

Michael Lynch

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

Nixは、ソフトウェア環境をコードで定義できるツールです。Nixにはいくつかの構成要素がありますが、なかでも私が特に興味を持ったのはNixOSです。Nixの仕組みを使って、OS全体の設定をプレーンテキストファイルで記述できます。

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

そこで、Raspberry Pi 4にNixOSをインストールするための、完全で動作確認済みの手順をここで紹介します。私自身もNixOS初心者ですので、このガイドはNix初心者向けに書いています。ただし、Raspberry PiとLinuxの基本的な操作についてはご存じであることを前提としています。

必要なもの

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

  • メモリ2GB以上のRaspberry Pi 4
  • 8GB以上のmicroSDカード
  • microSDカードリーダー/ライター
  • microSDカードに書き込むための別のコンピューター

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

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

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

私は最近、より新しいビルド(2025年1月19日にビルドされたnixos-image-sd-card-25.05beta741800.78886a72ed11)でも同じ手順を試しましたが、インストールは失敗しました。その後のnixos-buildの段階で、Pi 4の2GBメモリを使い切ってしまったのです。

NixOSのmicroSDイメージを展開する

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

イメージを展開するには、お使いの環境向けの最新版Zstandardツールをダウンロードしてください。

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

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

展開が完了すると、nixos-sd-image-23.11pre515819.8ecc900b2f69-aarch64-linux.imgというファイルが生成されます。

microSDカードにイメージを書き込む

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

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

方法1: balenaEtcher

どの書き込みツールを使えばよいかわからない場合は、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の起動中にHDMIディスプレイとキーボードを接続したRaspberry Piの写真

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

パスワードを設定したら、通常どおりSSHで接続できます。

ssh [email protected]

方法2: SSH鍵を追加する

お手持ちのSSH公開鍵を、システムのauthorized keyとして追加する方法もあります。

GitHubでSSH鍵を使って認証している場合は、GitHubが提供する便利な方法で、どのデバイスにも公開鍵をダウンロードできます。

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 [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のディスクイメージはそのまま問題なく起動したため、上記の手順は必要ありませんでした。

付録: 失敗した試み

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


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

原文は Michael Lynch により に公開されました。

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