Table of Contents
- Introduction
- Get the kernel sources
- Prepare a reproducible build shell
- Configure and build the kernel
- Wrap the kernel as a Nix package
- Configure NixOS to use the custom kernel
- Test and rollback
- Short tips and safety notes
Introduction
Compiling a Linux kernel on NixOS follows the familiar configure/build steps, but the integration step should use Nix so the kernel lives in the Nix store and is managed by nixos-rebuild. This short guide keeps to the essentials: fetch sources, build (using gcc), wrap as a Nix package, and activate with nixos-rebuild.
Get the kernel sources
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
git checkout v6.12
Prepare a reproducible build shell
Enter a nix-shell from the kernel tree (or your development shell that contains required tools). The examples below assume you prefer gcc over clang.
# from the kernel source dir
nix-shell .
If you want to ensure the build uses system gcc (and not clang/LLVM), start a clean env:
env -u CC -u LD -u LLVM -u LLVM_IAS bash
which gcc
gcc --version
Configure and build the kernel
Use an out-of-tree build to keep the source tree clean and reuse /proc/config.gz as a starting point.
# cleanup and prepare
make O=build mrproper
mkdir -p build
zcat /proc/config.gz > build/.config
make O=build olddefconfig
# build with parallel jobs
make O=build -j$(nproc)
This produces the kernel image and modules under build/. You can test by loading the vmlinuz from the build tree (VM) or proceed to wrap the kernel as a Nix package.
Wrap the kernel as a Nix package
Create a small override that points kernelPackages at your source/commit:
{ pkgs, lib, stdenv }:
pkgs.linuxPackages.overrideAttrs (old: {
src = pkgs.fetchFromGitHub {
owner = "torvalds";
repo = "linux";
rev = "v6.12";
sha256 = "<hash>";
};
# optional: add patches or config fragments via postPatch / configureFlags
})
Save this as e.g. /path/to/my-kernel.nix.
Configure NixOS to use the custom kernel
In /etc/nixos/configuration.nix point boot.kernelPackages to your package:
{ config, pkgs, ... }:
{
boot.kernelPackages = pkgs.callPackage /path/to/my-kernel.nix { };
}
Then build and switch:
# without flakes
sudo nixos-rebuild switch
# with flakes (example)
sudo nixos-rebuild switch --flake .#yourSystem
nixos-rebuild will build the kernel in the Nix store and update boot entries.
Test and rollback
- Reboot and select the new kernel.
- If it fails, choose an older generation from the boot menu or run:
sudo nixos-rebuild switch --rollback
Short tips and safety notes
- Do not use sudo make install on a running NixOS system — it bypasses the Nix store and system configuration.
- For quick tests use a VM or boot the vmlinuz directly (non-Nix bootloader).
- Prefer flakes and pinned nixpkgs for reproducible builds.
- Keep a known-good configuration.nix before experimenting.