Home Explore Blog CI



nixpkgs

2nd chunk of `nixos/doc/manual/configuration/linux-kernel.chapter.md`
ef3dbd93ee3f15d2758677df33d7026ceb6d2e800293008c0000000100000bbd
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:

```ShellSession
zcat /proc/config.gz
```

If you want to change the kernel configuration, you can use the
`packageOverrides` feature (see [](#sec-customising-packages)). For
instance, to enable support for the kernel debugger KGDB:

```nix
{
  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
[](#opt-boot.kernelModules), e.g.

```nix
{
  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 [](#opt-boot.initrd.kernelModules):

```nix
{
  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
[](#opt-boot.kernel.sysctl), e.g.

```nix
{
  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 {#sec-linux-config-customizing}

Please refer to the Nixpkgs manual for the various ways of [building a custom kernel](https://nixos.org/nixpkgs/manual#sec-linux-kernel).

To use your custom kernel package in your NixOS configuration, set

```nix
{
  boot.kernelPackages = pkgs.linuxPackagesFor yourCustomKernel;
}
```

## Rust {#sec-linux-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:

```nix
{
  boot.kernelPatches = [
    {
      name = "Rust Support";
      patch = null;
      features = {
        rust = true;
      };
    }
  ];
}
```

## Developing kernel modules {#sec-linux-config-developing-modules}

This section was moved to the [Nixpkgs manual](https://nixos.org/nixpkgs/manual#sec-linux-kernel-developing-modules).

## ZFS {#sec-linux-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`).

Title: Advanced Kernel Configuration and Customization in NixOS
Summary
NixOS removes non-LTS kernels when they're no longer maintained. You can inspect the current kernel configuration using `zcat /proc/config.gz` and modify it using `packageOverrides` and `extraConfig`. Kernel modules can be managed via `boot.kernelModules` and `boot.initrd.kernelModules`. Runtime parameters are adjustable via `boot.kernel.sysctl`. Custom kernels can be built and used by setting `boot.kernelPackages`. For kernel 6.7 and newer, experimental Rust support can be enabled through `boot.kernelPatches`. Guidance on developing kernel modules is now in the Nixpkgs manual. When using ZFS, using the latest LTS kernel compatible with ZFS is recommended.