内核是操作系统中促进 硬件 和 软件 组件之间交互的部分。在大多数系统中,它在启动时被加载,位于 引导加载程序 之后,负责处理 I/O 请求以及键盘、显示器、网络适配器和扬声器等外围设备。通常,内核负责 内存管理、进程管理、设备管理、系统调用 和 安全。
应用程序使用 系统调用 机制来请求操作系统的服务,并且在大多数情况下,这个请求通过操作系统提供的库传递给内核,以调用相关内核函数。当内核执行这些低级任务时,它驻留在内存的一个单独部分,称为 受保护的内核空间,该空间不能被应用程序和系统的其他部分访问。相反,像浏览器、文本编辑器、窗口管理器或音频/视频播放器这样的应用程序使用内存的另一个独立区域,即 用户空间。这种分离防止了用户数据和内核数据相互干扰,导致不稳定和速度变慢,同时也防止了有故障的应用程序崩溃整个操作系统。
由于管理系统调用和资源的方式不同,存在不同的内核设计。例如,宏内核 将所有操作系统指令运行在相同的地址空间中 以追求速度,而 微内核 为用户和内核服务使用不同的空间 以实现模块化。除此之外,还有 混合内核、纳米内核 和 外核。混合内核架构基于结合微内核和宏内核的特点。
Linux 内核 是开源的、宏内核且类 Unix 的操作系统内核,用于 Linux 发行版、各种嵌入式系统(如路由器)以及所有基于 Android 的系统。林纳斯·托瓦兹 在 1991 年构思并创建了 Linux 内核,至今仍有成千上万的开发者在持续开发它。它是 自由及开源软件 的一个突出例子,也被用于其他自由软件项目,特别是 GNU 操作系统。 尽管基于 Linux 的操作系统主导了大部分计算领域,但它仍然带有一些设计缺陷,这些缺陷在 Linux 早期曾引发大量争论。例如,它拥有 最大的占用空间 和 最高的复杂性,超过了其他类型的内核。但这是宏内核固有的设计特性。这类设计问题促使开发者向 Linux 内核添加了其他内核所不具备的新功能和机制。
与标准的宏内核不同,Linux 内核也是 模块化的,接受 可加载内核模块 (LKM),通常用于支持新的 硬件(作为设备驱动程序)和/或 文件系统,或添加 系统调用。由于 LKM 可以在 运行时 加载和卸载到系统,它们具有无需重启和重新编译即可扩展内核的优势。因此,模块提供的内核功能不会在不被使用时驻留内存,相关的模块可以被卸载以释放内存和其他资源。
可加载内核模块位于 Linux 中的 /lib/modules,扩展名为 .ko(内核对象)。lsmod 命令可用于列出已加载的内核模块,而 modprobe 或 insmod/rmmod 用于加载或卸载内核模块。insmod/rmmod 用于独立于 modprobe 且无需安装到 /lib/modules/$(uname -r) 的模块。
下面是一个简单的 Linux 内核模块示例,它在加载和卸载时打印一条消息。使用 Makefile 构建和安装该 模块 的步骤如下所示。``` make # build sudo make install # install sudo modprobe lkm_example # load sudo modprobe -r lkm_example # unload
下面的 [dmesg](https://linux.die.net/man/8/dmesg) 命令用于获取内核的消息缓冲区。```
[16994.295552] [+] Example kernel module loaded.
[16996.325674] [-] Example kernel module unloaded.
kmon 提供了一个基于文本的用户界面,用于管理 Linux 内核模块并监控内核活动。所谓管理,是指加载、卸载、黑名单化以及显示模块信息。内核模块的这些更新、有关硬件的日志以及其他内核消息,可以通过 kmon 的实时活动监视器进行跟踪。由于在 Linux 中执行这些任务需要使用不同的工具,例如 dmesg 和 kmod,kmon 旨在将它们集中到一个终端窗口中,尽可能简化使用过程,同时保持功能完整。
kmon 使用 Rust 编写,并借助 Ratatui 和 termion 库来实现其基于文本的用户界面。
kmon 可以通过 Cargo 从 crates.io 安装,前提是已安装 Rust。``` cargo install kmon
最低支持的Rust版本(MSRV)为`1.74.1`。
### Arch Linux
**kmon**可以从Arch Linux的[官方仓库](https://www.archlinux.org/packages/extra/x86_64/kmon/)安装。```
pacman -S kmon
此外,还有一个开发包位于AUR上。使用你喜欢的AUR helper进行安装。例如,``` paru -S kmon-git
### Nixpkgs
**kmon** 可以使用 [Nix 包管理器](https://nixos.org/nix/) 从 `nixpkgs-unstable` 频道安装。```
nix-channel --add https://nixos.org/channels/nixpkgs-unstable
nix-channel --update nixpkgs
nix-env -iA nixpkgs.kmon
在 NixOS 上:``` nix-channel --add https://nixos.org/channels/nixos-unstable nix-channel --update nixos nix-env -iA nixos.kmon
### Alpine Linux
**kmon** 可用于 [Alpine Edge](https://pkgs.alpinelinux.org/packages?name=kmon&branch=edge)。在启用 [社区仓库](https://wiki.alpinelinux.org/wiki/Repositories) 后,可通过 [apk](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper) 安装。```
apk add kmon
```
docker run -it --cap-add syslog orhunp/kmon:tagname
#### 构建```
docker build -t kmon .
docker run -it --cap-add syslog kmon
### 手册
1. 从 [releases](https://github.com/orhun/kmon/releases) 部分下载最新的二进制文件,并选择 [glibc](https://en.wikipedia.org/wiki/Glibc) 或 [musl-libc](https://musl.libc.org/) 二进制文件。
2. 要下载使用 [glibc](https://en.wikipedia.org/wiki/Glibc) 编译的软件包,请运行:```
wget https://github.com/orhun/kmon/releases/download/v[VERSION]/kmon-[VERSION]-x86_64-unknown-linux-gnu.tar.gz
3. 提取文件。```
tar -xvzf kmon-*.tar.gz
5. 运行该二进制文件。```
./kmon
将二进制文件移动到 /usr/local/bin/,以便使用 kmon 命令从终端运行。
在构建时,手册页和 Shell 补全文件会生成在 target 目录中。
要使用 X11 的复制/粘贴命令,需要安装 libxcb。
例如:在 Debian/Ubuntu* 上安装 libxcb1-dev 包,在 Fedora/openSUSE/Void Linux 上安装 libxcb-devel 包。
kmon [OPTIONS] [COMMAND]
### 选项```
-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
-E, --regex Interpret the module search query as a regular expression
-h, --help Print help information
-V, --version Print version information
sort Sort kernel modules
#### 排序```
kmon sort [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
## 快捷键
| | |
| ----------------------- | ------------------------------------- |
| `[?], F1` | 帮助 |
| `right/left, h/l` | 在块之间切换 |
| `up/down, k/j, alt-k/j` | 上下滚动 [选中块] |
| `pgup/pgdown` | 上下滚动 [内核活动] |
| `</>` | 上下滚动 [模块信息] |
| `alt-h/l` | 左右滚动 [内核活动] |
| `ctrl-t/b, home/end` | 滚动到顶部/底部 [模块列表] |
| `alt-e/s` | 展开/收缩选中块 |
| `ctrl-x` | 改变块的位置 |
| `ctrl-l/u, alt-c` | 清除内核环形缓冲区 |
| `[d], alt-d` | 显示依赖模块 |
| `[1]..[9]` | 跳转到依赖模块 |
| `[\], tab, backtab` | 显示下一个内核信息 |
| `[/], s, enter` | 搜索内核模块 |
| `[+], i, insert` | 加载内核模块 |
| `[-], u, backspace` | 卸载内核模块 |
| `[x], b, delete` | 将内核模块加入黑名单 |
| `ctrl-r, alt-r` | 重新加载内核模块 |
| `m, o` | 显示选项菜单 |
| `y/n` | 执行/取消命令 |
| `c/v` | 复制/粘贴 |
| `r, F5` | 刷新 |
| `q, ctrl-c/d, ESC` | 退出 |
## 功能特性
### 帮助
在终端 UI 运行时按 `?` 可查看快捷键。

### 导航与滚动
使用 `方向键` 在块之间导航和滚动。

#### 滚动内核活动
某些内核消息可能过长,无法完全显示在内核活动块中(因为不换行)。此时,可以使用 `alt-h & alt-l` 键水平滚动内核活动。垂直滚动机制与其他块相同。

#### 平滑滚动
可以使用 `alt-j & alt-k` 键缓慢滚动内核活动和模块信息块。

### 选项菜单
`m` 和 `o` 键可作为内核管理操作的快捷方式。按下后,将显示一个选项菜单,用于管理当前选中的内核模块。

### 块大小
使用 `alt-e & alt-s` 键可展开/收缩选中块。

### 块位置
使用 `ctrl-x` 键可更改块的位置。

### 内核信息
使用 `\, tab, backtab` 中的任意键可在内核发行版、版本和平台信息之间切换。

### 模块信息
选中模块时,会显示其状态。

#### 显示依赖模块
使用 `d, alt-d` 中的任意键显示选中模块的所有依赖模块。

#### 跳转到依赖模块
要从父模块跳转到依赖的内核模块,可以使用 `数字键`(1-9)指定 _被使用_ 列中模块的索引。

### 搜索模块
使用方向键或 `/, s, enter` 中的任意键切换到搜索区域,然后输入模块名称的搜索查询。

### 加载模块
要向 Linux 内核添加模块,请使用 `+, i, insert` 中的任意键切换到加载模式,并提供要加载的模块名称。然后使用 `y/n` 确认/取消加载命令的执行。

用于加载模块的命令:```
modprobe <module_name> || insmod <module_name>.ko
使用 -、u、backspace 键之一从 Linux 内核中卸载选定的模块。

用于卸载模块的命令:``` modprobe -r <module_name> || rmmod <module_name>
### 屏蔽一个模块
[黑名单机制](https://wiki.archlinux.org/index.php/Kernel_module#Blacklisting) 是一种阻止内核模块加载的机制。要屏蔽选定的模块,请使用 `x, b, delete` 键中的一个并确认执行。

用于屏蔽模块的命令:```
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
使用 ctrl-r 或 alt-r 键重新加载选中的模块。

用于重新加载模块的命令:``` modprobe -r <module_name> || rmmod <module_name> && modprobe <module_name> || insmod <module_name>.ko
### 清除环形缓冲区
内核环形缓冲区可以通过使用 `ctrl-l/u, alt-c` 键之一来清除。
```
dmesg --clear
c/v 键已设置为复制/粘贴操作。

在输入模式下,使用 ctrl-c/ctrl-v 进行复制和粘贴。
sort 子命令可用于按名称、大小或依赖模块对内核模块进行排序。```
kmon sort --name
kmon sort --size
kmon sort --dependent

此外,`-r, --reverse` 标志用于反转内核模块列表。```
kmon --reverse

kmon 默认使用终端的颜色,但可以通过 -c, --color 选项指定高亮颜色。或者,可以通过 -a, --accent-color 选项设置默认文本颜色。
支持的终端颜色有:black, red, green, yellow, blue, magenta, cyan, gray, darkgray, lightred, lightgreen, lightyellow, lightblue, lightmagenta, lightcyan, white。```
kmon --color red

#### 使用自定义颜色
提供一个十六进制值用于颜色。```
kmon --color 19683a

默认文本颜色在某些具有透明度的主题上可能导致可读性问题。-a, --accent-color 选项的使用方式与 -c, --color 选项类似,可用来解决此问题。```
kmon --color 6f849c --accent-color e35760

### Unicode 符号
使用 `-u, --unicode` 参数来显示区块标题的 Unicode 符号。```
kmon --unicode

-t, --tickrate 选项可用于设置终端用户界面的刷新间隔(毫秒)。

-E, --regex 选项可通过正则表达式搜索模块。
kmon 旨在成为 Linux 内核管理的标准工具,同时支持大多数 Linux 发行版。
为实现这一目标,kmon 应可通过不同的包管理器(如 Snap* 和 RPM)获取。
系统需要具备 dmesg 和 kmod 等基本工具,kmon 才能正常工作。因此下一步将是仅使用系统资源来实现这些功能。
与 Linux 内核相关的管理操作应在 kmon 中实现,以最小化对命令行和其他工具的依赖。
kmon 应在不同架构上进行测试和报告,以便进一步开发和支持。
| Fedora 31 | Debian 10 | Manjaro 19 |
|---|---|---|
![]() | ![]() | ![]() |
| Ubuntu 18.04 | openSUSE | Void Linux |
|---|---|---|
![]() | ![]() | ![]() |
通过在 GitHub Sponsors 上支持我,来支持我的项目开发。
GNU 通用公共许可证(3.0)
版权所有 © 2020-2024,Orhun Parmaksız