在树莓派 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。它简单易用,且支持所有主流操作系统。

方案二:caligula
balenaEtcher 在 NixOS 上不可用,所以如果你正在使用 NixOS,一个不错的替代品是 caligula:
caligula burn \
nixos-sd-image-23.11pre515819.8ecc900b2f69-aarch64-linux.img.zstcaligula 原生支持 Zstandard 压缩格式,因此你无需先解压镜像。

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

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

NixOS 不支持完全通过网络安装,因此在初始设置期间,你需要连接键盘和 HDMI 显示器。
在本教程中,我使用 TinyPilot 来控制我的树莓派,这是一款我为这类场景而打造的设备。


我使用 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此时你可以使用 nano 或 vim 对 /etc/nixos/configuration.nix 进行修改。你可能想改一下文件顶部的 hostname、user 或 password 等值。
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重启后,你应该会看到如下桌面:


在 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 树莓派教程所做的工作。
随机一篇博客
评论
登录后参与讨论