mirror of
https://github.com/ilyakooo0/nixpkgs.git
synced 2024-10-05 12:08:02 +03:00
systemd-stage-1: Fully merge /bin
and /sbin
In #327506, we stopped using `/sbin` in the `pathsToLink` of `initrdBinEnv`. This inadvertantly stopped including the `sbin` directory of the `initrdBin` packages, which meant that things like `mdadm`'s udev rules, which referred to binaries by their `sbin` paths, stopped working. The purpose of #327506 was to fix the fact that `mount` was not calling mount helpers like `mount.ext4` unless they happened to be in `/sbin`. But this raised some questions for me, because I thought we set `managerEnvironment.PATH` to help util-linux find helpers for both `mount` and `fsck`. So I decided to look at how this works in stage 2 to figure it out, and it's a little cursed. --- What I already knew is that we have [this](696a4e3758/nixos/modules/system/boot/systemd.nix (L624-L625)
) ``` # util-linux is needed for the main fsck utility wrapping the fs-specific ones PATH = lib.makeBinPath (config.system.fsPackages ++ [cfg.package.util-linux]); ``` And I thought this was how `mount` finds the mount helpers. But if that were true, then `mount` should be finding helpers in stage 1 because of [this](696a4e3758/nixos/modules/system/boot/systemd/initrd.nix (L411)
) ``` managerEnvironment.PATH = "/bin"; ``` Turns out, `mount` _actually_ finds helpers with [this configure flag](696a4e3758/pkgs/os-specific/linux/util-linux/default.nix (L59)
) ``` "--enable-fs-paths-default=/run/wrappers/bin:/run/current-system/sw/bin:/sbin" ``` Ok... so then why do we need the PATH? Because `fsck` has [this](a75c7a102e/disk-utils/fsck.c (L1659)
) ``` fsck_path = xstrdup(path && *path ? path : FSCK_DEFAULT_PATH); ``` (`path` is `getenv("PATH")`) So, tl;dr, `mount` and `fsck` have completely unrelated search paths for their helper programs For `mount`, we have to use a configure flag to point to `/run/current-system`, and for `fsck` we can just set PATH --- So, for systemd stage 1, we *do* want to include packages' `sbin` paths, because of the `mdadm` problem. But for `mount`, we need helpers to be on the search path, and right now that means putting it somewhere in `/run/wrappers/bin:/run/current-system/sw/bin:/sbin`.
This commit is contained in:
parent
d74d182991
commit
208e953381
@ -104,7 +104,16 @@ let
|
||||
name = "initrd-bin-env";
|
||||
paths = map getBin cfg.initrdBin;
|
||||
pathsToLink = ["/bin" "/sbin"];
|
||||
postBuild = concatStringsSep "\n" (mapAttrsToList (n: v: "ln -sf '${v}' $out/bin/'${n}'") cfg.extraBin);
|
||||
|
||||
# Make sure sbin and bin have the same contents, and add extraBin
|
||||
postBuild = ''
|
||||
find $out/bin -maxdepth 1 -type l -print0 | xargs --null cp --no-dereference --no-clobber -t $out/sbin/
|
||||
find $out/sbin -maxdepth 1 -type l -print0 | xargs --null cp --no-dereference --no-clobber -t $out/bin/
|
||||
${concatStringsSep "\n" (mapAttrsToList (n: v: ''
|
||||
ln -sf '${v}' $out/bin/'${n}'
|
||||
ln -sf '${v}' $out/sbin/'${n}'
|
||||
'') cfg.extraBin)}
|
||||
'';
|
||||
};
|
||||
|
||||
initialRamdisk = pkgs.makeInitrdNG {
|
||||
|
Loading…
Reference in New Issue
Block a user