Can't build NixOS image - $NIX_BUILD_TOP permission denied

Problem
I’m trying to build a NixOS image but the build fails with permission denied error.

Details
My machine is running Ubuntu 20.04, aarch64-linux. Nix is installed in multi-user mode.

Image definition:

The build command:
nix-build '<nixpkgs/nixos>' -A config.system.build.sdImage -I nixos-config=./sd-image-aarch64.nix

Output:

Device                                                                                                                                                                        Boot Start     End Sectors  Size Id Type
/nix/store/ws93y7zjx9wdafdz5frxbkqwr9c1lii6-nixos-sd-image-21.05pre288832.4d8dd0afd2d-aarch64-linux.img/sd-image/nixos-sd-image-21.05pre288832.4d8dd0afd2d-aarch64-linux.img1      16384   77823   61440   30M  b W95
/nix/store/ws93y7zjx9wdafdz5frxbkqwr9c1lii6-nixos-sd-image-21.05pre288832.4d8dd0afd2d-aarch64-linux.img/sd-image/nixos-sd-image-21.05pre288832.4d8dd0afd2d-aarch64-linux.img2 *    77824 5391655 5313832  2.5G 83 Linu

The partition table has been altered.
Syncing disks.
5313832+0 records in
5313832+0 records out
2720681984 bytes (2.7 GB, 2.5 GiB) copied, 10.0503 s, 271 MB/s
mkfs.fat 4.1 (2017-01-24)
cp: cannot create regular file '/build/firmware/bootcode.bin': Permission denied
cp: cannot create regular file '/build/firmware/fixup.dat': Permission denied
cp: cannot create regular file '/build/firmware/fixup4.dat': Permission denied
cp: cannot create regular file '/build/firmware/fixup4cd.dat': Permission denied
cp: cannot create regular file '/build/firmware/fixup4db.dat': Permission denied
cp: cannot create regular file '/build/firmware/fixup4x.dat': Permission denied
cp: cannot create regular file '/build/firmware/fixup_cd.dat': Permission denied
cp: cannot create regular file '/build/firmware/fixup_db.dat': Permission denied
cp: cannot create regular file '/build/firmware/fixup_x.dat': Permission denied
cp: cannot create regular file '/build/firmware/start.elf': Permission denied
cp: cannot create regular file '/build/firmware/start4.elf': Permission denied
cp: cannot create regular file '/build/firmware/start4cd.elf': Permission denied
cp: cannot create regular file '/build/firmware/start4db.elf': Permission denied
cp: cannot create regular file '/build/firmware/start4x.elf': Permission denied
cp: cannot create regular file '/build/firmware/start_cd.elf': Permission denied
cp: cannot create regular file '/build/firmware/start_db.elf': Permission denied
cp: cannot create regular file '/build/firmware/start_x.elf': Permission denied
builder for '/nix/store/c13n2bcyfgv9y4g9309aqwfi5rsx0n8p-nixos-sd-image-21.05pre288832.4d8dd0afd2d-aarch64-linux.img.drv' failed with exit code 1
error: build of '/nix/store/c13n2bcyfgv9y4g9309aqwfi5rsx0n8p-nixos-sd-image-21.05pre288832.4d8dd0afd2d-aarch64-linux.img.drv' failed

What I tried so far
The error must be caused by this line

I tried to define sandbox-build-dir in nix.conf but it fails with the same error.
When I replaced $NIX_BUILD_TOP/firmware/ in this line to just firmware or ./firmware or /home/user/firmware it says that it’s not a directory.

Any advise on how to deal with the error is hugely appreciated.

Answering my own question for posterity. The problem was in image configuration file which repeated populateFirmwareCommands from the sd-image-aarch64.nix. After removing the duplicate the build succeeded.

2 Likes