loading...
Cover image for Kmon! Let's manage the Linux kernel modules! 🐧💻

Kmon! Let's manage the Linux kernel modules! 🐧💻

orhun profile image orhun ・5 min read

Unfortunately, it's common to use a technology without knowing the inner workings of it. However, having a good grasp on the specific details of it might help with various situations like fixing a bug or adding new features to it. Especially if you're a developer/engineer.

I've been using GNU/Linux for years and I really love the uniqueness and simplicity that some distributions provide. It also provides a close to perfect development environment in my opinion, if you customize it.
But one of the things, probably the most important thing, that I neglected to learn its details was the Linux kernel. I was using various tools for adding a module to the Linux kernel to make a program work (like VirtualBox) or I was disabling modules to change the purpose of a hardware. But I've never into the Linux kernel really. It was just being updated regularly and sitting there, waiting to be explored.

My previous experiences taught me that the best way of learning something is creating a project that solves a problem depending on your needs. Also adding some flavors (like using a tech stack that you've not used before) will increase the chance of drowning inside the "ocean of the new stuff". Which is a good thing because it will force you to swim back to the surface. In the context of the project, it will force you to make the project as perfect as possible and finish it. Because as everyone knows, it's always easier to abandon a project.

So I've decided to learn the basics of the Linux kernel including kernel types and its history. It was surely a good idea in order to understand the "core" element of the systems we're using today. And then I created my first Linux kernel module that only prints a message when it's loaded and unloaded. It looked like legacy tools like dmesg, kmod and modprobe are preferred most of the time for Linux kernel management on command line. So I've loaded my example kernel module with modprobe and retrieved the log messages with dmesg. Even though I've checked for other alternative tools, I didn't come across a tool that you can do these operations together at the same time.

Therefore I thought that I should write that tool in a memory-efficient and fast programming language. Rust!

tui-rs is a Rust library for creating text-based user interfaces with different backend options. I've chosen termion for the tool that I'm going to write. But still, one thing was missing. I should find a name for it to keep myself motivated while writing it.

It should be called... Hm... Kernel top? ktop... Nah, it's taken. How about kernel monitor? kmon... A-ha! Come on!

Actually, I've never written something in Rust before kmon. So it was an adventurous journey about the Linux kernel and Rust. I have to say that Rust has a nice development environment and efficient tools like rustfmt and clippy. And writing a Rust application about the Linux kernel on an Arch Linux system... It's not something that you can explain with words.

Oh what happened at the end of this journey? Well, let me show:

come on!

cargo install kmon

You can:

  • see the information of a module
  • search a module
  • load/unload a module
  • blacklist a module
  • and do other cool things

in the text-based interface of kmon.

Here's some examples:

Navigating & Scrolling

Arrow keys are used for navigating between blocks and scrolling.

Navigating & Scrolling

Searching a module

Switch to the search area with arrow keys or using one of the /, s, enter and provide a search query for the module name.

Searching a module

Loading a module

For adding a module to the Linux kernel, switch to load mode with one of the +, i, insert keys and provide the name of the module to load. Then confirm/cancel the execution of the load command with y/n.

Loading a module

The command that used for loading a module:

modprobe <module_name>

Unloading a module

Use one of the -, u, backspace keys to remove the selected module from the Linux kernel.

Unloading a module

The command that used for removing a module:

modprobe -r <module_name>

Blacklisting a module

Blacklisting is a mechanism to prevent the kernel module from loading. To blacklist the selected module, use one of the x, b, delete keys and confirm the execution.

Blacklisting a module

The command that used for blacklisting a module:

if ! grep -q <module_name> /etc/modprobe.d/blacklist.conf; then
  echo 'blacklist <module_name>' >> /etc/modprobe.d/blacklist.conf
  echo 'install <module_name> /bin/false' >> /etc/modprobe.d/blacklist.conf
fi

...

kmon aims to be a standard tool for Linux kernel management while supporting most of the Linux distributions. On that note, here's the distributions that kmon is tested:

Fedora 31 Debian 10 Manjaro 19
kmon on fedora kmon on debian kmon on manjaro
Ubuntu 18.04 openSUSE Void Linux
kmon on ubuntu kmon on opensuse kmon on voidlinux

More information can be found at the project page on GitHub.

Links

Stay safe.

Posted on by:

orhun profile

orhun

@orhun

Open source enthusiast.

Discussion

markdown guide