70 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
		
		
			
		
	
	
			70 lines
		
	
	
		
			2.5 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>
							 | 
						|||
| 
								 | 
							
								cat /proc/config.gz | gunzip
							 | 
						|||
| 
								 | 
							
								</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 ramdark.</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>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								</chapter>
							 |