Installing NixOS on Raspberry Pi 4

Michael Lynch

在树莓派 4 上安装 NixOS

原文由 Michael Lynch 发布,订阅该博客

Nix 是一款能让你通过代码定义软件环境的工具。Nix 包含多个组件,其中最让我感兴趣的是 NixOS,它能让你使用 Nix 工具链通过纯文本文件来定义整个操作系统的配置。

我最近才开始尝试使用 Nix,还有大量知识需要学习。我最早尝试的事情之一就是在树莓派上安装 NixOS,但最初的几次尝试都失败了。我能找到的每一篇 NixOS 树莓派教程要么不完整,要么已经过时。

在这里,我为你提供一份完整且可行的在树莓派 4 上安装 NixOS 的指南。我自己也是 NixOS 新手,所以这份指南面向 Nix 初学者,但默认你已对树莓派和 Linux 有基本的了解。

准备工作

要完成本教程,你需要:

  • 一台内存至少 2GB 的树莓派 4
  • 一张容量至少 8GB 的 microSD 卡
  • 一个 microSD 读卡器
  • 一台用于烧录 microSD 卡的备用电脑

下载 NixOS microSD 镜像

首先,通过下方链接下载 NixOS microSD 镜像:

你可以在 Nix 的构建服务器上查看带绿色对勾的最新构建来找到更新的镜像。

我最近曾尝试使用一个更新的构建版本(nixos-image-sd-card-25.05beta741800.78886a72ed11,构建于 2025-01-19)来完成这一流程,但安装失败了。后面的 nixos-build 步骤耗尽了我那台 2GB 内存的树莓派 4 的内存。

解压 NixOS microSD 镜像

NixOS 团队使用一种名为 Zstandard 的压缩格式来压缩 microSD 镜像,这是来自 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 文件而非 .img.zst 文件,因为大多数烧录工具无法识别 Zstandard 格式。

方案一:balenaEtcher

如果你不确定该用哪款 microSD 烧录工具,我推荐 balenaEtcher。它简单易用,且支持所有主流操作系统。

balenaEtcher 截图

方案二:caligula

balenaEtcher 在 NixOS 上不可用,所以如果你正在使用 NixOS,一个不错的替代品是 caligula

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

caligula 原生支持 Zstandard 压缩格式,因此你无需先解压镜像。

将 microSD 卡插入树莓派

烧录完成后,将 microSD 卡插入树莓派的 microSD 卡槽:

microSD 卡已插入树莓派 microSD 卡槽的照片

将已烧录的 microSD 卡插入树莓派的 microSD 卡槽。

为树莓派连接显示器和键盘

大多数树莓派镜像都支持在首次启动时通过网络访问设备。我还没有找到在 NixOS 上实现这一点的方法,因此你需要临时为树莓派连接键盘和 HDMI 显示器,才能看到发生了什么。

树莓派连接着 HDMI 显示器和键盘,正在启动 NixOS 的照片

NixOS 不支持完全通过网络安装,因此在初始设置期间,你需要连接键盘和 HDMI 显示器。

在本教程中,我使用 TinyPilot 来控制我的树莓派,这是一款我为这类场景而打造的设备。

TinyPilot 连接到树莓派 4 的照片通过 TinyPilot 控制运行 Plasma 桌面环境的 NixOS 系统的截图

我使用 TinyPilot 设备在树莓派上安装了 NixOS,这样就不用在不同键盘之间来回切换了。

完成本教程并不一定需要 TinyPilot,使用普通的键盘和 HDMI 显示器也完全可以。

启动 NixOS 系统

激动人心的时刻到了。给你的树莓派通电。

如果一切顺利,你应该会看到如下的启动过程:

NixOS microSD 镜像在树莓派 4 上成功启动。

当你看到 NixOS 命令提示符时,即表示启动完成:

[nixos@nixos~:]$

如果启动失败,请尝试将树莓派的 bootloader 更新到最新版本,然后重试。

启用 SSH 访问(可选)

在使用树莓派时,我发现通过 SSH 操作要比在另一块键盘上敲命令方便得多。

在全新的 NixOS 系统上,有两种启用 SSH 访问的方式。

方案一:设置密码

在 NixOS 系统上,你可以通过运行以下命令为默认的 nixos 用户设置密码:

passwd

设置密码后,你就可以正常通过 SSH 连接到 NixOS 系统了:

ssh [email protected]

方案二:添加 SSH 密钥

你也可以将自己的 SSH 公钥添加为系统中的授权密钥。

如果你使用 SSH 密钥登录 GitHub,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 的错误,说明你的树莓派仍在同步系统时间。请等待 60 秒后重试该命令。

将 SSH 公钥添加到 NixOS 系统后,你就可以像往常一样通过 SSH 登录了:

ssh [email protected]

编写 NixOS 配置文件

现在你已经进入 NixOS 了!

目前还做不了太多事情,因为这是一个最小化的 NixOS 环境,几乎什么都没装。

为了让 NixOS 体验更丰富,我们来安装一个桌面图形界面和一些应用。首先,请下载我的 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

重启完成后,你应该会看到如下界面:

你的树莓派现在已经运行起带有 Gnome 桌面环境的 NixOS 了!

如果你使用的是上面默认的 configuration.nix 文件,那么用户名是 tempuser,密码是 somepass

体验 NixOS

至此,你的 NixOS 系统已经成功运行起来了。

你可以随心探索 NixOS,不过我也为你在新系统上准备了几个适合新手的小实验。

实验一:更换桌面环境

上面的 configuration.nix 文件默认使用 Gnome 桌面环境,但你或许更喜欢另一种。还有一款名为 Plasma 的桌面环境,其设计与 Microsoft Windows 颇为相似。

要将 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

重启后,你应该会看到如下桌面:

通过 TinyPilot 控制运行 Plasma 桌面环境的 NixOS 系统在登录界面的截图通过 TinyPilot 控制运行 Plasma 桌面环境的 NixOS 系统在桌面界面的截图

在 NixOS 中,将桌面环境从 Gnome 切换到 Plasma 只需改两行配置。

改变整个桌面环境,就这么简单,只改了两行。

实验二:创建临时软件环境

我发现最易上手的 Nix 工具之一是 nix-shell。它可以让你即时创建包含任意指定软件包的软件环境。

nix-shell 不会影响系统上的任何其他配置,因此你可以放心尝试新工具,而不用担心破坏其他东西。

我有时会遇到几年前写的、依赖旧版 Node.js 的项目。我曾尝试过用 nvm 这样的工具来并排安装多个 Node 版本,但每次都要花 20 分钟去回忆如何使用和正确配置 nvm

尽管 nix-shell 是一个通用的软件包安装工具,我却发现它甚至比 nvm 这类特定语言的开发工具还要方便。

下面是如何使用 nix-shell 创建一个包含 Node.js 18.x 的环境:

$ 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

故障排查

升级到最新的树莓派 bootloader

如果你在启动 NixOS 时遇到问题,可能需要更新树莓派的 bootloader 和 EEPROM

启动一个新版的 Raspberry Pi OS(即 Raspbian),然后运行以下命令来安装最新的 bootloader:

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

我测试的树莓派 4 设备可以直接启动 NixOS 23.11 的磁盘镜像,因此我无需执行上述步骤。

附录:失败的尝试

在编写本教程的过程中,我尝试了许多行不通的方法。为了帮大家节省时间,避免重复踩坑,我将它们整理在了这里。


感谢来自 NixOS 文档团队的 Alex Groleau 对本指南的帮助,以及他为官方 NixOS 树莓派教程所做的工作。

本文章由 muse-spark-1.2-contributor 进行翻译

评论