summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamuel Dionne-Riel <samuel@dionne-riel.com>2019-06-01 21:06:03 -0400
committerSamuel Dionne-Riel <samuel@dionne-riel.com>2019-06-16 17:47:30 -0400
commita0aff40f6532d1c805e9f66ca5777b51f8a26505 (patch)
tree11e72b49cf9934995efff5808c4f4f4425b32b34
parent6e9e78b61869bcec02055a0210e8ac569be9f881 (diff)
downloadnixpkgs-a0aff40f6532d1c805e9f66ca5777b51f8a26505.tar
nixpkgs-a0aff40f6532d1c805e9f66ca5777b51f8a26505.tar.gz
nixpkgs-a0aff40f6532d1c805e9f66ca5777b51f8a26505.tar.bz2
nixpkgs-a0aff40f6532d1c805e9f66ca5777b51f8a26505.tar.lz
nixpkgs-a0aff40f6532d1c805e9f66ca5777b51f8a26505.tar.xz
nixpkgs-a0aff40f6532d1c805e9f66ca5777b51f8a26505.tar.zst
nixpkgs-a0aff40f6532d1c805e9f66ca5777b51f8a26505.zip
make-ext4-fs: Allows populating with custom files
This will allow adding /boot files to the rootfs.
-rw-r--r--nixos/lib/make-ext4-fs.nix25
1 files changed, 20 insertions, 5 deletions
diff --git a/nixos/lib/make-ext4-fs.nix b/nixos/lib/make-ext4-fs.nix
index 47c6374c81a..932adcd9796 100644
--- a/nixos/lib/make-ext4-fs.nix
+++ b/nixos/lib/make-ext4-fs.nix
@@ -1,9 +1,14 @@
 # Builds an ext4 image containing a populated /nix/store with the closure
-# of store paths passed in the storePaths parameter. The generated image
-# is sized to only fit its contents, with the expectation that a script
-# resizes the filesystem at boot time.
+# of store paths passed in the storePaths parameter, in addition to the
+# contents of a directory that can be populated with commands. The
+# generated image is sized to only fit its contents, with the expectation
+# that a script resizes the filesystem at boot time.
 { pkgs
+# List of derivations to be included
 , storePaths
+# Shell commands to populate the ./files directory.
+# All files in that directory are copied to the root of the FS.
+, populateImageCommands ? ""
 , volumeLabel
 , uuid ? "44444444-4444-4444-8888-888888888888"
 , e2fsprogs
@@ -23,13 +28,17 @@ pkgs.stdenv.mkDerivation {
 
   buildCommand =
     ''
+      (
+      mkdir -p ./files
+      ${populateImageCommands}
+      )
       # Add the closures of the top-level store objects.
       storePaths=$(cat ${sdClosureInfo}/store-paths)
 
       # Make a crude approximation of the size of the target image.
       # If the script starts failing, increase the fudge factors here.
-      numInodes=$(find $storePaths | wc -l)
-      numDataBlocks=$(du -c -B 4096 --apparent-size $storePaths | awk '$2 == "total" { print int($1 * 1.03) }')
+      numInodes=$(find $storePaths ./files | wc -l)
+      numDataBlocks=$(du -s -c -B 4096 --apparent-size $storePaths ./files | tail -1 | awk '{ print int($1 * 1.03) }')
       bytes=$((2 * 4096 * $numInodes + 4096 * $numDataBlocks))
       echo "Creating an EXT4 image of $bytes bytes (numInodes=$numInodes, numDataBlocks=$numDataBlocks)"
 
@@ -47,6 +56,12 @@ pkgs.stdenv.mkDerivation {
       echo "copying store paths to image..."
       cptofs -t ext4 -i $out $storePaths /nix/store/
 
+      (
+      echo "copying files to image..."
+      cd ./files
+      cptofs -t ext4 -i $out ./* /
+      )
+
       # I have ended up with corrupted images sometimes, I suspect that happens when the build machine's disk gets full during the build.
       if ! fsck.ext4 -n -f $out; then
         echo "--- Fsck failed for EXT4 image of $bytes bytes (numInodes=$numInodes, numDataBlocks=$numDataBlocks) ---"