diff options
Diffstat (limited to 'nixos/modules/system/boot/modprobe.nix')
-rw-r--r-- | nixos/modules/system/boot/modprobe.nix | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/nixos/modules/system/boot/modprobe.nix b/nixos/modules/system/boot/modprobe.nix index b915a98d5375..9bb10eac9880 100644 --- a/nixos/modules/system/boot/modprobe.nix +++ b/nixos/modules/system/boot/modprobe.nix @@ -8,6 +8,41 @@ with lib; options = { + system.sbin.modprobe = mkOption { + internal = true; + default = pkgs.stdenv.mkDerivation { + name = "modprobe"; + buildCommand = '' + mkdir -p $out/bin + for i in ${pkgs.kmod}/sbin/*; do + name=$(basename $i) + echo "$text" > $out/bin/$name + echo 'exec '$i' "$@"' >> $out/bin/$name + chmod +x $out/bin/$name + done + ln -s bin $out/sbin + ''; + text = + '' + #! ${pkgs.stdenv.shell} + export MODULE_DIR=/run/current-system/kernel-modules/lib/modules + + # Fall back to the kernel modules used at boot time if the + # modules in the current configuration don't match the + # running kernel. + if [ ! -d "$MODULE_DIR/$(${pkgs.coreutils}/bin/uname -r)" ]; then + MODULE_DIR=/run/booted-system/kernel-modules/lib/modules/ + fi + + ''; + meta.priority = 4; + }; + description = '' + Wrapper around modprobe that sets the path to the modules + tree. + ''; + }; + boot.blacklistedKernelModules = mkOption { type = types.listOf types.str; default = []; @@ -52,7 +87,7 @@ with lib; ''; environment.etc."modprobe.d/debian.conf".source = pkgs.kmod-debian-aliases; - environment.systemPackages = [ pkgs.kmod ]; + environment.systemPackages = [ config.system.sbin.modprobe pkgs.kmod ]; system.activationScripts.modprobe = '' @@ -60,9 +95,11 @@ with lib; # in the right location in the Nix store for kernel modules). # We need this when the kernel (or some module) auto-loads a # module. - echo ${pkgs.kmod}/bin/modprobe > /proc/sys/kernel/modprobe + echo ${config.system.sbin.modprobe}/sbin/modprobe > /proc/sys/kernel/modprobe ''; + environment.sessionVariables.MODULE_DIR = "/run/current-system/kernel-modules/lib/modules"; + }; } |