How to add a new (major) version of the Linux kernel to Nixpkgs:
-
Copy the old Nix expression (e.g.,
linux-2.6.21.nix
) to the new one (e.g.,linux-2.6.22.nix
) and update it. -
Add the new kernel to the
kernels
attribute set inlinux-kernels.nix
(e.g., create an attributekernel_2_6_22
). -
Update the kernel configuration:
-
While in the Nixpkgs repository, enter the development shell for that kernel:
$ nix-shell -A linuxKernel.kernels.linux_2_6_22
-
Unpack the kernel:
[nix-shell]$ pushd $(mktemp -d) [nix-shell]$ unpackPhase
-
For each supported platform (
i686
,x86_64
,uml
) do the following:-
Make a copy from the old config (e.g.,
config-2.6.21-i686-smp
) to the new one (e.g.,config-2.6.22-i686-smp
). -
Copy the config file for this platform (e.g.,
config-2.6.22-i686-smp
) to.config
in the unpacked kernel source tree. -
Run
make oldconfig ARCH={i386,x86_64,um}
and answer all questions. (For the uml configuration, also addSHELL=bash
.) Make sure to keep the configuration consistent between platforms (i.e., don’t enable some feature oni686
and disable it onx86_64
). -
If needed, you can also run
make menuconfig
:$ nix-shell -p ncurses pkg-config $ make menuconfig ARCH=arch
-
Copy
.config
over the new config file (e.g.,config-2.6.22-i686-smp
).
-
-
-
Test building the kernel:
nix-build -A linuxKernel.kernels.kernel_2_6_22
If it compiles, ship it! For extra credit, try booting NixOS with it.
- It may be that the new kernel requires updating the external kernel modules and kernel-dependent packages listed in the
linuxPackagesFor
function inlinux-kernels.nix
(such as the NVIDIA drivers, AUFS, etc.). If the updated packages aren’t backwards compatible with older kernels, you may need to keep the older versions around.