about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nixos/lib/make-disk-image.nix18
1 files changed, 17 insertions, 1 deletions
diff --git a/nixos/lib/make-disk-image.nix b/nixos/lib/make-disk-image.nix
index db53bb98ee4ef..e18c82a65bfe7 100644
--- a/nixos/lib/make-disk-image.nix
+++ b/nixos/lib/make-disk-image.nix
@@ -162,6 +162,12 @@ To solve this, you can run `fdisk -l $image` and generate `dd if=$image of=$imag
   # `installBootLoader` and `configFile`.
   onlyNixStore ? false
 
+, # Ensure that no "new" Nix store is written to the root of the image
+  # by symlinking the host Nix store.
+  # This saves a lot of disk space if you don't need an isolated Nix store.
+  # Incompatible with `additionalPaths`
+  noNixStore ? true
+
 , name ? "nixos-disk-image"
 
 , # Disk image format, one of qcow2, qcow2-compressed, vdi, vpc, raw.
@@ -198,8 +204,9 @@ assert (lib.assertMsg (fsType == "ext4" && deterministic -> rootFSUID != null) "
   # We use -E offset=X below, which is only supported by e2fsprogs
 assert (lib.assertMsg (partitionTableType != "none" -> fsType == "ext4") "to produce a partition table, we need to use -E offset flag which is support only for fsType = ext4");
 assert (lib.assertMsg (touchEFIVars -> partitionTableType == "hybrid" || partitionTableType == "efi" || partitionTableType == "legacy+gpt") "EFI variables can be used only with a partition table of type: hybrid, efi or legacy+gpt.");
-  # If only Nix store image, then: contents must be empty, configFile must be unset, and we should no install bootloader.
+# If only Nix store image, then: contents must be empty, configFile must be unset, and we should no install bootloader.
 assert (lib.assertMsg (onlyNixStore -> contents == [] && configFile == null && !installBootLoader) "In a only Nix store image, the contents must be empty, no configuration must be provided and no bootloader should be installed.");
+assert (lib.assertMsg (noNixStore -> additionalPaths == []) "Without a Nix store in the rootfs, additional paths cannot be copied otherwise you would end up again with a Nix store.");
 # Either both or none of {user,group} need to be set
 assert (lib.assertMsg (lib.all
          (attrs: ((attrs.user  or null) == null)
@@ -422,6 +429,15 @@ let format' = format; in let
     export NIX_STATE_DIR=$TMPDIR/state
     nix-store --load-db < ${closureInfo}/registration
 
+    ${optionalString noNixStore ''
+      # Ensure host Nix store is available so that `nixos-install` performs
+      # no extra operations.
+      mkdir -p $root/nix
+      # TODO: this needs to be made persistent or you need to run the nixos-install inside the namespace.
+      # then, we need to unmount.
+      unshare --mount --map-root-user mount --rbind ${builtins.storeDir} $root/nix
+    ''}
+
     chmod 755 "$TMPDIR"
     echo "running nixos-install..."
     nixos-install --root $root --no-bootloader --no-root-passwd \