squashfs: use -no-hardlinks for reproducible squashfs images (#114454)

the nix store may contain hardlinks: derivations may output them
directly, or users may be using store optimization which automatically
hardlinks identical files in the nix store.

The presence of these links are intended to be a 'transparent'
optimization. However, when creating a squashfs image, the image
will be different depending on whether hard links were present
on the filesystem, leading to reproducibility problems.

By passing '-no-hardlinks' to mksquashfs the files are stored
as duplicates in the squashfs image. Since squashfs has support
for duplicate files this does not lead to a larger image.

For more details see
https://github.com/NixOS/nixpkgs/issues/114331

Changed files
+81 -1
nixos
pkgs
+1 -1
nixos/lib/make-squashfs.nix
···
# Generate the squashfs image.
mksquashfs nix-path-registration $(cat $closureInfo/store-paths) $out \
-
-keep-as-directory -all-root -b 1048576 -comp ${comp}
+
-no-hardlinks -keep-as-directory -all-root -b 1048576 -comp ${comp}
'';
}
+4
pkgs/tools/filesystems/squashfs/default.nix
···
# This patch adds an option to pad filesystems (increasing size) in
# exchange for better chunking / binary diff calculation.
./4k-align.patch
+
# Add -no-hardlinks option. This is a rebased version of
+
# c37bb4da4a5fa8c1cf114237ba364692dd522262, can be removed
+
# when upgrading to the next version after 4.4
+
./0001-Mksquashfs-add-no-hardlinks-option.patch
] ++ lib.optional stdenv.isDarwin ./darwin.patch;
buildInputs = [ zlib xz zstd lz4 ];