• Stars
    star
    1,911
  • Rank 23,380 (Top 0.5 %)
  • Language
    Rust
  • License
    GNU General Publi...
  • Created over 4 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Linux Kernel Manager and Activity Monitor ๐Ÿง๐Ÿ’ป


Linux Kernel Manager and Activity Monitor ๐Ÿง๐Ÿ’ป


The kernel is the part of the operating system that facilitates interactions between hardware and software components. On most systems, it is loaded on startup after the bootloader and handles I/O requests as well as peripherals like keyboards, monitors, network adapters, and speakers. Typically, the kernel is responsible for memory management, process management, device management, system calls, and security. Applications use the system call mechanism for requesting a service from the operating system and most of the time, this request is passed to the kernel using a library provided by the operating system to invoke the related kernel function. While the kernel performs these low-level tasks, it's resident on a separate part of memory named protected kernel space which is not accessible by applications and other parts of the system. In contrast, applications like browsers, text editors, window managers or audio/video players use a different separate area of the memory, user space. This separation prevents user data and kernel data from interfering with each other and causing instability and slowness, as well as preventing malfunctioning application programs from crashing the entire operating system.
There are different kernel designs due to the different ways of managing system calls and resources. For example, while monolithic kernels run all the operating system instructions in the same address space for speed, microkernels use different spaces for user and kernel services for modularity. Apart from those, there are hybrid kernels, nanokernels, and, exokernels. The hybrid kernel architecture is based on combining aspects of microkernel and monolithic kernels.

The Linux kernel is the open-source, monolithic and, Unix-like operating system kernel that used in the Linux distributions, various embedded systems such as routers and as well as in the all Android-based systems. Linus Torvalds conceived and created the Linux kernel in 1991 and it's still being developed by thousands of developers today. It's a prominent example of free and open source software and it's used in other free software projects, notably the GNU operating system. Although the Linux-based operating systems dominate the most of computing, it still carries some of the design flaws which were quite a bit of debate in the early days of Linux. For example, it has the largest footprint and the most complexity over the other types of kernels. But it's a design feature that monolithic kernels inherent to have. These kind of design issues led developers to add new features and mechanisms to the Linux kernel which other kernels don't have.

Unlike the standard monolithic kernels, the Linux kernel is also modular, accepting loadable kernel modules (LKM) that typically used to add support for new hardware (as device drivers) and/or filesystems, or for adding system calls. Since LKMs could be loaded and unloaded to the system at runtime, they have the advantage of extending the kernel without rebooting and re-compiling. Thus, the kernel functionalities provided by modules would not reside in memory without being used and the related module can be unloaded in order to free memory and other resources.
Loadable kernel modules are located in /lib/modules with the .ko (kernel object) extension in Linux. While the lsmod command could be used for listing the loaded kernel modules, modprobe or insmod/rmmod is used for loading or unloading a kernel module. insmod/rmmod are used for modules independent of modprobe and without requiring an installation to /lib/modules/$(uname -r).

Here's a simple example of a Linux kernel module that prints a message when it's loaded and unloaded. The build and installation steps of the module using a Makefile are shown below.

make                         # build
sudo make install            # install
sudo modprobe lkm_example    # load
sudo modprobe -r lkm_example # unload

The dmesg command is used below to retrieve the message buffer of the kernel.

[16994.295552] [+] Example kernel module loaded.
[16996.325674] [-] Example kernel module unloaded.

kmon provides a text-based user interface for managing the Linux kernel modules and monitoring the kernel activities. By managing, it means loading, unloading, blacklisting and showing the information of a module. These updates in the kernel modules, logs about the hardware and other kernel messages can be tracked with the real-time activity monitor in kmon. Since the usage of different tools like dmesg and kmod are required for these tasks in Linux, kmon aims to gather them in a single terminal window and facilitate the usage as much as possible while keeping the functionality.

kmon is written in Rust and uses tui-rs & termion libraries for its text-based user interface.

Table of Contents

Installation

Packaging status

Cargo

kmon can be installed from crates.io using Cargo if Rust is installed.

cargo install kmon

Use the --force option to update.

cargo install kmon --force

Arch Linux

kmon can be installed from the Arch Linux official repository.

pacman -S kmon

There are also a development package on AUR. Use your favorite AUR helper to install. For example,

paru -S kmon-git

Nixpkgs

kmon can be installed using Nix package manager from nixpkgs-unstable channel.

nix-channel --add https://nixos.org/channels/nixpkgs-unstable
nix-channel --update nixpkgs
nix-env -iA nixpkgs.kmon

On NixOS:

nix-channel --add https://nixos.org/channels/nixos-unstable
nix-channel --update nixos
nix-env -iA nixos.kmon

Docker

Docker Hub Build Status

docker run -it --cap-add syslog orhunp/kmon:tagname

Build

docker build -t kmon .

Run

docker run -it --cap-add syslog kmon

Manual

  1. Download the latest binary from releases section and pick between glibc or musl-libc binary.
  2. To download the package compiled with glibc run:
wget https://github.com/orhun/kmon/releases/download/v[VERSION]/kmon-[VERSION]-x86_64-unknown-linux-gnu.tar.gz
  1. To download the package compiled with musl-libc run:
wget https://github.com/orhun/kmon/releases/download/v[VERSION]/kmon-[VERSION]-x86_64-unknown-linux-musl.tar.gz
  1. Extract the files.
tar -xvzf kmon-*.tar.gz
  1. Enter in the new folder.
cd kmon-[VERSION]
  1. Run the binary.
./kmon
  1. Move binary to /usr/local/bin/ for running it from the terminal using kmon command.

  2. Man page and shell completions are generated at build time in target directory.

Note

libxcb should be installed for using the copy/paste commands of X11.

e.g: Install libxcb1-dev package for Debian/Ubuntu* and libxcb-devel package for Fedora/openSUSE/Void Linux.

Usage

kmon [OPTIONS] [COMMAND]

Options

-a, --accent-color <COLOR>  Set the accent color using hex or color name [default: white]
-c, --color <COLOR>         Set the main color using hex or color name [default: darkgray]
-t, --tickrate <MS>         Set the refresh rate of the terminal [default: 250]
-r, --reverse               Reverse the kernel module list
-u, --unicode               Show Unicode symbols for the block titles
-h, --help                  Print help information
-V, --version               Print version information

Commands

sort  Sort kernel modules

Sort

kmon sort [OPTIONS]

Options:

-s, --size       Sort modules by their sizes
-n, --name       Sort modules by their names
-d, --dependent  Sort modules by their dependent modules
-h, --help       Print help information

Key Bindings

[?], F1 Help
right/left, h/l Switch between blocks
up/down, k/j, alt-k/j Scroll up/down [selected block]
pgup/pgdown Scroll up/down [kernel activities]
</> Scroll up/down [module information]
alt-h/l Scroll right/left [kernel activities]
ctrl-t/b, home/end Scroll to top/bottom [module list]
alt-e/s Expand/shrink the selected block
ctrl-x Change the block position
ctrl-l/u, alt-c Clear the kernel ring buffer
[d], alt-d Show the dependent modules
[1]..[9] Jump to the dependent module
[\], tab, backtab Show the next kernel information
[/], s, enter Search a kernel module
[+], i, insert Load a kernel module
[-], u, backspace Unload the kernel module
[x], b, delete Blacklist the kernel module
ctrl-r, alt-r Reload the kernel module
m, o Show the options menu
y/n Execute/cancel the command
c/v Copy/paste
r, F5 Refresh
q, ctrl-c/d, ESC Quit

Features

Help

Press '?' while running the terminal UI to see key bindings.

Help

Navigating & Scrolling

Arrow keys are used for navigating between blocks and scrolling.

Navigating & Scrolling

Scrolling Kernel Activities

Some kernel messages might be long enough for not fitting into the kernel activities block since they are not wrapped. In this situation, kernel activities can be scrolled horizontally with alt-h & alt-l keys. Vertical scrolling mechanism is the same as other blocks.

Scrolling Kernel Activities

Smooth Scrolling

alt-j & alt-k keys can be used to scroll kernel activity and module information blocks slowly.

Smooth Scrolling

Options Menu

m and o keys can be used as a shortcut for kernel management operations. When pressed, an options menu will be provided for managing the currently selected kernel module.

Options Menu

Block Sizes

alt-e & alt-s keys can be used for expanding/shrinking the selected block.

Block Sizes

Block Positions

ctrl-x key can be used for changing the positions of blocks.

Block Positions

Kernel Information

Use one of the \, tab, backtab keys to switch between kernel release, version and platform information.

Kernel Information

Module Information

The status of a kernel module is shown on selection.

Module Information

Displaying the dependent modules

Use one of the d, alt-d keys to show all the dependent modules of the selected module.

Displaying the dependent modules

Jumping to dependent modules

For jumping to a dependent kernel module from its parent module, number keys (1-9) can be used for specifying the index of the module on the Used By column.

Dependency Information

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> || insmod <module_name>.ko

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> || rmmod <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

Reloading a module

Use ctrl-r or alt-r key for reloading the selected module.

Reloading a module

The command that used for reloading a module:

modprobe -r <module_name> || rmmod <module_name> && modprobe <module_name> || insmod <module_name>.ko

Clearing the ring buffer

The kernel ring buffer can be cleared with using one of the ctrl-l/u, alt-c keys.

Clearing the ring buffer

dmesg --clear

Copy & Paste

c/v keys are set for copy/paste operations.

Copy & Paste

Use ctrl-c/ctrl-v for copying and pasting while in input mode.

Sorting/reversing the kernel modules

sort subcommand can be used for sorting the kernel modules by their names, sizes or dependent modules.

kmon sort --name
kmon sort --size
kmon sort --dependent

Sorting the kernel modules

Also the -r, --reverse flag is used for reversing the kernel module list.

kmon --reverse

Reversing the kernel modules

Customizing the colors

kmon uses the colors of the terminal as default but the highlighting color could be specified with -c, --color option. Alternatively, default text color can be set via -a, --accent-color option.

Supported colors

Supported terminal colors are black, red, green, yellow, blue, magenta, cyan, gray, darkgray, lightred, lightgreen, lightyellow, lightblue, lightmagenta, lightcyan, white.

kmon --color red

Supported Colors

Using a custom color

Provide a hexadecimal value for the color to use.

kmon --color 19683a

Using a custom color

Changing the accent color

Default text color might cause readability issues on some themes that have transparency. -a, --accent-color option can be used similarly to the -c, --color option for overcoming this issue.

kmon --color 6f849c --accent-color e35760

Changing the accent color

Unicode symbols

Use -u, --unicode flag for showing Unicode symbols for the block titles.

kmon --unicode

Unicode symbols

Setting the terminal tick rate

-t, --tickrate option can be used for setting the refresh interval of the terminal UI in milliseconds.

Setting the terminal tick rate

Roadmap

kmon aims to be a standard tool for Linux kernel management while supporting most of the Linux distributions.

Accessibility

For achieving this goal, kmon should be accessible from different package managers such as Snap* and RPM.

Dependencies

It is required to have the essential tools like dmesg and kmod on the system for kmon to work as expected. Thus the next step would be using just the system resources for these functions.

Features

Management actions about the Linux kernel should be applicable in kmon for minimizing the dependence on to command line and other tools.

Testing

kmon should be tested and reported on different architectures for further development and support.

Resources

About the project

Articles

In the media

Gallery

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

Social Media

Funding

GitHub

Support the development of my projects by supporting me on GitHub Sponsors.

Patreon

Patreon Button

Open Collective

Open Collective backers Open Collective sponsors

Support the open source development efforts by becoming a backer or sponsor.

Open Collective Button

License

GNU General Public License (3.0)

Copyright

Copyright ยฉ 2020-2023, Orhun Parmaksฤฑz

More Repositories

1

git-cliff

A highly customizable Changelog Generator that follows Conventional Commit specifications โ›ฐ๏ธ
Rust
5,800
star
2

systeroid

A more powerful alternative to sysctl(8) with a terminal user interface ๐Ÿง
Rust
997
star
3

gpg-tui

Manage your GnuPG keys with ease! ๐Ÿ”
Rust
991
star
4

halp

A CLI tool to get help with CLI tools ๐Ÿ™
Rust
597
star
5

menyoki

Screen{shot,cast} and perform ImageOps on the command line ๐ŸŒฑ ๐Ÿž๏ธ
Rust
489
star
6

rustypaste

A minimal file upload/pastebin service.
Rust
460
star
7

linuxwave

Generate music from the entropy of Linux ๐Ÿง๐ŸŽต
Zig
399
star
8

pkgtop

Interactive package manager and resource monitor designed for the GNU/Linux.
Go
268
star
9

runst

A dead simple notification daemon ๐Ÿฆก
Rust
234
star
10

zps

A small utility for listing and reaping zombie processes on GNU/Linux.
C
153
star
11

CoolModFiles

A web player that plays some cool MOD files randomly ๐ŸŽถ
JavaScript
122
star
12

kermit

A VTE-based, simple and froggy terminal emulator ๐Ÿธ
C
114
star
13

rust-tui-template

A template for bootstrapping a Rust TUI application with tui-rs & crossterm
Rust
77
star
14

dotfiles

Orhun's Arch Linux configuration files and scripts ๐Ÿ 
Shell
70
star
15

godsays

Rust port of the Terry Davis' (RIP) "god says" program
Rust
69
star
16

rtl_map

FFT-based visualizer for RTL-SDR devices. (RTL2832/DVB-T)
C
67
star
17

battleship-rs

Battleship game implemented in Rust
Rust
65
star
18

git-cliff-action

GitHub action to generate a changelog based on the Git history
Shell
65
star
19

k3pler

Android network connection blocker and packet analyzer built on top of local HTTP proxy.
Java
48
star
20

orhun

My GitHub profile README.md โญ:octocat:
41
star
21

rustypaste-cli

A CLI tool for rustypaste
Rust
36
star
22

ApkServInject

Tool for injecting (smali) services to APK files
Java
30
star
23

cargo-nocode

Cargo subcommand to easily bootstrap nocode applications. Write nothing; deploy nowhere.
Rust
29
star
24

god

Linux utility for simplifying the Git usage.
Go
25
star
25

PSAUX

Android task manager and automated background service killer.
Java
20
star
26

alpkg

Set up Alpine Linux packaging environment with a breeze! ๐Ÿ”
Shell
18
star
27

packaging-rust-for-npm

https://blog.orhun.dev/packaging-rust-for-npm/
JavaScript
17
star
28

Picasso

PIC16F877A based 5V/20MHz development board and PIC programmer
C
15
star
29

PKGBUILDs

Arch Linux packages that I maintain ๐Ÿ”ง
Shell
13
star
30

personal-blog

The source of my blog โœ๐Ÿผ
SCSS
13
star
31

dialogflowbot

Google's Dialogflow implementation on Android with additional features.
Java
11
star
32

i3-workspace-brightness

Utility to auto-adjust the brightness of i3wm workspaces
Rust
11
star
33

Black-Waves

A wavy dark theme for VSCode
10
star
34

HydropotX

Automated and Self-contained Hydroponics System ๐ŸŒฑ
Kotlin
9
star
35

advent-of-code

My Advent of Code solutions ๐Ÿข
Rust
8
star
36

Last-Commit

A VSCode extension that focuses on the last git commit
JavaScript
7
star
37

zig-http-benchmarks

Benchmarking Zig HTTP client against Rust, Go, Python and curl
Zig
6
star
38

binsider

Analyze ELF binaries like a boss (WIP)
Rust
4
star
39

orhun.github.io

Personal website
HTML
4
star
40

base16-kermit

Base16 for kermit
Mustache
3
star
41

godsings

https://melody.godsays.xyz
Python
3
star
42

parseit

A simple text file parsing library powered by regex and glob patterns
Rust
3
star
43

typewriter

Turn your keyboard into a typewriter (WIP)
Rust
2
star
44

firebox-auth-cracker

A CLI tool to brute force the authentication signature of WatchGuard's Firebox
Rust
2
star
45

playfair-rs

Playfair cipher implemented in Rust
Rust
2
star
46

enum-unitary

Trait and macro for unitary enums
Rust
1
star
47

rust-arch-lto

Rust + ABS + LTO = ๐Ÿคฏ (PoC)
Shell
1
star
48

abstractapi-rs

Rust API bindings for the Abstract HTTP API
Rust
1
star
49

rust-tui-example

A very simple TUI program to demonstrate on Rust Munich Meetup #8
Rust
1
star
50

ytpls

[experimental] YouTube Playlist Synchronizer backed by yt-dl & git
Rust
1
star