From f5b3f2c5a7f2b51e80ac32fb47fd1d7d3e475ad1 Mon Sep 17 00:00:00 2001 From: Dan Peebles Date: Fri, 10 Nov 2017 05:08:54 +0000 Subject: [PATCH] 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. --- nixos/lib/make-disk-image.nix | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/nixos/lib/make-disk-image.nix b/nixos/lib/make-disk-image.nix index 9fa848301f60..865be297c066 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