Linux Kernel Modules and System Tuning: Day 22 - The Engine Under the Hood

Hrithik DhakreyHrithik Dhakrey
9 min read

You know that moment when you plug in a USB device and it just works? Or when you connect to WiFi and everything magically happens? That's kernel modules working behind the scenes. Today, I want to pull back the curtain and show you the engine that makes Linux tick.

Don't worry—we're going to make this beginner-friendly. I remember when someone first mentioned "kernel modules" to me, and I thought it sounded impossibly complex. But once I understood what they actually do, it was like finally understanding how the magic tricks work.

What Are Kernel Modules, Really?

Think of the Linux kernel as the brain of your computer. But unlike a human brain that's fixed, the Linux kernel is modular—you can add and remove pieces while it's running.

The Restaurant Kitchen Analogy

Imagine your Linux system as a busy restaurant:

  • The Kitchen (Kernel): The core area where all the cooking happens

  • The Chefs (Built-in functions): Always there, handling basic tasks

  • The Specialists (Modules): Called in when needed—the pastry chef for desserts, the sushi master for Japanese cuisine

When a customer orders sushi (you plug in a USB device), the restaurant manager (kernel) calls in the sushi specialist (USB module) to handle that specific task.

Why This Matters to You

Without modules: Your kernel would need to include every possible driver and feature, making it huge and slow.

With modules: Your kernel starts lean and fast, loading only what you need when you need it.

My First Encounter with Kernel Modules

I'll never forget the first time I had to deal with kernel modules. I bought a new WiFi adapter, plugged it in, and... nothing. No internet. The device wasn't recognized.

My friend, a Linux veteran, typed a few commands:

lsmod | grep wifi
modprobe rtl8812au

Suddenly, my WiFi adapter worked! That was my first glimpse into the modular magic of Linux.

Understanding How Modules Work

The Module Lifecycle

Every kernel module goes through these states:

  1. Unloaded: Module exists as a file but isn't active

  2. Loading: Module is being inserted into the kernel

  3. Loaded: Module is active and providing functionality

  4. Unloading: Module is being removed from the kernel

Real-World Example: USB Storage

Let's trace what happens when you plug in a USB drive:

# Before plugging in the USB drive
lsmod | grep usb_storage
# (probably shows nothing)

# Plug in your USB drive
# The kernel automatically detects it and loads modules

# Check what modules are now loaded
lsmod | grep usb

You'll see modules like:

  • usb_storage: Handles USB storage devices

  • sd_mod: SCSI disk support (USB drives use SCSI commands)

  • usb_core: Core USB functionality

Essential Module Commands You'll Actually Use

Checking What's Currently Loaded

# List all loaded modules
lsmod

# Search for specific modules
lsmod | grep wifi
lsmod | grep bluetooth
lsmod | grep sound

Real example: When my sound stopped working, I ran:

lsmod | grep snd

And discovered the sound modules weren't loaded.

Loading Modules Manually

# Load a module
sudo modprobe module_name

# Load a module with parameters
sudo modprobe module_name parameter=value

Story time: I once had a graphics card that needed a specific parameter to work properly:

sudo modprobe nvidia nvidia-drm.modeset=1

Removing Modules

# Remove a module
sudo modprobe -r module_name

# Force remove (be careful!)
sudo rmmod module_name

When I use this: Sometimes a WiFi module gets stuck and I need to reload it:

sudo modprobe -r iwlwifi
sudo modprobe iwlwifi

Getting Module Information

# Get detailed info about a module
modinfo module_name

# Example: Learn about your WiFi module
modinfo iwlwifi

This shows you:

  • What the module does

  • What parameters it accepts

  • Who wrote it

  • What hardware it supports

System Tuning: Making Linux Faster

Now that you understand modules, let's talk about system tuning—making your Linux system run better.

The /proc/sys Directory: Your System's Control Panel

Linux has a special directory called /proc/sys that contains files representing system settings. Think of it as your system's control panel, but in file form.

# Look at the system tuning categories
ls /proc/sys/

You'll see directories like:

  • vm/: Virtual memory settings

  • net/: Network settings

  • kernel/: Kernel behavior settings

  • fs/: Filesystem settings

Real-World Tuning Examples

Making Your System More Responsive

# Check current swappiness (how aggressively Linux uses swap)
cat /proc/sys/vm/swappiness

# Make it less likely to swap (good for systems with plenty of RAM)
echo 10 | sudo tee /proc/sys/vm/swappiness

What this does: By default, Linux might start swapping when RAM is 60% full. Setting it to 10 means it waits until RAM is 90% full.

Improving Network Performance

# Increase network buffer sizes for better throughput
echo 16777216 | sudo tee /proc/sys/net/core/rmem_max
echo 16777216 | sudo tee /proc/sys/net/core/wmem_max

When this helps: If you're transferring large files over the network or running a web server.

Faster File Operations

# Increase the number of files that can be watched
echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches

Real scenario: IDEs like VS Code use file watching. If you're working on large projects, you might hit the default limit.

Making Changes Permanent

The changes above only last until reboot. To make them permanent, edit /etc/sysctl.conf:

# Edit the system configuration
sudo nano /etc/sysctl.conf

# Add your settings
vm.swappiness = 10
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.inotify.max_user_watches = 524288

# Apply the changes
sudo sysctl -p

Creating Your First Simple Kernel Module

Let's create a "Hello World" kernel module. Don't worry—it's simpler than you think!

The Module Code

Create a file called hello.c:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

// Function called when module is loaded
static int __init hello_init(void)
{
    printk(KERN_INFO "Hello from the kernel!\n");
    return 0;  // 0 means success
}

// Function called when module is removed
static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye from the kernel!\n");
}

// Register the functions
module_init(hello_init);
module_exit(hello_exit);

// Module information
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple hello world module");
MODULE_VERSION("1.0");

The Makefile

Create a Makefile:

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Building and Testing

# Install kernel headers (needed for compilation)
sudo apt install linux-headers-$(uname -r)  # Ubuntu/Debian
sudo dnf install kernel-devel              # Fedora

# Compile the module
make

# Load the module
sudo insmod hello.ko

# Check if it loaded
lsmod | grep hello

# Check kernel messages
dmesg | tail

# Remove the module
sudo rmmod hello

# Check kernel messages again
dmesg | tail

What you'll see: Messages like "Hello from the kernel!" and "Goodbye from the kernel!" in the kernel log.

Practical System Monitoring and Tuning

Understanding System Load

# Check system load
uptime

# Monitor system resources
htop
iostat 1    # Disk I/O every second
sar 1       # System activity every second

Reading load averages: If you see "load average: 1.5, 1.2, 0.8", that means:

  • Last 1 minute: 1.5 (50% above capacity)

  • Last 5 minutes: 1.2 (20% above capacity)

  • Last 15 minutes: 0.8 (20% below capacity)

Memory Optimization

# Check memory usage
free -h

# Clear caches (safe, but usually unnecessary)
sudo sync
echo 3 | sudo tee /proc/sys/vm/drop_caches

When to use cache clearing: Almost never in normal operation. Linux manages caches very well.

Disk Performance Tuning

# Check disk scheduler
cat /sys/block/sda/queue/scheduler

# Change to deadline scheduler (good for SSDs)
echo deadline | sudo tee /sys/block/sda/queue/scheduler

# Check disk stats
iostat -x 1

Common Troubleshooting Scenarios

WiFi Module Won't Load

# Check what WiFi hardware you have
lspci | grep -i wireless

# Check available WiFi modules
find /lib/modules/$(uname -r) -name "*wifi*" -o -name "*wireless*"

# Try loading different modules
sudo modprobe iwlwifi  # Intel
sudo modprobe ath9k    # Atheros
sudo modprobe rt2800usb # Realtek USB

Graphics Issues

# Check graphics hardware
lspci | grep -i vga

# Check loaded graphics modules
lsmod | grep -i nvidia
lsmod | grep -i radeon
lsmod | grep -i intel

# Reload graphics module
sudo modprobe -r nvidia
sudo modprobe nvidia

Sound Problems

# Check sound modules
lsmod | grep snd

# Reload ALSA
sudo modprobe -r snd_hda_intel
sudo modprobe snd_hda_intel

# Reset PulseAudio
pulseaudio -k
pulseaudio --start

Performance Monitoring Tools

Built-in Tools

# CPU usage
top
htop

# Memory usage
free -h
cat /proc/meminfo

# Disk usage
df -h
du -sh /home/*

# Network usage
nethogs  # Per-process network usage
iftop    # Network traffic

Understanding /proc/cpuinfo

# Check CPU information
cat /proc/cpuinfo

# Count CPU cores
nproc

# Check CPU frequency
cat /proc/cpuinfo | grep MHz

Safety and Best Practices

Module Safety Rules

  1. Never load unknown modules: They run with full kernel privileges

  2. Backup before tuning: System changes can make your system unstable

  3. Test before permanent: Try settings temporarily before making them permanent

  4. Document changes: Keep notes of what you've modified

Recovery Techniques

# Boot with a different kernel (from GRUB menu)
# Usually shows up as "Advanced options"

# Reset all sysctl settings
sudo sysctl -p /etc/sysctl.conf

# Remove all custom modules
sudo modprobe -r module_name

Real-World Use Cases

Gaming Performance

# Reduce input lag
echo 1 | sudo tee /proc/sys/net/core/netdev_budget

# Prioritize performance over power saving
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

Server Optimization

# Increase file descriptor limits
echo 65536 | sudo tee /proc/sys/fs/file-max

# Optimize TCP settings
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_window_scaling
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_timestamps

Development Environment

# Increase inotify limits for file watching
echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches

# Increase shared memory for IDEs
echo 268435456 | sudo tee /proc/sys/kernel/shmmax

When Things Go Wrong

Module Won't Load

Error: "Required key not available" Solution: Disable Secure Boot in BIOS, or sign the module

Error: "Invalid module format" Solution: Module was compiled for different kernel version

Error: "Device or resource busy" Solution: Something is using the device; find and stop it

System Becomes Unresponsive

  1. Try Ctrl+Alt+F2: Switch to text console

  2. Magic SysRq keys: Alt+SysRq+R,E,I,S,U,B (safely reboot)

  3. Boot from recovery: Use GRUB recovery mode

The Learning Journey

Understanding kernel modules and system tuning is like learning to be a mechanic for your Linux system. You don't need to know everything, but understanding the basics helps you:

  • Troubleshoot hardware issues more effectively

  • Optimize performance for your specific use case

  • Understand error messages that mention modules

  • Make informed decisions about system configuration

What's Next?

You now understand:

  • How kernel modules provide modular functionality

  • Basic system tuning concepts

  • How to monitor and optimize your system

  • Recovery techniques when things go wrong

The world of kernel modules and system tuning is vast, but you've got the foundation. From here, you can explore:

  • Writing more complex kernel modules

  • Advanced performance profiling

  • Kernel debugging techniques

  • System call tracing

Remember: the kernel is powerful but fragile. Always test changes carefully, and don't be afraid to revert if something doesn't work as expected.

0
Subscribe to my newsletter

Read articles from Hrithik Dhakrey directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Hrithik Dhakrey
Hrithik Dhakrey