nixos/doc: update custom kernel instructions

Document the `linux.override` way first, then `linuxManualConfig`.

Add a `linux.configEnv` passthru attribute for quickly getting a
`make nconfig`-ready shell.

Changed files
+115 -82
nixos
doc
manual
configuration
from_md
configuration
pkgs
os-specific
linux
kernel
+45 -38
nixos/doc/manual/configuration/linux-kernel.chapter.md
···
sets the kernel's TCP keepalive time to 120 seconds. To see the
available parameters, run `sysctl -a`.
-
## Customize your kernel {#sec-linux-config-customizing}
+
## Building a custom kernel {#sec-linux-config-customizing}
-
The first step before compiling the kernel is to generate an appropriate
-
`.config` configuration. Either you pass your own config via the
-
`configfile` setting of `linuxKernel.manualConfig`:
+
You can customize the default kernel configuration by overriding the arguments for your kernel package:
```nix
-
custom-kernel = let base_kernel = linuxKernel.kernels.linux_4_9;
-
in super.linuxKernel.manualConfig {
-
inherit (super) stdenv hostPlatform;
-
inherit (base_kernel) src;
-
version = "${base_kernel.version}-custom";
-
-
configfile = /home/me/my_kernel_config;
-
allowImportFromDerivation = true;
-
};
+
pkgs.linux_latest.override {
+
ignoreConfigErrors = true;
+
autoModules = false;
+
kernelPreferBuiltin = true;
+
extraStructuredConfig = with lib.kernel; {
+
DEBUG_KERNEL = yes;
+
FRAME_POINTER = yes;
+
KGDB = yes;
+
KGDB_SERIAL_CONSOLE = yes;
+
DEBUG_INFO = yes;
+
};
+
}
```
-
You can edit the config with this snippet (by default `make
-
menuconfig` won\'t work out of the box on nixos):
+
See `pkgs/os-specific/linux/kernel/generic.nix` for details on how these arguments
+
affect the generated configuration. You can also build a custom version of Linux by calling
+
`pkgs.buildLinux` directly, which requires the `src` and `version` arguments to be specified.
+
+
To use your custom kernel package in your NixOS configuration, set
-
```ShellSession
-
nix-shell -E 'with import <nixpkgs> {}; kernelToOverride.overrideAttrs (o: {nativeBuildInputs=o.nativeBuildInputs ++ [ pkg-config ncurses ];})'
+
```nix
+
boot.kernelPackages = pkgs.linuxPackagesFor yourCustomKernel;
```
-
or you can let nixpkgs generate the configuration. Nixpkgs generates it
-
via answering the interactive kernel utility `make config`. The answers
-
depend on parameters passed to
-
`pkgs/os-specific/linux/kernel/generic.nix` (which you can influence by
-
overriding `extraConfig, autoModules,
-
modDirVersion, preferBuiltin, extraConfig`).
+
Note that this method will use the common configuration defined in `pkgs/os-specific/linux/kernel/common-config.nix`,
+
which is suitable for a NixOS system.
+
+
If you already have a generated configuration file, you can build a kernel that uses it with `pkgs.linuxManualConfig`:
```nix
-
mptcp93.override ({
-
name="mptcp-local";
+
let
+
baseKernel = pkgs.linux_latest;
+
in pkgs.linuxManualConfig {
+
inherit (baseKernel) src modDirVersion;
+
version = "${baseKernel.version}-custom";
+
configfile = ./my_kernel_config;
+
allowImportFromDerivation = true;
+
}
+
```
-
ignoreConfigErrors = true;
-
autoModules = false;
-
kernelPreferBuiltin = true;
+
::: {.note}
+
The build will fail if `modDirVersion` does not match the source's `kernel.release` file,
+
so `modDirVersion` should remain tied to `src`.
+
:::
-
enableParallelBuilding = true;
+
To edit the `.config` file for Linux X.Y, proceed as follows:
-
extraConfig = ''
-
DEBUG_KERNEL y
-
FRAME_POINTER y
-
KGDB y
-
KGDB_SERIAL_CONSOLE y
-
DEBUG_INFO y
-
'';
-
});
+
```ShellSession
+
$ nix-shell '<nixpkgs>' -A linuxKernel.kernels.linux_X_Y.configEnv
+
$ unpackPhase
+
$ cd linux-*
+
$ make nconfig
```
## Developing kernel modules {#sec-linux-config-developing-modules}
-
When developing kernel modules it\'s often convenient to run
+
When developing kernel modules it's often convenient to run
edit-compile-run loop as quickly as possible. See below snippet as an
example of developing `mellanox` drivers.
+61 -44
nixos/doc/manual/from_md/configuration/linux-kernel.chapter.xml
···
available parameters, run <literal>sysctl -a</literal>.
</para>
<section xml:id="sec-linux-config-customizing">
-
<title>Customize your kernel</title>
+
<title>Building a custom kernel</title>
<para>
-
The first step before compiling the kernel is to generate an
-
appropriate <literal>.config</literal> configuration. Either you
-
pass your own config via the <literal>configfile</literal> setting
-
of <literal>linuxKernel.manualConfig</literal>:
+
You can customize the default kernel configuration by overriding
+
the arguments for your kernel package:
</para>
<programlisting language="bash">
-
custom-kernel = let base_kernel = linuxKernel.kernels.linux_4_9;
-
in super.linuxKernel.manualConfig {
-
inherit (super) stdenv hostPlatform;
-
inherit (base_kernel) src;
-
version = &quot;${base_kernel.version}-custom&quot;;
-
-
configfile = /home/me/my_kernel_config;
-
allowImportFromDerivation = true;
-
};
+
pkgs.linux_latest.override {
+
ignoreConfigErrors = true;
+
autoModules = false;
+
kernelPreferBuiltin = true;
+
extraStructuredConfig = with lib.kernel; {
+
DEBUG_KERNEL = yes;
+
FRAME_POINTER = yes;
+
KGDB = yes;
+
KGDB_SERIAL_CONSOLE = yes;
+
DEBUG_INFO = yes;
+
};
+
}
</programlisting>
<para>
-
You can edit the config with this snippet (by default
-
<literal>make menuconfig</literal> won't work out of the box on
-
nixos):
+
See <literal>pkgs/os-specific/linux/kernel/generic.nix</literal>
+
for details on how these arguments affect the generated
+
configuration. You can also build a custom version of Linux by
+
calling <literal>pkgs.buildLinux</literal> directly, which
+
requires the <literal>src</literal> and <literal>version</literal>
+
arguments to be specified.
</para>
-
<programlisting>
-
nix-shell -E 'with import &lt;nixpkgs&gt; {}; kernelToOverride.overrideAttrs (o: {nativeBuildInputs=o.nativeBuildInputs ++ [ pkg-config ncurses ];})'
+
<para>
+
To use your custom kernel package in your NixOS configuration, set
+
</para>
+
<programlisting language="bash">
+
boot.kernelPackages = pkgs.linuxPackagesFor yourCustomKernel;
</programlisting>
<para>
-
or you can let nixpkgs generate the configuration. Nixpkgs
-
generates it via answering the interactive kernel utility
-
<literal>make config</literal>. The answers depend on parameters
-
passed to
-
<literal>pkgs/os-specific/linux/kernel/generic.nix</literal>
-
(which you can influence by overriding
-
<literal>extraConfig, autoModules, modDirVersion, preferBuiltin, extraConfig</literal>).
+
Note that this method will use the common configuration defined in
+
<literal>pkgs/os-specific/linux/kernel/common-config.nix</literal>,
+
which is suitable for a NixOS system.
+
</para>
+
<para>
+
If you already have a generated configuration file, you can build
+
a kernel that uses it with
+
<literal>pkgs.linuxManualConfig</literal>:
</para>
<programlisting language="bash">
-
mptcp93.override ({
-
name=&quot;mptcp-local&quot;;
-
-
ignoreConfigErrors = true;
-
autoModules = false;
-
kernelPreferBuiltin = true;
-
-
enableParallelBuilding = true;
-
-
extraConfig = ''
-
DEBUG_KERNEL y
-
FRAME_POINTER y
-
KGDB y
-
KGDB_SERIAL_CONSOLE y
-
DEBUG_INFO y
-
'';
-
});
+
let
+
baseKernel = pkgs.linux_latest;
+
in pkgs.linuxManualConfig {
+
inherit (baseKernel) src modDirVersion;
+
version = &quot;${baseKernel.version}-custom&quot;;
+
configfile = ./my_kernel_config;
+
allowImportFromDerivation = true;
+
}
+
</programlisting>
+
<note>
+
<para>
+
The build will fail if <literal>modDirVersion</literal> does not
+
match the source’s <literal>kernel.release</literal> file, so
+
<literal>modDirVersion</literal> should remain tied to
+
<literal>src</literal>.
+
</para>
+
</note>
+
<para>
+
To edit the <literal>.config</literal> file for Linux X.Y, proceed
+
as follows:
+
</para>
+
<programlisting>
+
$ nix-shell '&lt;nixpkgs&gt;' -A linuxKernel.kernels.linux_X_Y.configEnv
+
$ unpackPhase
+
$ cd linux-*
+
$ make nconfig
</programlisting>
</section>
<section xml:id="sec-linux-config-developing-modules">
<title>Developing kernel modules</title>
<para>
-
When developing kernel modules it's often convenient to run
+
When developing kernel modules it’s often convenient to run
edit-compile-run loop as quickly as possible. See below snippet as
an example of developing <literal>mellanox</literal> drivers.
</para>
+9
pkgs/os-specific/linux/kernel/generic.nix
···
features = kernelFeatures;
inherit commonStructuredConfig structuredExtraConfig extraMakeFlags isZen isHardened isLibre;
isXen = lib.warn "The isXen attribute is deprecated. All Nixpkgs kernels that support it now have Xen enabled." true;
+
+
# Adds dependencies needed to edit the config:
+
# nix-shell '<nixpkgs>' -A linux.configEnv --command 'make nconfig'
+
configEnv = kernel.overrideAttrs (old: {
+
nativeBuildInputs = old.nativeBuildInputs or [] ++ (with buildPackages; [
+
pkg-config ncurses
+
]);
+
});
+
passthru = kernel.passthru // (removeAttrs passthru [ "passthru" ]);
tests = let
overridableKernel = finalKernel // {