I’m following this tutorial to build an iso image:
https://pablo.tools/blog/computers/nixos-generate-raspberry-images
, but the final image doesn’t have an /etc/nixos/configuration.nix
Is there an option to copy this with it, as well?
I’m following this tutorial to build an iso image:
https://pablo.tools/blog/computers/nixos-generate-raspberry-images
, but the final image doesn’t have an /etc/nixos/configuration.nix
Is there an option to copy this with it, as well?
ok, so I can just include this?
system.copySystemConfiguration = true;
I ran into the same issue recently. I did not have much luck with copySystemConfiguration.
I was able to find in in sd-image.nix an option for populateRootCommands
. There is a default for this in the raspberry pi configuration and if you end up overwriting it you’ll probably want to include what is in the default as well. I’m not sure how important it is, though.
I now use something like the following to copy in the configuration nix along with a root ssh key:
sdImage.populateRootCommands = ''
# Copy in ssh keys
mkdir -p ./files/etc/ssh/
cp ./config/secrets/${targetName}.pub ./files/etc/ssh/ssh_host_ed25519_key.pub
cp ./config/secrets/${targetName} ./files/etc/ssh/ssh_host_ed25519_key
# Copy in configuration
mkdir -p ./files/etc/nixos/
cp ./config/configuration.nix ./files/etc/nixos/
# Retain defaults for raspberry pi
mkdir -p ./files/boot
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
'';
Does this take imports into consideration?
I’m not exactly sure what you mean. The example I used above is just part of a standard nix config section, which typically also has imports, etc.
I mean, my configuration.nix is basically just imports, like
imports =
[
./derivation.fundamental.nix
, so basically, I would probably need to copy in all of them. I feel it’s a bit weird, but I guess that’s what needs to be done;).
Thanks.
That didn’t work;)
cp: cannot stat './config/configuration.nix': No such file or directory
error: builder for '/nix/store/aixf4yfdr93zzk03xb5icxq7q7saa8ay-ext4-fs.img.zst.drv' failed with exit code 1;
last 1 log lines:
> cp: cannot stat './config/configuration.nix': No such file or directory
For full logs, run 'nix log /nix/store/aixf4yfdr93zzk03xb5icxq7q7saa8ay-ext4-fs.img.zst.drv'.
error: 1 dependencies of derivation '/nix/store/ak910xwmiakwcadqgx2j5z7gjm0r7khh-nixos-sd-image-23.05.3580.5d017a8822e0-aarch64-linux.img.drv' failed to build
I tried removing the “config” part of the path, but where is this supposed to be?
In the example you shared (pablo.tools blogpost) there is a sample configuration file rpi4-image.nix
that contains a populateRootCommands section. You’d simply need to expand this to include copy commands for each file/folder you want to include.
The FROM side of the copy is wherever the config files live on your computer you are building from. The TO side of the copy is ./file/...
, where … is the path you want to where you want the file to be in the resulting image (e.g. ./file/etc/nixos/configuration.nix
).
If you need more help it would be good to share more detail of your set up, including file structure, commands you are using to build, etc.
Right, I will do that, but what is it relative to?
Here’s my addition to rpi-image.nix
77 populateRootCommands = ''
78 # Copy in configuration
79 mkdir -p ./files/etc/nixos/
80 cp ./config/pi400.configuration.nix ./files/etc/nixos/configuration.nix
81 cp ./config/derivation.fundamental.nix ./files/etc/nixos/
82 cp ./config/hydra.base.nix ./files/etc/nixos/
83 cp ./config/hydra.locale.nix ./files/etc/nixos/
84 cp ./config/hydra.network.nix ./files/etc/nixos/
85 cp ./config/hydra.xorg.lightdm.kodi.nix ./files/etc/nixos/
86 cp ./config/hydra.user.nix ./files/etc/nixos/
87
88 mkdir -p ./files/boot
89 ${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
90 '';
91 };
I even tried absolute path, like “/tmp/foo.nix” and just “./pi400.configuration.nix”
Here’s the build directory
quasar in nixos-raspi4-template שׂmain [!?] 6s
BASHY $ ls -lh
total 56K
-rw-r--r-- 1 b0ef users 195 Dec 1 20:28 base-config.nix
-rwxr-xr-x 1 b0ef users 92 Dec 1 20:28 build.sh
-rw-r--r-- 1 b0ef users 390 Dec 10 13:57 derivation.fundamental.nix
-rw-r--r-- 1 b0ef users 138 Dec 16 13:53 hydra.base.nix
-rw-r--r-- 1 b0ef users 90 Dec 10 14:21 hydra.locale.nix
-rw-r--r-- 1 b0ef users 298 Jan 17 23:07 hydra.network.nix
-rw-r--r-- 1 b0ef users 1.7K Dec 16 15:06 hydra.user.nix
-rw-r--r-- 1 b0ef users 615 Dec 16 15:09 hydra.xorg.lightdm.kodi.nix
-rw-r--r-- 1 b0ef users 1.1K Dec 1 20:28 LICENSE
-rw-r--r-- 1 b0ef users 355 Jan 17 23:01 pi400.configuration.nix
-rw-r--r-- 1 b0ef users 487 Dec 1 20:28 README.md
lrwxrwxrwx 1 b0ef users 100 Dec 15 22:54 result -> /nix/store/1dspk61aqdi0xdmkqbi04ydfsrriynwm-nixos-sd-image-23.05.3580.5d017a8822e0-aarch64-linux.img
lrwxrwxrwx 1 b0ef users 100 Dec 6 21:40 result-wtf -> /nix/store/mqg5v1fch4z4vfwfy2620b6p3yf4arbw-nixos-sd-image-23.05.3580.5d017a8822e0-aarch64-linux.img
-rw-r--r-- 1 b0ef users 3.4K Jan 17 23:31 rpi4-image.nix
I have the pi400.configuration.nix in the root of the build directory, so I would assume it would be “./pi400.configuration.nix”.
How come you pasted “./config/”? What is that relative to?
Relative to the current directly. I have my configs in a folder called config. In your case, looks like it’s a flat directory. So it should look like:
cp ./pi400.configuration.nix ./files/etc/nixos/configuration.nix
This is like totally bananas.
Here is an strace where it clearly reads the .nix file, as part of building it, but then it has problems copying it.
https://jumpshare.com/s/Doj4viBIkKfEmwYHkuuw
I’ve tried all sorts of renames and all sorts of subdirectories, but it’s not reading anything.