summary refs log tree commit diff
path: root/nixos/lib/make-disk-image.nix
diff options
context:
space:
mode:
authorDan Peebles <pumpkin@me.com>2017-11-10 05:08:54 +0000
committerDan Peebles <pumpkin@me.com>2017-11-10 05:15:37 +0000
commitf5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1 (patch)
treea688da3d04c004f0c1677bbf8ad296718a4f65ab /nixos/lib/make-disk-image.nix
parent7ebacd1a43d7112c75555414d968be9fc4c564a4 (diff)
downloadnixpkgs-f5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1.tar
nixpkgs-f5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1.tar.gz
nixpkgs-f5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1.tar.bz2
nixpkgs-f5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1.tar.lz
nixpkgs-f5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1.tar.xz
nixpkgs-f5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1.tar.zst
nixpkgs-f5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1.zip
make-disk-iamge: use faketime to get a consistent timestamp
This fixes #28768 because during an image build, Nix sees bad store
timestamps and attempts to fix them, but can't fix them on a running
system (due to being inside a builder). Since timestamps on the store
are supposed to be 1 anyway, if we fix this, that fixes image building
inside booted images made this way.

Note that this adds quite a bit of noise to the output, because running
`cptofs` under `faketime` causes a bunch of seemingly spurious error
messages and my attempts to suppress them all failed. We'll fix it when
`cptofs` gets a native timestamp preservation feature.
Diffstat (limited to 'nixos/lib/make-disk-image.nix')
-rw-r--r--nixos/lib/make-disk-image.nix14
1 files changed, 11 insertions, 3 deletions
diff --git a/nixos/lib/make-disk-image.nix b/nixos/lib/make-disk-image.nix
index 9fa848301f6..865be297c06 100644
--- a/nixos/lib/make-disk-image.nix
+++ b/nixos/lib/make-disk-image.nix
@@ -64,7 +64,7 @@ let
     ${channelSources}
   '';
 
-  prepareImageInputs = with pkgs; [ rsync utillinux parted e2fsprogs lkl fakeroot config.system.build.nixos-prepare-root ] ++ stdenv.initialPath;
+  prepareImageInputs = with pkgs; [ rsync utillinux parted e2fsprogs lkl fakeroot libfaketime config.system.build.nixos-prepare-root ] ++ stdenv.initialPath;
 
   # I'm preserving the line below because I'm going to search for it across nixpkgs to consolidate
   # image building logic. The comment right below this now appears in 4 different places in nixpkgs :)
@@ -86,7 +86,7 @@ let
       offset=0
     ''}
 
-    mkfs.${fsType} -F -L nixos -E offset=$offset $diskImage
+    faketime -f "1970-01-01 00:00:01" mkfs.${fsType} -F -L nixos -E offset=$offset $diskImage
   
     root="$PWD/root"
     mkdir -p $root
@@ -124,7 +124,15 @@ let
     fakeroot nixos-prepare-root $root ${channelSources} ${config.system.build.toplevel} closure
 
     echo "copying staging root to image..."
-    cptofs ${pkgs.lib.optionalString partitioned "-P 1"} -t ${fsType} -i $diskImage $root/* /
+    # If we don't faketime, we can end up with timestamps other than 1 on the nix store, which
+    # will confuse Nix in some situations (e.g., breaking image builds in the target image)
+    # N.B: I use 0 here, which results in timestamp = 1 in the image. It's weird but see
+    # https://github.com/lkl/linux/issues/393. Also, running under faketime makes `cptofs` super
+    # noisy and it prints out that it can't find a bunch of files, and then works anyway. We'll
+    # shut it up someday but trying to do a stderr filter through grep is running into some nasty
+    # bug in some eval nonsense we have in runInLinuxVM and I'm sick of trying to fix it.
+    faketime -f "1970-01-01 00:00:00" \
+      cptofs ${pkgs.lib.optionalString partitioned "-P 1"} -t ${fsType} -i $diskImage $root/* /
   '';
 in pkgs.vmTools.runInLinuxVM (
   pkgs.runCommand name