Kernel Modules
Kernel modules are [[Article description::object files that contain code to extend the kernel of an operating system.]] Kernel modules are used to add support for new hardware and/or filesystems, or for adding system calls. Modules can be built into the kernel or compiled as loadable kernel modules.
Compile-in-kernel modules vs Loadable kernel modules (LKMs)
This page is meant to help picking between compile-in-kernel (<*>
) and compile-as-module (<M>
) when configuring a kernel.
Advantages
A module:
- Is loadable without reboot (at least most of them).
- Results in smaller kernel memory footprint (when the module is not loaded).
- Can be loaded on demand by udev (for example DVB drivers for a DVB stick).
- Allows easy reloading of kernel drivers in case of module crash.
- Allows setting module-specific parameters in /etc/modprobe.d
Drawbacks
Using a module:
- May require an update of the initramfs for modules needed early in the boot process (i.e. filesystem drivers).
- May result in performance losses due to the addition of an API layer and slightly more memory usage.
Also:
- Beware of file system module X located on a partition formatted with X (unbootable system at worst).
Loadable kernel modules
Automatic loading
Loadable modules can be defined in .conf files in the /etc/modules-load.d/ directory in order to load them during the init portion of the system boot process. Each module is listed one per-line. For example:
/etc/modules-load.d/networking.conf
tun e1000e brcmfmac
Blacklist
To avoid a module from loading, add it by name to a file in /etc/modprobe.d/ and precede each module name with the blacklist
keyword:
/etc/modprobe.d/blacklist.conf
blacklist uhci_hcd blacklist nvidia
More information on module blacklisting via /etc/modprobe.d/ can be found by reading the modprobe.d(5) man page:
user $
man 5 modprobe.d
Alternatively, kernel modules can be blacklisted from the secondary bootloader (see GRUB2, systemd-boot, etc.) via parameters passed to the kernel from the kernel command-line. For example, to blacklist the evbug.ko, nvidiafb.ko, and nvidia.ko kernel modules using command-line parameters:
module_blacklist=evbug,nvidiafb,nvidia
More details on backlisting via kernel command-line parameters can be found in the upstream kernel documentation (search for module_blacklist).
Manual loading
A module can be loaded or unloaded manually by the modprobe command. For example, to unload the nvidia
module and load the nouveau
module, run:
root #
modprobe -r nvidia
root #
modprobe nouveau
To list currently loaded modules, run lsmod.
Going completely module-less
This is an advanced topic and not recommended for general use. Modules, in general, make certain drivers easier to load. Also, it is possible to reload a misbehaving driver without reboot by removing and reloading the driver module.
If, for some reason, there is a desire to have a completely module-less system, disable loadable module support in the kernel configuration (making sure to build-in any required drivers/features, of course). Setting CONFIG_MODULES=n
will disable loadable module support:
[ ] Enable loadable module support ----
With a module-less kernel, it is possible to dispense the userspace programs that manage loadable modules (e.g. lsmod, modprobe, etc). To do this, remove kmod
support from packages that use it, and also remove the sys-apps/kmod package. Because sys-apps/kmod is part of the system set, it must first be removed from the set before it can be unmerged.
First, add -kmod
to the system's USE flags in /etc/portage/make.conf.
Next, rebuild installed packages without kmod support:
root #
emerge --ask --deep --newuse --update --verbose @world
Follow any special instructions given by rebuilt packages (for example, if udev was rebuilt, then restart it according to the instructions in the emerge output).
Now add -*sys-apps/kmod
to /etc/portage/profile/packages (create the profile directory and packages file if they don't exist). This removes the sys-apps/kmod package from the system set.
Then unmerge the sys-apps/kmod package:
root #
emerge -ac
If the above command doesn't remove kmod, then some package still depends on it even with the -kmod
USE flag set. Run emerge -pvc sys-apps/kmod to find out which package still depends on kmod.
If a kernel was installed with modules, then also remove the /lib/modules/<kernel-version> directory. Since the kernel was built without any loadable modules, there won't be anything useful in there anymore.
When using a genkernel generated initramfs, it may be necessary to add nomodules
to the kernel command line in the system's bootloader (e.g. GRUB) configuration so that the initramfs does not waste any time looking for modules to load.