4.0 KiB
Linux Kernel
You can override the Linux kernel and associated packages using the
option boot.kernelPackages
. For instance, this selects the Linux 3.10
kernel:
{
boot.kernelPackages = pkgs.linuxKernel.packages.linux_3_10;
}
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.
While pkgs.linuxKernel.packages
contains all available kernel packages,
you may want to use one of the unversioned pkgs.linuxPackages_*
aliases
such as pkgs.linuxPackages_latest
, that are kept up to date with new
versions.
Please note that the current convention in NixOS is to only keep actively maintained kernel versions on both unstable and the currently supported stable release(s) of NixOS. This means that a non-longterm kernel will be removed after it's abandoned by the kernel developers, even on stable NixOS versions. If you pin your kernel onto a non-longterm version, expect your evaluation to fail as soon as the version is out of maintenance.
Longterm versions of kernels will be removed before the next stable NixOS that will exceed the maintenance period of the kernel version.
The default Linux kernel configuration should be fine for most users. You can see the configuration of your current kernel with the following command:
zcat /proc/config.gz
If you want to change the kernel configuration, you can use the
packageOverrides
feature (see ). For
instance, to enable support for the kernel debugger KGDB:
{
nixpkgs.config.packageOverrides = pkgs: pkgs.lib.recursiveUpdate pkgs {
linuxKernel.kernels.linux_5_10 = pkgs.linuxKernel.kernels.linux_5_10.override {
extraConfig = ''
KGDB y
'';
};
};
}
extraConfig
takes a list of Linux kernel configuration options, one
per line. The name of the option should not include the prefix
CONFIG_
. The option value is typically y
, n
or m
(to build
something as a kernel module).
Kernel modules for hardware devices are generally loaded automatically
by udev
. You can force a module to be loaded via
, e.g.
{
boot.kernelModules = [ "fuse" "kvm-intel" "coretemp" ];
}
If the module is required early during the boot (e.g. to mount the root file system), you can use :
{
boot.initrd.kernelModules = [ "cifs" ];
}
This causes the specified modules and their dependencies to be added to the initial ramdisk.
Kernel runtime parameters can be set through , e.g.
{
boot.kernel.sysctl."net.ipv4.tcp_keepalive_time" = 120;
}
sets the kernel's TCP keepalive time to 120 seconds. To see the
available parameters, run sysctl -a
.
Building a custom kernel
Please refer to the Nixpkgs manual for the various ways of building a custom kernel.
To use your custom kernel package in your NixOS configuration, set
{
boot.kernelPackages = pkgs.linuxPackagesFor yourCustomKernel;
}
Rust
The Linux kernel does not have Rust language support enabled by default. For kernel versions 6.7 or newer, experimental Rust support can be enabled. In a NixOS configuration, set:
{
boot.kernelPatches = [
{
name = "Rust Support";
patch = null;
features = {
rust = true;
};
}
];
}
Developing kernel modules
This section was moved to the Nixpkgs manual.
ZFS
It's a common issue that the latest stable version of ZFS doesn't support the latest
available Linux kernel. It is recommended to use the latest available LTS that's compatible
with ZFS. Usually this is the default kernel provided by nixpkgs (i.e. pkgs.linuxPackages
).