From 4084ee0cd55e41b6d78ea578f03ef3471a261731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=BChrk?= Date: Mon, 4 Dec 2023 18:36:24 +0100 Subject: [PATCH] make-initrd-ng: fix reproducibility problems The previous find invocation didn't match the root directory, so the root directory's access and modification time wasn't set to a deterministic value and the build time leaked into the output. `make-initrd` replaced `cpio` with `bsdtar` in #165892 because the former includes the number of hardlinks in the created archive, which depends on the filesystem (and can also be influenced by `nix-store --optimise`). The same problem applies to `make-initrd-ng`, so this commit replaces `cpio` with `libarchive`'s `bsdtar`. --- pkgs/build-support/kernel/make-initrd-ng.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/build-support/kernel/make-initrd-ng.nix b/pkgs/build-support/kernel/make-initrd-ng.nix index f2f7aaa6d1b6..65e143cb7349 100644 --- a/pkgs/build-support/kernel/make-initrd-ng.nix +++ b/pkgs/build-support/kernel/make-initrd-ng.nix @@ -8,7 +8,7 @@ let # compression type and filename extension. compressorName = fullCommand: builtins.elemAt (builtins.match "([^ ]*/)?([^ ]+).*" fullCommand) 1; in -{ stdenvNoCC, perl, cpio, ubootTools, lib, pkgsBuildHost, makeInitrdNGTool, binutils, runCommand +{ stdenvNoCC, libarchive, ubootTools, lib, pkgsBuildHost, makeInitrdNGTool, binutils, runCommand # Name of the derivation (not of the resulting file!) , name ? "initrd" @@ -74,18 +74,18 @@ in passAsFile = ["contents"]; contents = lib.concatMapStringsSep "\n" ({ object, symlink, ... }: "${object}\n${lib.optionalString (symlink != null) symlink}") contents + "\n"; - nativeBuildInputs = [makeInitrdNGTool cpio] ++ lib.optional makeUInitrd ubootTools ++ lib.optional strip binutils; + nativeBuildInputs = [makeInitrdNGTool libarchive] ++ lib.optional makeUInitrd ubootTools ++ lib.optional strip binutils; STRIP = if strip then "${pkgsBuildHost.binutils.targetPrefix}strip" else null; }) '' mkdir -p ./root/var/empty make-initrd-ng "$contentsPath" ./root mkdir "$out" - (cd root && find * .[^.*] -exec touch -h -d '@1' '{}' +) + (cd root && find . -exec touch -h -d '@1' '{}' +) for PREP in $prepend; do cat $PREP >> $out/initrd done - (cd root && find . -print0 | sort -z | cpio -o -H newc -R +0:+0 --reproducible --null | eval -- $compress >> "$out/initrd") + (cd root && find . -print0 | sort -z | bsdtar --uid 0 --gid 0 -cnf - -T - | bsdtar --null -cf - --format=newc @- | eval -- $compress >> "$out/initrd") if [ -n "$makeUInitrd" ]; then mkimage -A "$uInitrdArch" -O linux -T ramdisk -C "$uInitrdCompression" -d "$out/initrd" $out/initrd.img