
Linuxカーネルマネージャーおよびアクティビティモニター 🐧💻
カーネルは、オペレーティングシステムの一部であり、_ハードウェア_と_ソフトウェア_コンポーネント間のやり取りを促進します。ほとんどのシステムでは、_ブートローダー_の後に起動時にロードされ、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 はそれらを1つのターミナルウィンドウに集約し、機能を維持しながら可能な限り使いやすくすることを目指しています。
kmon は Rust で書かれており、テキストベースのユーザーインターフェースに Ratatui と termion ライブラリを使用しています。
kmon は、Rust がインストールされていれば、Cargo を使用して crates.io からインストールできます。``` 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 package manager](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) で利用可能です。[community リポジトリ](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. 最新のバイナリを [リリース](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 コマンドでターミナルから実行できるようにします。
マニュアルページとシェル補完は、ビルド時に 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
## Key Bindings
| | |
| ----------------------- | ------------------------------------- |
| `[?], 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) を使用して、_Used By_ 列のモジュールのインデックスを指定します。

### モジュールの検索
矢印キーまたは `/, 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

#### カスタムカラーの使用
使用する色の16進値を指定します。```
kmon --color 19683a

デフォルトのテキスト色は、透明性のあるテーマによっては可読性の問題を引き起こす可能性があります。この問題を解決するために、-a, --accent-color オプションを -c, --color オプションと同様に使用できます。```
kmon --color 6f849c --accent-color e35760

### Unicode 記号
ブロックタイトルにUnicode記号を表示するには、`-u, --unicode` フラグを使用します。```
kmon --unicode

-t, --tickrate オプションを使用すると、ターミナルUIの更新間隔をミリ秒単位で設定できます。

-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