{ config, lib, pkgs, ... }: with lib; { ###### interface options = { boot.blacklistedKernelModules = mkOption { type = types.listOf types.str; default = []; example = [ "cirrusfb" "i2c_piix4" ]; description = '' List of names of kernel modules that should not be loaded automatically by the hardware probing code. ''; }; boot.extraModprobeConfig = mkOption { default = ""; example = '' options parport_pc io=0x378 irq=7 dma=1 ''; description = '' Any additional configuration to be appended to the generated modprobe.conf. This is typically used to specify module options. See modprobe.d 5 for details. ''; type = types.lines; }; boot.initrd.extraModprobeConfig = mkOption { default = ""; example = '' options zfs zfs_arc_max=1073741824 ''; description = '' Does exactly the same thing as , except that the generated modprobe.conf file is also included in the initrd. This is useful for setting module options for kernel modules that are loaded during early boot in the initrd. ''; type = types.lines; }; }; ###### implementation config = mkIf (!config.boot.isContainer) { environment.etc."modprobe.d/ubuntu.conf".source = "${pkgs.kmod-blacklist-ubuntu}/modprobe.conf"; environment.etc."modprobe.d/nixos.conf".text = '' ${flip concatMapStrings config.boot.blacklistedKernelModules (name: '' blacklist ${name} '')} ${config.boot.extraModprobeConfig} ''; environment.etc."modprobe.d/nixos-initrd.conf".text = '' ${config.boot.initrd.extraModprobeConfig} ''; environment.etc."modprobe.d/debian.conf".source = pkgs.kmod-debian-aliases; environment.etc."modprobe.d/systemd.conf".source = "${pkgs.systemd}/lib/modprobe.d/systemd.conf"; environment.systemPackages = [ pkgs.kmod ]; system.activationScripts.modprobe = stringAfter ["specialfs"] '' # Allow the kernel to find our wrapped modprobe (which searches # 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 ''; }; }