2014-08-24 18:18:18 +01: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-02 00:57:09 +01:00
|
|
|
|
<title>Linux Kernel</title>
|
|
|
|
|
<para>
|
2019-09-19 18:17:30 +01: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 18:18:18 +01:00
|
|
|
|
<programlisting>
|
2018-04-05 09:43:56 +01:00
|
|
|
|
<xref linkend="opt-boot.kernelPackages"/> = pkgs.linuxPackages_3_10;
|
2014-08-24 18:18:18 +01:00
|
|
|
|
</programlisting>
|
2019-09-19 18:17:30 +01:00
|
|
|
|
Note that this not only replaces the kernel, but also packages that are
|
|
|
|
|
specific to the kernel version, such as the NVIDIA video drivers. This
|
|
|
|
|
ensures that driver packages are consistent with the kernel.
|
2018-05-02 00:57:09 +01:00
|
|
|
|
</para>
|
|
|
|
|
<para>
|
2019-09-19 18:17:30 +01: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 18:18:18 +01:00
|
|
|
|
<programlisting>
|
2016-05-22 10:29:33 +01:00
|
|
|
|
zcat /proc/config.gz
|
2014-08-24 18:18:18 +01:00
|
|
|
|
</programlisting>
|
2019-09-19 18:17:30 +01: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 18:18:18 +01:00
|
|
|
|
<programlisting>
|
|
|
|
|
nixpkgs.config.packageOverrides = pkgs:
|
|
|
|
|
{ linux_3_4 = pkgs.linux_3_4.override {
|
|
|
|
|
extraConfig =
|
|
|
|
|
''
|
|
|
|
|
KGDB y
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
</programlisting>
|
2019-09-19 18:17:30 +01: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-02 00:57:09 +01:00
|
|
|
|
</para>
|
|
|
|
|
<para>
|
2019-09-19 18:17:30 +01: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 18:18:18 +01:00
|
|
|
|
<programlisting>
|
2018-04-05 09:43:56 +01:00
|
|
|
|
<xref linkend="opt-boot.kernelModules"/> = [ "fuse" "kvm-intel" "coretemp" ];
|
2014-08-24 18:18:18 +01:00
|
|
|
|
</programlisting>
|
2019-09-19 18:17:30 +01: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 18:18:18 +01:00
|
|
|
|
<programlisting>
|
2018-05-15 13:47:51 +01:00
|
|
|
|
<xref linkend="opt-boot.initrd.kernelModules"/> = [ "cifs" ];
|
2014-08-24 18:18:18 +01:00
|
|
|
|
</programlisting>
|
2019-09-19 18:17:30 +01:00
|
|
|
|
This causes the specified modules and their dependencies to be added to the
|
|
|
|
|
initial ramdisk.
|
2018-05-02 00:57:09 +01:00
|
|
|
|
</para>
|
|
|
|
|
<para>
|
2019-09-19 18:17:30 +01:00
|
|
|
|
Kernel runtime parameters can be set through
|
|
|
|
|
<xref linkend="opt-boot.kernel.sysctl"/>, e.g.
|
2014-08-24 18:18:18 +01:00
|
|
|
|
<programlisting>
|
2018-04-05 09:43:56 +01:00
|
|
|
|
<xref linkend="opt-boot.kernel.sysctl"/>."net.ipv4.tcp_keepalive_time" = 120;
|
2014-08-24 18:18:18 +01:00
|
|
|
|
</programlisting>
|
2019-09-19 18:17:30 +01:00
|
|
|
|
sets the kernel’s TCP keepalive time to 120 seconds. To see the available
|
|
|
|
|
parameters, run <command>sysctl -a</command>.
|
2018-05-02 00:57:09 +01:00
|
|
|
|
</para>
|
2018-09-01 20:49:04 +01:00
|
|
|
|
<section xml:id="sec-linux-config-customizing">
|
2017-11-29 20:09:00 +00:00
|
|
|
|
<title>Customize your kernel</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
2019-09-19 18:17:30 +01: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
|
|
|
|
|
<literal>linuxManualConfig</literal>:
|
2018-09-01 20:49:04 +01:00
|
|
|
|
<screen><![CDATA[
|
2017-11-29 20:09:00 +00:00
|
|
|
|
custom-kernel = super.linuxManualConfig {
|
|
|
|
|
inherit (super) stdenv hostPlatform;
|
|
|
|
|
inherit (linux_4_9) src;
|
|
|
|
|
version = "${linux_4_9.version}-custom";
|
|
|
|
|
|
|
|
|
|
configfile = /home/me/my_kernel_config;
|
|
|
|
|
allowImportFromDerivation = true;
|
|
|
|
|
};
|
|
|
|
|
]]></screen>
|
2019-09-19 18:17:30 +01: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-30 01:51:11 +01:00
|
|
|
|
<screen><![CDATA[
|
2021-01-19 08:58:27 +00:00
|
|
|
|
nix-shell -E 'with import <nixpkgs> {}; kernelToOverride.overrideAttrs (o: {nativeBuildInputs=o.nativeBuildInputs ++ [ pkg-config ncurses ];})'
|
2017-11-29 20:09:00 +00:00
|
|
|
|
]]></screen>
|
2019-09-19 18:17:30 +01: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-29 20:09:00 +00: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 20:49:04 +01:00
|
|
|
|
<section xml:id="sec-linux-config-developing-modules">
|
2016-05-20 11:55:20 +01:00
|
|
|
|
<title>Developing kernel modules</title>
|
|
|
|
|
|
2018-05-02 00:57:09 +01:00
|
|
|
|
<para>
|
2019-09-19 18:17:30 +01: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-22 23:38:47 +01: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-02 00:57:09 +01:00
|
|
|
|
</section>
|
2014-08-24 18:18:18 +01:00
|
|
|
|
</chapter>
|