NixOS on ARM/Raspberry Pi
The Raspberry Pi family of devices is a series of single-board computers made by the Raspberry Pi Foundation. They are all based on Broadcom System-on-a-chip (SOCs).
Status
Only the Raspberry Pi 3 Family is supported upstream, with the AArch64 effort.
The Raspberry Pi 4B is not supported by NixOS, though a beta-quality disk image specific for it is produced. It will be supported the same as the Pi 3 family once the mainline kernel and mainline U-Boot boot fine through the generic mainline image.
Other Raspberry Pis (0, 1, and 2) are part of diverse community porting efforts to ARMv6 and ARMv7.
The Linux kernel in use, except for the Raspberry Pi 1 family, is the mainline Linux kernel, and not the Raspberry Pi Foundation's fork. This could reduce compatibility with some add-on boards or third-party libraries[expanded explanation needed].
The following table is intended to be updated by the NixOS contributors with the current status of the boards. For a list of products, see the Products Archive.
Board name | Architecture | Support |
---|---|---|
Raspberry Pi 1 | ||
Raspberry Pi 1 Model B | armv6 | C |
Raspberry Pi 1 Model A+ | C* | |
Raspberry Pi 1 Model B+ | C | |
Raspberry Pi Zero | C* | |
Raspberry Pi Zero W | C | |
Raspberry Pi 2 | ||
Raspberry Pi 2 Model B | armv7 | C |
Raspberry Pi 3 | ||
Raspberry Pi 3 Model B | AArch64 + armv7 |
YES |
Raspberry Pi 3 Model B+ | YES | |
Raspberry Pi 3 Model A+ | ? | |
Raspberry Pi 4 | ||
Raspberry Pi 4 Model B | AArch64 + armv7 |
YES* (GitHub issue) |
Support
- YES: Supported architecture by Nixpkgs downstream and tested to be working.
- YES*: Available in Nixpkgs downstream but experimental.
- C: Community supported, and tested to be working.
- C*: Community supported, unverified but should be working.
- ? : Unverified, unknown if it will work.
The Raspberry Pi 3 Family is only supported as AArch64. Use as armv7 is community supported.
Tutorials
Board-specific installation notes
First follow the generic installation steps to get the installer image and install using the installation and configuration steps.
Raspberry Pi (1)
The ARMv6 image boots out-of-the-box.
Raspberry Pi 2
The ARMv7 image should boot out-of-the-box, though the author hasn't personally tested this.
Raspberry Pi 3 / 3B+
Raspberry Pi 3#Board-specific installation notes
Raspberry Pi 4B
Serial console
Your configuration.nix
will need to add console=ttyS1,115200n8
to the boot.kernelParams
configuration to use the serial console.
/etc/nixos/configuration.nix
{ config, pkgs, lib, ... }:
{
boot.kernelParams = [
"console=ttyS1,115200n8"
];
}
If the Raspberry Pi downstream kernel is used the serial interface is named serial0
instead.
Binary Cache
Depending on the architecture used, binary caches availability varies. Binary caches instructions are on the main NixOS on ARM page. The following table describes the architectures supported by each board.
Raspberry Pi 1 | armv6 |
---|---|
Raspberry Pi 2 | armv7 |
Raspberry Pi 3 | armv7 |
AArch64 | |
Raspberry Pi 4 | armv7 |
AArch64 |
Notes about the boot process
The custom bootloader, part of the Raspberry Pi firmware, is abstracted away for NixOS by making it boot U-Boot instead.
U-Boot gives us the ability to provide a generation selection menu during the boot process, in addition to storing the boot files on the main partition, rather than on the firmware partition.
Raspberry Pi (all versions)
USB keyboards and HDMI displays should work, though some issues have been reported (see Troubleshooting below).
Using the 3.3v serial port via the pin headers (exact location depends on hardware version) will get u-boot output and, when configured, a Linux kernel console.
Troubleshooting
Power issues
Especially with the newer power-hungry Raspberry Pi families (3, 4), it is important to have a sufficient enough power supply or weirdness may happen. Weirdness may include:
- Lightning bolt on HDMI output "breaking" the display.
- Screen switching back to u-boot text
- Fixable temporarily when power is sufficient by switching VT (alt+F2 / alt+F1)
- Random hangs
This problem is a hard problem. It is caused by the Raspberry Pi warning about power issues, but the current drivers (as of
Linux 4.14) have a hard time dealing with it properly. If the power supply is rated properly AND the cable is not incurring too much power losses, it may be required to disable the lightning bolt indicator so the display driver isn't messed up.[1] The lightning bolt indicator can be disabled by adding the line avoid_warnings=1
in config.txt[2]
Additional Troubleshooting
Additional troubleshooting information may be found at elinux.org.