内核是操作系统的一部分,负责协调硬件和软件组件之间的交互。在大多数系统中,它在启动时由引导加载程序加载,并处理I/O请求以及键盘、显示器、网络适配器和扬声器等外围设备。通常,内核负责内存管理、进程管理、设备管理、系统调用和安全。
应用程序使用系统调用机制向操作系统请求服务,大多数情况下,这个请求通过操作系统提供的库传递给内核,以调用相关的内核函数。当内核执行这些底层任务时,它驻留在内存的一个单独部分,称为受保护的内核空间,应用程序和系统的其他部分无法访问。相比之下,浏览器、文本编辑器、窗口管理器或音视频播放器等应用程序使用内存的另一个单独区域,即用户空间。这种分离防止用户数据和内核数据相互干扰并导致不稳定和速度变慢,同时也防止运行不正常的应用程序使整个操作系统崩溃。
由于管理系统调用和资源的方式不同,存在着不同的内核设计。例如,宏内核为了速度将所有操作系统指令运行在同一地址空间,而微内核为了模块化在不同的空间运行用户和内核服务。除此之外,还有混合内核、纳内核和外内核。混合内核架构基于结合微内核和宏内核的特点。
Linux内核是开源的、宏内核的、类Unix操作系统内核,用于Linux发行版、各种嵌入式系统(如路由器)以及所有基于Android的系统。Linus Torvalds于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 # 构建
sudo make install # 安装
sudo modprobe lkm_example # 加载
sudo modprobe -r lkm_example # 卸载
下面使用dmesg命令检索内核的消息缓冲区。
[16994.295552] [+] Example kernel module loaded.
[16996.325674] [-] Example kernel module unloaded.
kmon提供了一个基于文本的用户界面,用于管理Linux内核模块和监控内核活动。管理指的是加载、卸载、黑名单和显示模块信息。可以通过kmon的实时活动监视器跟踪内核模块的这些更新、硬件日志和其他内核消息。由于Linux中这些任务需要使用不同的工具,如dmesg和kmod,kmon旨在将它们集中在一个终端窗口中,尽可能简化使用,同时保持功能性。 kmon 使用 Rust 编写,并使用 Ratatui 和 termion 库实现其基于文本的用户界面。
目录
安装
Cargo
如果已安装 Rust,可以使用 Cargo 从 crates.io 安装 kmon。
cargo install kmon
最低支持的 Rust 版本 (MSRV) 为 1.70.0
。
Arch Linux
可以从 Arch Linux 官方仓库 安装 kmon。
pacman -S kmon
AUR 上也有开发版本的软件包。使用你喜欢的 AUR 助手 进行安装。例如,
paru -S kmon-git
Nixpkgs
可以使用 Nix 包管理器 从 nixpkgs-unstable
频道安装 kmon。
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。在启用 community 仓库 后,可以通过 apk 安装。
apk add kmon
Docker
docker run -it --cap-add syslog orhunp/kmon:标签名
构建
docker build -t kmon .
运行
docker run -it --cap-add syslog kmon
手动安装
wget https://github.com/orhun/kmon/releases/download/v[版本]/kmon-[版本]-x86_64-unknown-linux-gnu.tar.gz
- 要下载使用 musl-libc 编译的软件包,请运行:
wget https://github.com/orhun/kmon/releases/download/v[版本]/kmon-[版本]-x86_64-unknown-linux-musl.tar.gz
- 解压文件。
tar -xvzf kmon-*.tar.gz
- 进入新文件夹。
cd kmon-[版本]
- 运行二进制文件。
./kmon
-
将二进制文件移动到
/usr/local/bin/
,以便从终端使用kmon
命令运行它。 -
手册页和 shell 补全在构建时生成于
target
目录中。
注意
应安装 libxcb 以使用 X11 的复制/粘贴命令。
例如:对于 Debian/Ubuntu* 安装 libxcb1-dev
包,对于 Fedora/openSUSE/Void Linux 安装 libxcb-devel
包。
使用方法
kmon [选项] [命令]
选项
-a, --accent-color <颜色> 设置强调色,使用十六进制值或颜色名称 [默认: 白色]
-c, --color <颜色> 设置主色,使用十六进制值或颜色名称 [默认: 深灰色]
-t, --tickrate <毫秒> 设置终端刷新率 [默认: 250]
-r, --reverse 反转内核模块列表
-u, --unicode 使用Unicode符号显示区块标题
-h, --help 打印帮助信息
-V, --version 打印版本信息
命令
sort 排序内核模块
排序
kmon sort [选项]
选项:
-s, --size 按大小排序模块
-n, --name 按名称排序模块
-d, --dependent 按依赖模块数量排序模块
-h, --help 打印帮助信息
快捷键
[?], F1 | 帮助 |
右/左, h/l | 在区块间切换 |
上/下, 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) 指定 Used By 列中模块的索引。
搜索模块
使用方向键或 /, s, enter
键之一切换到搜索区域,并输入模块名称的搜索查询。
加载模块
要向Linux内核添加模块,使用 +, i, insert
键之一切换到加载模式,并提供要加载的模块名称。然后使用 y/n
确认/取消执行加载命令。
用于加载模块的命令:
modprobe <模块名称> || insmod <模块名称>.ko
卸载模块
使用 -, u, backspace
键之一从Linux内核中移除选中的模块。
用于移除模块的命令:
modprobe -r <模块名称> || rmmod <模块名称>
将模块列入黑名单
列入黑名单是一种阻止内核模块加载的机制。要将所选模块列入黑名单,请使用 x、b、delete
键之一并确认执行。
用于将模块列入黑名单的命令:
if ! grep -q <模块名称> /etc/modprobe.d/blacklist.conf; then
echo 'blacklist <模块名称>' >> /etc/modprobe.d/blacklist.conf
echo 'install <模块名称> /bin/false' >> /etc/modprobe.d/blacklist.conf
fi
重新加载模块
使用 ctrl-r
或 alt-r
键重新加载所选模块。
用于重新加载模块的命令:
modprobe -r <模块名称> || rmmod <模块名称> && modprobe <模块名称> || insmod <模块名称>.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
选项设置默认文本颜色。
支持的颜色
支持的终端颜色有 黑色、红色、绿色、黄色、蓝色、洋红色、青色、灰色、深灰色、浅红色、浅绿色、浅黄色、浅蓝色、浅洋红色、浅青色、白色
。
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
选项可用于以毫秒为单位设置终端 UI 的刷新间隔。
路线图
kmon 的目标是成为一个标准的 Linux 内核管理工具,同时支持大多数 Linux 发行版。
可访问性
为实现此目标,kmon 应该可以从不同的包管理器(如 Snap* 和 RPM)访问。
依赖项
系统需要有如 dmesg 和 kmod 等基本工具,以便 kmon 能按预期工作。因此,下一步将是仅使用系统资源来实现这些功能。
功能
kmon 应该能够执行有关 Linux 内核的管理操作,以最大限度地减少对命令行和其他工具的依赖。
测试
应在不同的架构上测试和报告 kmon,以进一步开发和支持。
资源
关于项目
文章
媒体报道
- 使用 Kmon 管理和监控 Linux 内核模块(OSTechNix)
- Kmon:Linux 内核管理和监控软件(YouTube 上的 Brodie Robertson)
图库
Fedora 31 | Debian 10 | Manjaro 19 |
---|---|---|
Ubuntu 18.04 | openSUSE | Void Linux |
---|---|---|
社交媒体
- 在Twitter上关注 @kmonitor_
- 关注作者(orhun.dev):
资助
GitHub
通过在GitHub赞助上支持我来支持我项目的开发。
Patreon
Open Collective
许可证
GNU通用公共许可证(3.0)
版权
版权所有 © 2020-2024,Orhun Parmaksız