* manual: Mark commands that require root Mark every command that requires to be run as root by prefixing them with '#' instead of '$'. * manual: Add note about commands that require root
		
			
				
	
	
		
			91 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
<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">
 | 
						||
 | 
						||
<title>Linux Kernel</title>
 | 
						||
 | 
						||
<para>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:
 | 
						||
<programlisting>
 | 
						||
boot.kernelPackages = pkgs.linuxPackages_3_10;
 | 
						||
</programlisting>
 | 
						||
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.</para>
 | 
						||
 | 
						||
<para>The default Linux kernel configuration should be fine for most users. You can see the configuration of your current kernel with the following command:
 | 
						||
<programlisting>
 | 
						||
zcat /proc/config.gz
 | 
						||
</programlisting>
 | 
						||
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:
 | 
						||
 | 
						||
<programlisting>
 | 
						||
nixpkgs.config.packageOverrides = pkgs:
 | 
						||
  { linux_3_4 = pkgs.linux_3_4.override {
 | 
						||
      extraConfig =
 | 
						||
        ''
 | 
						||
          KGDB y
 | 
						||
        '';
 | 
						||
    };
 | 
						||
  };
 | 
						||
</programlisting>
 | 
						||
 | 
						||
<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).</para>
 | 
						||
 | 
						||
<para>Kernel modules for hardware devices are generally loaded
 | 
						||
automatically by <command>udev</command>.  You can force a module to
 | 
						||
be loaded via <option>boot.kernelModules</option>, e.g.
 | 
						||
<programlisting>
 | 
						||
boot.kernelModules = [ "fuse" "kvm-intel" "coretemp" ];
 | 
						||
</programlisting>
 | 
						||
If the module is required early during the boot (e.g. to mount the
 | 
						||
root file system), you can use
 | 
						||
<option>boot.initrd.extraKernelModules</option>:
 | 
						||
<programlisting>
 | 
						||
boot.initrd.extraKernelModules = [ "cifs" ];
 | 
						||
</programlisting>
 | 
						||
This causes the specified modules and their dependencies to be added
 | 
						||
to the initial ramdisk.</para>
 | 
						||
 | 
						||
<para>Kernel runtime parameters can be set through
 | 
						||
<option>boot.kernel.sysctl</option>, e.g.
 | 
						||
<programlisting>
 | 
						||
boot.kernel.sysctl."net.ipv4.tcp_keepalive_time" = 120;
 | 
						||
</programlisting>
 | 
						||
sets the kernel’s TCP keepalive time to 120 seconds.  To see the
 | 
						||
available parameters, run <command>sysctl -a</command>.</para>
 | 
						||
 | 
						||
<section>
 | 
						||
  <title>Developing kernel modules</title>
 | 
						||
 | 
						||
  <para>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>
 | 
						||
 | 
						||
  <screen><![CDATA[
 | 
						||
$ nix-build '<nixpkgs>' -A linuxPackages.kernel.dev
 | 
						||
$ nix-shell '<nixpkgs>' -A linuxPackages.kernel
 | 
						||
$ unpackPhase
 | 
						||
$ cd linux-*
 | 
						||
$ make -C $dev/lib/modules/*/build M=$(pwd)/drivers/net/ethernet/mellanox modules
 | 
						||
# insmod ./drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko
 | 
						||
]]></screen>
 | 
						||
 | 
						||
</section>
 | 
						||
 | 
						||
</chapter>
 |