I found a configuration that seem to work for me, but I haven’t really understood why yet:
{
description = "Base system for raspberry pi 4";
inputs = {
nixpkgs.url = "nixpkgs/nixos-unstable";
nixos-generators = {
url = "github:nix-community/nixos-generators";
inputs.nixpkgs.follows = "nixpkgs";
};
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
};
outputs = { self, nixpkgs, nixos-generators, nixos-hardware, ... }:
{
nixosModules = {
system = {
system.stateVersion = "23.11";
};
users = {
users.users.admin = {
password = "admin";
isNormalUser = true;
extraGroups = [ "wheel" ];
};
};
cross = {
nixpkgs.config.allowUnsupportedSystem = true;
nixpkgs.hostPlatform.system = "aarch64-linux";
nixpkgs.buildPlatform.system = "x86_64-linux";
};
};
packages.aarch64-linux = {
sdcard = nixos-generators.nixosGenerate {
system = "aarch64-linux";
format = "sd-aarch64";
modules = [
self.nixosModules.system
self.nixosModules.users
#self.nixosModules.cross # disabled, causes 'aarch64-unknown-linux-gnu-gcc: error: unrecognized command-line option '-m64'' build errors
#nixos-hardware.nixosModules.raspberry-pi-4 # disable, causes 'modprobe: FATAL: Module sun4i-drm not found in directory /nix/store/[...]-linux-6.1.21-1.20230405-modules/lib/modules/6.1.21' build errors
];
};
};
};
}
So first what I learned: I used nix build
and that does not take into account any configuration in nixosConfigurations
. I found that out by reading Flakes - NixOS Wiki more closely. I also looked at what MyNixOS does, and it seems to use nixosModules
to avoid duplicating code, if multiple outputs are used, I tried incorporating that idea, without requiring multiple files, because that makes it more difficult to follow IMO. And that seems to work now.
I disabled self.nixosModules.cross
because it caused:
error: builder for '/nix/store/pss4gpq9jkbvj1k6d69gyq91h2ym2a8h-libhugetlbfs-aarch64-unknown-linux-gnu-2.23.drv' failed with exit code 2;
last 10 log lines:
> make: *** [Makefile:313: obj64/sys-elf_x86_64.o] Error 1
> make: *** Waiting for unfinished jobs....
> make: *** [Makefile:303: obj64/elflink.o] Error 1
> CC64 obj64/init.o
> aarch64-unknown-linux-gnu-gcc: error: unrecognized command-line option '-m64'
> make: *** [Makefile:303: obj64/hugeutils.o] Error 1
> aarch64-unknown-linux-gnu-gcc: error: unrecognized command-line option '-m64'
> make: *** [Makefile:303: obj64/version.o] Error 1
> aarch64-unknown-linux-gnu-gcc: error: unrecognized command-line option '-m64'
> make: *** [Makefile:303: obj64/init.o] Error 1
For full logs, run 'nix log /nix/store/pss4gpq9jkbvj1k6d69gyq91h2ym2a8h-libhugetlbfs-aarch64-unknown-linux-gnu-2.23.drv'.
error: 1 dependencies of derivation '/nix/store/iy7x7zyalcpibxzvffzsyx2f9pax1dsd-nvme-cli-aarch64-unknown-linux-gnu-2.6.drv' failed to build
error (ignored): error: cannot unlink '/tmp/nix-build-zip-aarch64-unknown-linux-gnu-3.0.drv-2': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-unzip-aarch64-unknown-linux-gnu-6.0.drv-1': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-libewf-aarch64-unknown-linux-gnu-20201230.drv-4/libewf-20201230': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-tcpdump-aarch64-unknown-linux-gnu-4.99.4.drv-2': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-efivar-aarch64-unknown-linux-gnu-38.drv-0/source/src': Directory not empty
error: 1 dependencies of derivation '/nix/store/6hnm09ymf3rznjziv8gi2dr2w88jbbrx-system-path.drv' failed to build
error (ignored): error: cannot unlink '/tmp/nix-build-xfsprogs-aarch64-unknown-linux-gnu-6.4.0.drv-1/xfsprogs-6.4.0': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-reiserfsprogs-aarch64-unknown-linux-gnu-3.6.27.drv-2/reiserfsprogs-3.6.27': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-linux-config-aarch64-unknown-linux-gnu-6.1.61.drv-1/linux-6.1.61/arch': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-sysstat-aarch64-unknown-linux-gnu-12.7.4.drv-3': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-rt5677-firmware.drv-3/source/build/linux/drivers': Directory not empty
error: 1 dependencies of derivation '/nix/store/mgg0byx6psphr055z21q8zq7vwyh3ixc-nixos-system-nixos-23.11.20231104.85f1ba3.drv' failed to build
error: 1 dependencies of derivation '/nix/store/0hg18h4cal82fhh3mzca00znlbgpcc47-ext4-fs.img.zst-aarch64-unknown-linux-gnu.drv' failed to build
error (ignored): error: cannot unlink '/tmp/nix-build-uboot-rpi_4_defconfig-aarch64-unknown-linux-gnu-2023.07.02.drv-2': Directory not empty
error (ignored): error: cannot unlink '/tmp/nix-build-uboot-rpi_3_defconfig-aarch64-unknown-linux-gnu-2023.07.02.drv-2': Directory not empty
error: 1 dependencies of derivation '/nix/store/52qv3wgrp6s53bddilgp6y8bh0g1vqhz-nixos-sd-image-23.11.20231104.85f1ba3-aarch64-linux.img-aarch64-unknown-linux-gnu.drv' failed to build
I got this from NixOS on ARM - NixOS Wiki where it states that this needs to be set for building images in flakes. It also sort of makes sense to me, because I am building on a x86_64 for aarch64. Not sure why it sets -m64
on a aarch64
compiler and where that happens.
With nixos-hardware.nixosModules.raspberry-pi-4
used, I get errors when building the kernel:
error: builder for '/nix/store/7fa15bggzq5fvl54h70pimr6zzpcr4q8-linux-6.1.21-1.20230405-modules-shrunk.drv' failed with exit code 1;
last 10 log lines:
> copying dependency: /nix/store/l5z0h4z1g7lgsbai5bn8a1b4553r7jcp-linux-6.1.21-1.20230405-modules/lib/modules/6.1.21/kernel/drivers/message/fusion/mptscsih.ko.xz
> copying dependency: /nix/store/l5z0h4z1g7lgsbai5bn8a1b4553r7jcp-linux-6.1.21-1.20230405-modules/lib/modules/6.1.21/kernel/drivers/message/fusion/mptspi.ko.xz
> root module: vmxnet3
> copying dependency: /nix/store/l5z0h4z1g7lgsbai5bn8a1b4553r7jcp-linux-6.1.21-1.20230405-modules/lib/modules/6.1.21/kernel/drivers/net/vmxnet3/vmxnet3.ko.xz
> root module: vsock
> copying dependency: /nix/store/l5z0h4z1g7lgsbai5bn8a1b4553r7jcp-linux-6.1.21-1.20230405-modules/lib/modules/6.1.21/kernel/net/vmw_vsock/vsock.ko.xz
> root module: simplefb
> builtin dependency: simplefb
> root module: sun4i-drm
> modprobe: FATAL: Module sun4i-drm not found in directory /nix/store/l5z0h4z1g7lgsbai5bn8a1b4553r7jcp-linux-6.1.21-1.20230405-modules/lib/modules/6.1.21
For full logs, run 'nix log /nix/store/7fa15bggzq5fvl54h70pimr6zzpcr4q8-linux-6.1.21-1.20230405-modules-shrunk.drv'.
error: 1 dependencies of derivation '/nix/store/zx90np1pqymr0fyygwnm3zhydqkqja32-stage-1-init.sh.drv' failed to build
error: 1 dependencies of derivation '/nix/store/76yzlf0s9inmqz7dz9qh4b5c6a9m70ia-initrd-linux-6.1.21-1.20230405.drv' failed to build
error: 1 dependencies of derivation '/nix/store/kkg332wd4cn5c0g5i6a2zl18j6y98i1w-nixos-system-nixos-23.11.20231104.85f1ba3.drv' failed to build
error: 1 dependencies of derivation '/nix/store/z7a752vzvg9b4l89hs40q20476ab5ngc-ext4-fs.img.zst.drv' failed to build
error: 1 dependencies of derivation '/nix/store/0bskv3ylj6nglisdj4cn8ymivi0ns82m-nixos-sd-image-23.11.20231104.85f1ba3-aarch64-linux.img.drv' failed to build
I guess it tries to install a module, which was not build, because raspberry pi 4 doesn’t need it. Why does this happen?
Update: I think I figured out. It seems like the sd-aarch64
format imports this config: https://github.com/NixOS/nixpkgs/blob/43a394b99a03d5ce665c8f7c051491ad2d7479c5/nixos/modules/installer/sd-card/sd-image-aarch64.nix, which contains a bunch of raspberry pi specfic stuff, that make it boot there. I would have expected that to be defined in nixos-hardware.nixosModules.raspberry-pi-4
instead, because the sd-aarch64
image format will not work on any other aarch64 system.
Anyway, removing the those two lines and the created image seems to boot. And now I just want to understand why… 
Also why do I get the warning about system.stateVersion
, and need to set it, I haven’t seen any other examples I peeked at doing that.