How To Config Linux Kernel in Nix

Basic configuration tricks referring to nixos.wiki: Linux Kernel.

The Override System in Kernel

What do the pkgs.linux.override, pkgs.linux.overrideAttrs override?

To answer these questions, we need first to explore how kernel derivation is generated. When we type pkgs.linux, how this derivation is generated by nix?

* pkgs.linux
* pkgs/top-level/all-packages:
  * linuxPackages.kernel;
  * (linuxPackages = linuxKernel.packageAliases.linux_default).kernel;
  * (linuxPackages = (linuxKernel = recurseIntoAttrs (callPackage ./linux-kernels.nix { });).packageAliases.linux_default).kernel;
  * (recurseIntoAttrs (callPackage ./linux-kernels.nix { });).packageAliases.linux_default.kernel;
* pkgs/top-level/linux-kernels.nix:
  * packages.linux_6_6.kernel;
  * (recurseIntoAttrs (vanillaPackages // rtPackages // rpiPackages // { ... })).linux_6_6.kernel
  * (recurseIntoAttrs ({...; linux_6_6 = recurseIntoAttrs (packagesFor kernels.linux_6_6);...} // rtPackages // rpiPackages // { ... })).linux_6_6.kernel
  * (packagesFor kernels.linux_6_6).kernel
  * ((kernel_: {kernel = kernel_;}) kernels.linux_6_6).kernel
  * kernels.linux_6_6
  * ❶callPackage ../os-specific/linux/kernel/mainline.nix {
      branch = "6.6";
      kernelPatches = [
        kernelPatches.bridge_stp_helper
        kernelPatches.request_key_helper
      ];
    };
* pkgs/os-specific/linux/kernel/mainline.nix
  * buildLinux args'
  * ❷buildLinux ((builtins.removeAttrs args [ "branch" ])
    // {
      inherit src version;

      modDirVersion = lib.versions.pad 3 version;
      extraMeta.branch = branch;
    }
    // (args.argsOverride or { }))
  * (callPackage pkgs/os-specific/linux/kernel/generic.nix {}) args'
  * overridableKernel args'
  * (lib.makeOverridable ({...}: kernel.overrideAttrs (...))) args'
  * kernel.overrideAttrs (...)
  * ❸((callPackage ./manual-config.nix { inherit lib stdenv buildPackages; }) (basicArgs // { ... })).overrideAttrs (...)

因此

  • override is applied to pkgs/os-specific/linux/kernel/mainline.nix
  • argsOverride in override (old: {argsOverride = {...} }) is applied to pkgs/os-specific/linux/kernel/generic.nix
  • overrideAttrs is applied to pkgs/os-specific/linux/kernel/manual-config.nix