Let’s begin with explanation of what hardware module actually is. Then, we will discuss how to list installed modules, get module information, install new modules, and remove modules. So, let’s dive right into this motherfu*ker.
The Linux kernel communicates with devices (USB devices, keyboards, hard drives, magnetic tapes, all kinds of stuff). We know from Windows environment that a device needs driver to work. Similarly, kernel needs a device drivers to understand those devices. But unfortunately, compiling device drivers for all kinds of devices would be dumb. And, it was done like that in the past, when kernel was small and device support was small. Nowadays, as Linux conquers marketplace, it needs to add all those device drivers to its kernel binary file.
This is important to understand, let’s focus a bit here. To avoid compiling tons of code for supported device drivers, kernel can attach single module for specific device. That way, system uses only necessary modules for devices he understands and uses. Modules are published as source code or binary files. Knowing that, only then those files are ready to be inserted onto the kernel.
Standard location for storing module files is in /lib/modules/ directory. This is where insmod and modprobe look for module files by default. Inside this directory, each kernel has its own sub-directory for own modules. This allows you to create modules for each kernel version.
At boot time, kernel loads modules stored in /etc/modules file, one per line. Kernel module configurations are stored in /etc/modules.conf file. Some module depend on others, and they require dependent modules to be run first. These relationships are stored in /lib/modules/kernel-version/modules.dep file. Important thing to mention is that modules_install command is used to install modules. However, modules_install uses depmod utility to determine module dependencies. Once done, it creates modules.dep file. If we modify any modules after that, we should manually run depmod utility to update modules.dep file.
Listing installed modules
Listing modules is done with lsmod command. The lsmod will output all installed modules and their dependencies. The “Used by” header field explains dependency for the given module.
[aldin@arch ~]$ lsmod Module Size Used by nvidia_drm 57344 8 nvidia_modeset 1216512 18 nvidia_drm nvidia 27697152 1740 nvidia_modeset snd_sof_pci 24576 0 snd_sof_intel_byt 20480 1 snd_sof_pci snd_sof_intel_ipc 20480 1 snd_sof_intel_byt snd_sof_intel_hda_common 90112 1 snd_sof_pci snd_soc_hdac_hda 24576 1 snd_sof_intel_hda_common snd_sof_xtensa_dsp 16384 2 snd_sof_intel_hda_common,snd_sof_intel_byt snd_sof_intel_hda 20480 1 snd_sof_intel_hda_common intel_rapl_msr 20480 0
Getting module information
To inspect each module a bit more, use modinfo command. It shows module location (filename: directive), where the module came from, module version, dependencies, description, and more…
[aldin@arch ~]$ modinfo ip_tables filename: /lib/modules/5.8.12-arch1-1/kernel/net/ipv4/netfilter/ip_tables.ko.xz alias: ipt_icmp description: IPv4 packet filter author: Netfilter Core Team <firstname.lastname@example.org> license: GPL srcversion: BB5C6B0520AD469887794CB depends: x_tables retpoline: Y intree: Y name: ip_tables vermagic: 5.8.12-arch1-1 SMP preempt mod_unload sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 65:CF:12:A1:9A:04:F6:A6:AE:BE:6F:43:5D:6E:A2:6A:31:CC:A2:13 sig_hashalgo: sha512 signature: A3:11:44:94:50:77:35:BF:00:04:7E:2B:5D:A6:31:11:87:53:7B:37: 10:C7:5A:FF:E3:79:95:82:47:E0:25:F7:FA:75:BD:EB:6C:AA:E3:DE: 55:76:6D:DE:54:FB:2D:13:54:E2:B1:7A:2B:8B:AD:DC:13:40:38:C7:
Installing new modules
To manually install module, use one of the two commands:
Requires to specify exact file to load. As we have seen before, kernel modules are stored in /lib/modules/ directory. Inside, you will find subdirectories for all kernel modules you can install. Each file has .ko extension, and to install it use the following command:
[aldin@arch ~]$ cd /lib/modules/5.8.12-arch1-1/build/security/selinux/Kconfig
Sadly, one downside to using insmod program is that cannot install dependencies for the module you want to install. For example, if a module needs dependency module, first install its dependencies modules, and then the module you want to install.
In contrary, modprobe command will install all dependencies for specified module. Also, you do not have to specify full path within /lib/modules/ directory. The modprobe is smart enough to look for it recursively throughout the entire directory tree.
|-a||Insert all modules listed on the command line|
|-C||Specify different configuration file other than the default|
|-c||Display current configuration used|
|-d||Specify root directory to use for installing modules|
|-f||Force module installation, even if there are version issues|
|-i||Ignore install and remove commands from configuration file|
|-n||Perform fake module install, just to see if it works|
|-q||Quiet mode (no error messages shown)|
|-s||Send any error messages to syslog facility|
To mention, you can install modules if there is no device to support it – does no harm to the system. Kernel will just ignore unused module. Finally, to remove installed module, use rmmod command, and specify full path within /lib/modules/directory. However, modprobe will find module name if no full path is specified and remove it:
# modprobe -r Kconfig