From 6fec0974dcc3a6a839e6eff42853611a7d70f3d9 Mon Sep 17 00:00:00 2001 From: Tanel Dettenborn Date: Wed, 25 Mar 2026 10:17:09 +0100 Subject: [PATCH] nixos/sd-image: add preBuildCommands option Allow running shell commands after the root filesystem image has been prepared but before the final SD image is assembled. This is useful for adjusting the rootfs, such as resizing it to a fixed size or injecting additional files, without having to override the entire build derivation. Signed-off-by: Tanel Dettenborn --- nixos/modules/installer/sd-card/sd-image.nix | 29 ++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/nixos/modules/installer/sd-card/sd-image.nix b/nixos/modules/installer/sd-card/sd-image.nix index 223961228ba5..237a96f4e3c6 100644 --- a/nixos/modules/installer/sd-card/sd-image.nix +++ b/nixos/modules/installer/sd-card/sd-image.nix @@ -179,6 +179,33 @@ in ''; }; + preBuildCommands = mkOption { + type = types.lines; + example = literalExpression '' + ''' + if [ ! -w "$root_fs" ]; then + cp --no-preserve=mode "$root_fs" ./root-fs.img + root_fs=./root-fs.img + fi + resize2fs $root_fs 15G + ''' + ''; + default = ""; + description = '' + Shell commands to run after the root filesystem image has been + prepared, but before the final SD image is assembled. + + The path to the root filesystem image is available in the + {var}`root_fs` shell variable. This hook can be used to modify + the rootfs, for example to resize it or inject additional files. + + Note that when {option}`sdImage.compressImage` is disabled, + {var}`root_fs` points to a read-only store path. To modify it, + first copy it to a writable location and update {var}`root_fs` + to point to the copy. + ''; + }; + postBuildCommands = mkOption { type = types.lines; example = literalExpression "'' dd if=\${pkgs.myBootLoader}/SPL of=$img bs=1024 seek=1 conv=notrunc ''"; @@ -289,6 +316,8 @@ in zstd -d --no-progress "${config.sdImage.rootFilesystemImage}" -o $root_fs ''} + ${config.sdImage.preBuildCommands} + # Gap in front of the first partition, in MiB gap=${toString config.sdImage.firmwarePartitionOffset}