Linux kernel: Difference between revisions
imported>Mth m Header capitalization |
imported>Mth Merge content from Choose your kernel on NixOS to here. |
||
Line 1: | Line 1: | ||
== | == Configuration == | ||
You can choose your kernel simply by setting the <code>boot.kernelPackages</code> option | |||
For example by adding this to <code>/etc/nixos/configuration.nix</code>: | |||
<syntaxHighlight lang="nix"> | |||
boot.kernelPackages = pkgs.linuxPackages_latest; | |||
</syntaxHighlight> | |||
And rebuild your system and reboot to use your new kernel: | |||
<syntaxHighlight lang="console"> | |||
$ sudo nixos-rebuild boot | |||
$ sudo reboot | |||
</syntaxHighlight> | |||
=== List available kernels === | |||
You can list available kernels using <code>nix repl</code> (previously <code>nix-repl</code>) : | |||
<syntaxHighlight lang="console"> | |||
$ nix repl | |||
</syntaxHighlight> | |||
nix-repl> :l <nixpkgs> | |||
Added 8557 variables. | |||
nix-repl> pkgs.linuxPackages | |||
pkgs.linuxPackages pkgs.linuxPackages_latest_hardened | |||
pkgs.linuxPackagesFor pkgs.linuxPackages_latest_xen_dom0 | |||
pkgs.linuxPackages_4_14 pkgs.linuxPackages_latest_xen_dom0_hardened | |||
pkgs.linuxPackages_4_15 pkgs.linuxPackages_mptcp | |||
pkgs.linuxPackages_4_4 pkgs.linuxPackages_rpi | |||
pkgs.linuxPackages_4_9 pkgs.linuxPackages_samus_4_12 | |||
pkgs.linuxPackages_beagleboard pkgs.linuxPackages_samus_latest | |||
pkgs.linuxPackages_copperhead_hardened pkgs.linuxPackages_testing | |||
pkgs.linuxPackages_custom pkgs.linuxPackages_testing_bcachefs | |||
pkgs.linuxPackages_hardened pkgs.linuxPackages_xen_dom0 | |||
=== Custom kernel modules === | |||
Note that if you deviate from the default kernel version, you should also take extra care that extra kernel modules must match the same version. The safest way to do this is to use <code>config.boot.kernelPackages</code> to select the correct module set: | |||
<syntaxHighlight lang="nix"> | |||
{...}: | |||
{ | |||
boot.extraModulePackages = with config.boot.kernelPackages; [ wireguard ]; | |||
} | |||
</syntaxHighlight> | |||
=== Custom configuration === | |||
It is sometimes desirable to change the configuration of your kernel, while keeping the kernel version itself managed through Nixpkgs. To do so, you can add the configuration to a dummy {{nixos:option|boot.kernelPatches}},<ref>[https://logs.nix.samueldr.com/nixos/2018-05-09#1525898458-1525898534; #nixos 2018-05-09]</ref><ref>[https://github.com/NixOS/nixpkgs/blob/03d4694e6110fa9c16e88ee74085ea2068c27494/nixos/modules/misc/crashdump.nix#L63-L73 <tt>nixos/modules/misc/crashdump.nix#L63-L73</tt>]</ref> which will then be merged and applied to the current kernel. As with kernel configuration with NixOS, drop the <tt>CONFIG_</tt> prefix from the kernel configuration names. | |||
This example is from the {{nixos:option|boot.crashDump.enable}} option: | |||
<syntaxhighlight lang=nix> | |||
{ | |||
boot.kernelPatches = [ { | |||
name = "crashdump-config"; | |||
patch = null; | |||
extraConfig = '' | |||
CRASH_DUMP y | |||
DEBUG_INFO y | |||
PROC_VMCORE y | |||
LOCKUP_DETECTOR y | |||
HARDLOCKUP_DETECTOR y | |||
''; | |||
} ]; | |||
} | |||
</syntaxhighlight> | |||
=== Debugging a failed configuration === | |||
As dependencies between kernel configurations items need to be addressed manually, you can inspect the intermediate nix config file after for instance the error | |||
{{bc|note: keeping build directory '/tmp/nix-build-linux-config-4.19.0-mptcp_v0.94.1.drv-0'}} | |||
by opening {{ic|/tmp/nix-build-linux-config-4.19.0-mptcp_v0.94.1.drv-0/.attr-0}}. | |||
== Developing kernel modules == | == Developing kernel modules == | ||
Line 49: | Line 118: | ||
If the source was unpacked and an initial config exists, you can run <code>make xconfig KCONFIG_CONFIG=build/.config</code> | If the source was unpacked and an initial config exists, you can run <code>make xconfig KCONFIG_CONFIG=build/.config</code> | ||
== | == References == | ||
<references /> | |||
Revision as of 06:27, 22 April 2019
Configuration
You can choose your kernel simply by setting the boot.kernelPackages
option
For example by adding this to /etc/nixos/configuration.nix
:
boot.kernelPackages = pkgs.linuxPackages_latest;
And rebuild your system and reboot to use your new kernel:
$ sudo nixos-rebuild boot
$ sudo reboot
List available kernels
You can list available kernels using nix repl
(previously nix-repl
) :
$ nix repl
nix-repl> :l <nixpkgs> Added 8557 variables. nix-repl> pkgs.linuxPackages pkgs.linuxPackages pkgs.linuxPackages_latest_hardened pkgs.linuxPackagesFor pkgs.linuxPackages_latest_xen_dom0 pkgs.linuxPackages_4_14 pkgs.linuxPackages_latest_xen_dom0_hardened pkgs.linuxPackages_4_15 pkgs.linuxPackages_mptcp pkgs.linuxPackages_4_4 pkgs.linuxPackages_rpi pkgs.linuxPackages_4_9 pkgs.linuxPackages_samus_4_12 pkgs.linuxPackages_beagleboard pkgs.linuxPackages_samus_latest pkgs.linuxPackages_copperhead_hardened pkgs.linuxPackages_testing pkgs.linuxPackages_custom pkgs.linuxPackages_testing_bcachefs pkgs.linuxPackages_hardened pkgs.linuxPackages_xen_dom0
Custom kernel modules
Note that if you deviate from the default kernel version, you should also take extra care that extra kernel modules must match the same version. The safest way to do this is to use config.boot.kernelPackages
to select the correct module set:
{...}:
{
boot.extraModulePackages = with config.boot.kernelPackages; [ wireguard ];
}
Custom configuration
It is sometimes desirable to change the configuration of your kernel, while keeping the kernel version itself managed through Nixpkgs. To do so, you can add the configuration to a dummy boot.kernelPatches
,[1][2] which will then be merged and applied to the current kernel. As with kernel configuration with NixOS, drop the CONFIG_ prefix from the kernel configuration names.
This example is from the boot.crashDump.enable
option:
{
boot.kernelPatches = [ {
name = "crashdump-config";
patch = null;
extraConfig = ''
CRASH_DUMP y
DEBUG_INFO y
PROC_VMCORE y
LOCKUP_DETECTOR y
HARDLOCKUP_DETECTOR y
'';
} ];
}
Debugging a failed configuration
As dependencies between kernel configurations items need to be addressed manually, you can inspect the intermediate nix config file after for instance the error
note: keeping build directory '/tmp/nix-build-linux-config-4.19.0-mptcp_v0.94.1.drv-0'
by opening /tmp/nix-build-linux-config-4.19.0-mptcp_v0.94.1.drv-0/.attr-0
.
Developing kernel modules
See also: NixOS Manual "Developing kernel modules"
If you work on an out-of-tree kernel module the workflow could look as follow:
#include <linux/module.h>
#define MODULE_NAME "hello"
static int __init hello_init(void)
{
printk(KERN_INFO "hello world!");
return 0;
}
static void __exit hello_cleanup(void) {}
module_init(hello_init);
module_exit(hello_cleanup);
$ nix-shell '<nixpkgs>' -A linux.dev
$ make -C $(nix-build -E '(import <nixpkgs> {}).linux.dev' --no-out-link)/lib/modules/*/build M=$(pwd) modules
$ insmod ./hello.ko
$ dmesg | grep hello
[ 82.027229] hello world!
It is (currently) not possible to run make menuconfig
in the checked out linux kernel sources. This is because ncurses
is not part of your working environment when you start it with nix-shell '<nixpkgs>' -A linuxPackages.kernel
.
This nix-shell hack adds ncurses as a build dependency to the kernel:
$ nix-shell -E 'with import <nixpkgs> {}; linux.overrideAttrs (o: {nativeBuildInputs=o.nativeBuildInputs ++ [ pkgconfig ncurses ];})'
[nix-shell] $ unpackPhase && cd linux-*
[nix-shell] $ make menuconfig
(thanks to sphalerite)
make xconfig
Similarly to make menuconfig, you need to import qt in the environment:
$ nix-shell -E 'with import <nixpkgs> {}; linux.overrideAttrs (o: {nativeBuildInputs=o.nativeBuildInputs ++ [ pkgconfig qt5.qtbase ];})'
If the source was unpacked and an initial config exists, you can run make xconfig KCONFIG_CONFIG=build/.config