2014-08-24 19:18:18 +02:00
<chapter xmlns= "http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
version="5.0"
xml:id="sec-kernel-config">
2018-05-01 19:57:09 -04:00
<title > Linux Kernel</title>
<para >
2019-09-19 19:17:30 +02:00
You can override the Linux kernel and associated packages using the option
<option > boot.kernelPackages</option> . For instance, this selects the Linux
3.10 kernel:
2014-08-24 19:18:18 +02:00
<programlisting >
2021-06-29 08:28:58 +02:00
<xref linkend= "opt-boot.kernelPackages" /> = pkgs.linuxKernel.packages.linux_3_10;
2014-08-24 19:18:18 +02:00
</programlisting>
2019-09-19 19:17:30 +02:00
Note that this not only replaces the kernel, but also packages that are
2021-06-29 08:28:58 +02:00
specific to the kernel version, such as the NVIDIA video drivers. This ensures that driver packages are consistent with the kernel.
</para>
<para >
While <varname > pkgs.linuxKernel.packages</varname> contains all available kernel packages, you may want to use one of the unversioned <varname > pkgs.linuxPackages_*</varname> aliases such as <varname > pkgs.linuxPackages_latest</varname> , that are kept up to date with new versions.
</para>
2018-05-01 19:57:09 -04:00
<para >
2019-09-19 19:17:30 +02:00
The default Linux kernel configuration should be fine for most users. You can
see the configuration of your current kernel with the following command:
2014-08-24 19:18:18 +02:00
<programlisting >
2016-05-22 11:29:33 +02:00
zcat /proc/config.gz
2014-08-24 19:18:18 +02:00
</programlisting>
2019-09-19 19:17:30 +02:00
If you want to change the kernel configuration, you can use the
<option > packageOverrides</option> feature (see
<xref
linkend="sec-customising-packages" />). For instance, to enable support
for the kernel debugger KGDB:
2014-08-24 19:18:18 +02:00
<programlisting >
2021-06-29 08:28:58 +02:00
nixpkgs.config.packageOverrides = pkgs: pkgs.lib.recursiveUpdate pkgs {
linuxKernel.kernels.linux_5_10 = pkgs.linuxKernel.kernels.linux_5_10.override {
extraConfig = ''
KGDB y
'';
2014-08-24 19:18:18 +02:00
};
2021-06-29 08:28:58 +02:00
};
2014-08-24 19:18:18 +02:00
</programlisting>
2019-09-19 19:17:30 +02:00
<varname > extraConfig</varname> takes a list of Linux kernel configuration
options, one per line. The name of the option should not include the prefix
<literal > CONFIG_</literal> . The option value is typically
<literal > y</literal> , <literal > n</literal> or <literal > m</literal> (to build
something as a kernel module).
2018-05-01 19:57:09 -04:00
</para>
<para >
2019-09-19 19:17:30 +02:00
Kernel modules for hardware devices are generally loaded automatically by
<command > udev</command> . You can force a module to be loaded via
<xref linkend= "opt-boot.kernelModules" /> , e.g.
2014-08-24 19:18:18 +02:00
<programlisting >
2018-04-05 18:43:56 +10:00
<xref linkend= "opt-boot.kernelModules" /> = [ "fuse" "kvm-intel" "coretemp" ];
2014-08-24 19:18:18 +02:00
</programlisting>
2019-09-19 19:17:30 +02:00
If the module is required early during the boot (e.g. to mount the root file
system), you can use <xref linkend= "opt-boot.initrd.kernelModules" /> :
2014-08-24 19:18:18 +02:00
<programlisting >
2018-05-15 14:47:51 +02:00
<xref linkend= "opt-boot.initrd.kernelModules" /> = [ "cifs" ];
2014-08-24 19:18:18 +02:00
</programlisting>
2019-09-19 19:17:30 +02:00
This causes the specified modules and their dependencies to be added to the
initial ramdisk.
2018-05-01 19:57:09 -04:00
</para>
<para >
2019-09-19 19:17:30 +02:00
Kernel runtime parameters can be set through
<xref linkend= "opt-boot.kernel.sysctl" /> , e.g.
2014-08-24 19:18:18 +02:00
<programlisting >
2018-04-05 18:43:56 +10:00
<xref linkend= "opt-boot.kernel.sysctl" /> ."net.ipv4.tcp_keepalive_time" = 120;
2014-08-24 19:18:18 +02:00
</programlisting>
2019-09-19 19:17:30 +02:00
sets the kernel’ s TCP keepalive time to 120 seconds. To see the available
parameters, run <command > sysctl -a</command> .
2018-05-01 19:57:09 -04:00
</para>
2018-09-01 15:49:04 -04:00
<section xml:id= "sec-linux-config-customizing" >
2017-11-30 05:09:00 +09:00
<title > Customize your kernel</title>
<para >
2019-09-19 19:17:30 +02:00
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
2021-06-29 08:28:58 +02:00
<literal > linuxKernel.manualConfig</literal> :
2018-09-01 15:49:04 -04:00
<screen > < ![CDATA[
2021-06-29 08:28:58 +02:00
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";
2017-11-30 05:09:00 +09:00
2021-06-29 08:28:58 +02:00
configfile = /home/me/my_kernel_config;
allowImportFromDerivation = true;
2017-11-30 05:09:00 +09:00
};
]]></screen>
2019-09-19 19:17:30 +02:00
You can edit the config with this snippet (by default <command > make
menuconfig</command> won't work out of the box on nixos):
2018-09-29 20:51:11 -04:00
<screen > < ![CDATA[
2021-01-19 00:58:27 -08:00
nix-shell -E 'with import <nixpkgs > {}; kernelToOverride.overrideAttrs (o: {nativeBuildInputs=o.nativeBuildInputs ++ [ pkg-config ncurses ];})'
2017-11-30 05:09:00 +09:00
]]></screen>
2019-09-19 19:17:30 +02:00
or you can let nixpkgs generate the configuration. Nixpkgs generates it via
answering the interactive kernel utility <command > make config</command> . The
answers depend on parameters passed to
<filename > pkgs/os-specific/linux/kernel/generic.nix</filename> (which you
can influence by overriding <literal > extraConfig, autoModules,
modDirVersion, preferBuiltin, extraConfig</literal> ).
2017-11-30 05:09:00 +09:00
<screen > < ![CDATA[
mptcp93.override ({
name="mptcp-local";
ignoreConfigErrors = true;
autoModules = false;
kernelPreferBuiltin = true;
enableParallelBuilding = true;
extraConfig = ''
DEBUG_KERNEL y
FRAME_POINTER y
KGDB y
KGDB_SERIAL_CONSOLE y
DEBUG_INFO y
'';
});
]]></screen>
</para>
</section>
2018-09-01 15:49:04 -04:00
<section xml:id= "sec-linux-config-developing-modules" >
2016-05-20 11:55:20 +01:00
<title > Developing kernel modules</title>
2018-05-01 19:57:09 -04:00
<para >
2019-09-19 19:17:30 +02:00
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.
2016-05-20 11:55:20 +01:00
</para>
2020-09-23 00:38:47 +02:00
<screen >
<prompt > $ </prompt> nix-build '< nixpkgs>' -A linuxPackages.kernel.dev
<prompt > $ </prompt> nix-shell '< nixpkgs>' -A linuxPackages.kernel
<prompt > $ </prompt> unpackPhase
<prompt > $ </prompt> cd linux-*
<prompt > $ </prompt> make -C $dev/lib/modules/*/build M=$(pwd)/drivers/net/ethernet/mellanox modules
<prompt > # </prompt> insmod ./drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko
</screen>
2018-05-01 19:57:09 -04:00
</section>
2014-08-24 19:18:18 +02:00
</chapter>