
Менеджер ядра Linux и монитор активности 🐧💻
Ядро — это часть операционной системы, которая обеспечивает взаимодействие между аппаратными и программными компонентами. В большинстве систем оно загружается при запуске после загрузчика и обрабатывает запросы ввода-вывода, а также периферийные устройства, такие как клавиатуры, мониторы, сетевые адаптеры и динамики. Как правило, ядро отвечает за управление памятью, управление процессами, управление устройствами, системные вызовы и безопасность.
Приложения используют механизм системных вызовов для запроса услуги у операционной системы, и в большинстве случаев этот запрос передаётся ядру с помощью библиотеки, предоставляемой операционной системой, для вызова соответствующей функции ядра. Пока ядро выполняет эти низкоуровневые задачи, оно находится в отдельной области памяти, называемой защищённым пространством ядра, которая недоступна для приложений и других частей системы. Напротив, приложения, такие как браузеры, текстовые редакторы, оконные менеджеры или аудио/видеоплееры, используют другую отдельную область памяти — пространство пользователя. Такое разделение предотвращает взаимное влияние пользовательских данных и данных ядра, вызывающее нестабильность и замедление работы, а также предотвращает сбой всей операционной системы из-за неисправных прикладных программ.
Существуют различные конструкции ядра из-за разных способов управления системными вызовами и ресурсами. Например, в то время как монолитные ядра выполняют все инструкции операционной системы в одном адресном пространстве для скорости, микроядра используют разные пространства для пользовательских и системных служб для модульности. Помимо них, существуют гибридные ядра, наноядра и экзоядра. Архитектура гибридного ядра основана на сочетании аспектов микроядра и монолитного ядра.
Ядро Linux — это открытое, монолитное и Unix-подобное ядро операционной системы, используемое в дистрибутивах Linux, различных встраиваемых системах, таких как маршрутизаторы, а также во всех системах на базе Android. Линус Торвальдс задумал и создал ядро Linux в 1991 году, и до сих пор оно разрабатывается тысячами разработчиков. Это яркий пример свободного и открытого программного обеспечения, и оно используется в других проектах свободного ПО, в частности, в операционной системе GNU. Хотя операционные системы на базе Linux доминируют в большинстве вычислительных систем, они всё ещё несут некоторые недостатки проектирования, которые были предметом значительных дискуссий в ранние дни Linux. Например, оно имеет самый большой размер и наибольшую сложность по сравнению с другими типами ядер. Но это особенность конструкции, присущая монолитным ядрам. Подобные проблемы проектирования побудили разработчиков добавить в ядро Linux новые функции и механизмы, которых нет у других ядер.
В отличие от стандартных монолитных ядер, ядро Linux также является модульным, принимая загружаемые модули ядра (LKM), которые обычно используются для добавления поддержки нового оборудования (в качестве драйверов устройств) и/или файловых систем, или для добавления системных вызовов. Поскольку LKM могут быть загружены и выгружены в систему во время выполнения, они имеют преимущество расширения ядра без перезагрузки и перекомпиляции. Таким образом, функциональность ядра, предоставляемая модулями, не будет находиться в памяти без необходимости, и соответствующий модуль может быть выгружен для освобождения памяти и других ресурсов.
Загружаемые модули ядра находятся в /lib/modules с расширением .ko (kernel object) в Linux. Для вывода списка загруженных модулей ядра можно использовать команду 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 можно установить из crates.io с помощью Cargo, если установлен Rust.``` cargo install kmon
Минимальная поддерживаемая версия Rust (MSRV) — `1.74.1`.
### Arch Linux
**kmon** можно установить из [официального репозитория](https://www.archlinux.org/packages/extra/x86_64/kmon/) Arch Linux.```
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). Он может быть установлен через [apk](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper) после включения [репозитория сообщества](https://wiki.alpinelinux.org/wiki/Repositories).```
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/v1.0.0/kmon-1.0.0-x86_64-unknown-linux-gnu.tar.gz````
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.
Страница руководства и автодополнение оболочки генерируются во время сборки в каталоге target.
libxcb должен быть установлен для использования команд копирования/вставки в X11.
например: установите пакет libxcb1-dev для Debian/Ubuntu* и пакет libxcb-devel для Fedora/openSUSE/Void Linux.
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` | Выйти |
## Возможности
### Справка
Нажмите '`?`' во время работы терминального интерфейса, чтобы увидеть привязки клавиш.

### Навигация и прокрутка
`Клавиши со стрелками` используются для навигации между блоками и прокрутки.

#### Прокрутка активности ядра
Некоторые сообщения ядра могут быть слишком длинными, чтобы поместиться в блок активности ядра, поскольку они не переносятся. В такой ситуации активность ядра можно прокручивать по горизонтали с помощью клавиш `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.
Для корректной работы kmon необходимо наличие на системе таких базовых инструментов, как dmesg и kmod. Таким образом, следующим шагом будет использование только системных ресурсов для этих функций.
Действия по управлению ядром Linux должны быть доступны в kmon, чтобы минимизировать зависимость от командной строки и других инструментов.
kmon должен быть протестирован и опробован на различных архитектурах для дальнейшего развития и поддержки.
| Fedora 31 | Debian 10 | Manjaro 19 |
|---|---|---|
![]() | ![]() | ![]() |
| Ubuntu 18.04 | openSUSE | Void Linux |
|---|---|---|
![]() | ![]() | ![]() |
Поддержите разработку моих проектов, оказав поддержку через GitHub Sponsors.
Поддержите усилия по разработке открытого исходного кода, став сторонником или спонсором.
GNU General Public License (3.0)
Copyright © 2020-2024, Orhun Parmaksız