Fixes #14831 by using full path for binaries used in install-grub.pl

Both btrfs-progs and utillinux are ~5MB, we may discuss in future
to handle this better but I see no better way at the moment than
increaing purity in the install process.

Changed files
+12 -5
nixos
modules
system
boot
+9 -2
nixos/modules/system/boot/loader/grub/grub.nix
···
{ path = "/boot"; inherit (cfg) devices; inherit (efi) efiSysMountPoint; }
];
-
system.build.installBootLoader = pkgs.writeScript "install-grub.sh" (''
+
system.build.installBootLoader =
+
let
+
install-grub-pl = pkgs.substituteAll {
+
src = ./install-grub.pl;
+
inherit (pkgs) utillinux;
+
btrfsprogs = pkgs.btrfs-progs;
+
};
+
in pkgs.writeScript "install-grub.sh" (''
#!${pkgs.stdenv.shell}
set -e
export PERL5LIB=${makePerlPath (with pkgs.perlPackages; [ FileSlurp XMLLibXML XMLSAX ListCompare ])}
${optionalString cfg.enableCryptodisk "export GRUB_ENABLE_CRYPTODISK=y"}
'' + flip concatMapStrings cfg.mirroredBoots (args: ''
-
${pkgs.perl}/bin/perl ${./install-grub.pl} ${grubConfig args} $@
+
${pkgs.perl}/bin/perl ${install-grub-pl} ${grubConfig args} $@
''));
system.build.grub = grub;
+3 -3
nixos/modules/system/boot/loader/grub/install-grub.pl
···
$search = $types{$fsIdentifier} . ' ';
# Based on the type pull in the identifier from the system
-
my ($status, @devInfo) = runCommand("blkid -o export @{[$fs->device]}");
+
my ($status, @devInfo) = runCommand("@utillinux@/bin/blkid -o export @{[$fs->device]}");
if ($status != 0) {
die "Failed to get blkid info for @{[$fs->mount]} on @{[$fs->device]}";
}
···
# BTRFS is a special case in that we need to fix the referrenced path based on subvolumes
if ($fs->type eq 'btrfs') {
-
my ($status, @id_info) = runCommand("btrfs subvol show @{[$fs->mount]}");
+
my ($status, @id_info) = runCommand("@btrfsprogs@/bin/btrfs subvol show @{[$fs->mount]}");
if ($status != 0) {
die "Failed to retrieve subvolume info for @{[$fs->mount]}\n";
}
···
if ($#ids > 0) {
die "Btrfs subvol name for @{[$fs->device]} listed multiple times in mount\n"
} elsif ($#ids == 0) {
-
my ($status, @path_info) = runCommand("btrfs subvol list @{[$fs->mount]}");
+
my ($status, @path_info) = runCommand("@btrfsprogs@/bin/btrfs subvol list @{[$fs->mount]}");
if ($status != 0) {
die "Failed to find @{[$fs->mount]} subvolume id from btrfs\n";
}