
커널은 하드웨어 구성 요소와 소프트웨어 구성 요소 간의 상호 작용을 가능하게 하는 운영 체제의 핵심 부분입니다. 대부분의 시스템에서 커널은 부트로더 다음으로 시작될 때 로드되며 I/O 요청과 키보드, 모니터, 네트워크 어댑터, 스피커 같은 주변 장치를 처리합니다. 일반적으로 커널은 메모리 관리, 프로세스 관리, 장치 관리, 시스템 호출, 보안을 담당합니다. 애플리케이션은 시스템 호출 메커니즘을 사용하여 운영 체제에 서비스를 요청하며, 대부분의 경우 이 요청은 관련 커널 함수를 호출하기 위해 운영 체제가 제공하는 라이브러리를 통해 커널에 전달됩니다. 커널이 이러한 저수준 작업을 수행하는 동안, 애플리케이션 및 기타 시스템 부분에서 접근할 수 없는 보호된 커널 공간이라는 메모리의 별도 영역에 상주합니다. 반대로 브라우저, 텍스트 편집기, 창 관리자 또는 오디오/비디오 플레이어 같은 애플리케이션은 메모리의 다른 별도 영역인 사용자 공간을 사용합니다. 이러한 분리는 사용자 데이터와 커널 데이터가 서로 간섭하여 불안정성과 느려짐을 유발하는 것을 방지하고, 오작동하는 애플리케이션 프로그램이 전체 운영 체제를 중단시키는 것을 방지합니다. 시스템 호출과 리소스를 관리하는 다양한 방식으로 인해 여러 커널 설계가 존재합니다. 예를 들어, 모놀리식 커널은 속도를 위해 모든 운영 체제 명령을 동일한 주소 공간에서 실행하는 반면, 마이크로커널은 모듈성을 위해 사용자 서비스와 커널 서비스에 서로 다른 공간을 사용합니다. 그 외에도 하이브리드 커널, 나노커널, 엑소커널이 있습니다. 하이브리드 커널 아키텍처는 마이크로커널과 모놀리식 커널의 측면을 결합한 것입니다.
리눅스 커널은 오픈 소스이며 모놀리식이고 유닉스 계열 운영 체제 커널로, 리눅스 배포판, 라우터와 같은 다양한 임베디드 시스템, 그리고 모든 안드로이드 기반 시스템에서 사용됩니다. 리누스 토르발스가 1991년에 리눅스 커널을 구상하고 만들었으며, 오늘날에도 수천 명의 개발자가 계속 개발하고 있습니다. 이는 자유 및 오픈 소스 소프트웨어의 대표적인 예이며, 특히 GNU 운영 체제와 같은 다른 자유 소프트웨어 프로젝트에서도 사용됩니다. 리눅스 기반 운영 체제가 컴퓨팅의 대부분을 지배하고 있지만, 리눅스 초창기부터 논쟁이 많았던 몇 가지 설계 결함을 여전히 가지고 있습니다. 예를 들어, 다른 유형의 커널에 비해 가장 큰 풋프린트와 가장 큰 복잡성을 가지고 있습니다. 하지만 이것은 모놀리식 커널이 본질적으로 갖는 설계 특징입니다. 이러한 종류의 설계 문제는 개발자들이 다른 커널이 갖지 않은 새로운 기능과 메커니즘을 리눅스 커널에 추가하도록 이끌었습니다.
표준 모놀리식 커널과 달리 리눅스 커널은 모듈식이기도 하며, 일반적으로 새로운 하드웨어 (장치 드라이버로) 및/또는 파일 시스템 지원을 추가하거나 _시스템 호출_을 추가하는 데 사용되는 로드 가능한 커널 모듈 (LKM) 을 허용합니다. LKM은 런타임 시 시스템에 로드 및 언로드될 수 있으므로 재부팅이나 재컴파일 없이 커널을 확장할 수 있는 장점이 있습니다. 따라서 모듈이 제공하는 커널 기능은 사용되지 않고 메모리에 상주하지 않으며, 관련 모듈을 언로드하여 메모리 및 기타 리소스를 확보할 수 있습니다.
로드 가능한 커널 모듈은 리눅스에서 .ko (커널 오브젝트) 확장자를 가지고 /lib/modules에 위치합니다. 로드된 커널 모듈을 나열하려면 lsmod 명령을 사용할 수 있고, 커널 모듈을 로드 또는 언로드하려면 modprobe 또는 insmod/rmmod를 사용합니다. insmod/rmmod는 modprobe에 의존하지 않고 /lib/modules/$(uname -r)에 설치할 필요 없이 모듈에 사용됩니다.
다음은 로드 및 언로드 시 메시지를 출력하는 간단한 리눅스 커널 모듈의 예제입니다. 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은 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**은 `nixpkgs-unstable` 채널에서 [Nix 패키지 관리자](https://nixos.org/nix/)를 사용하여 설치할 수 있습니다.```
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 명령어로 터미널에서 실행합니다.
맨 페이지와 셸 완성 기능은 빌드 시 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` 키 중 하나를 사용하여 검색 영역으로 전환하고 모듈 이름에 대한 검색어를 입력합니다.

### 모듈 로드
리눅스 커널에 모듈을 추가하려면 `+, 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

### 유니코드 심볼
`-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 일반 공중 사용 허가서 (3.0)
저작권 © 2020-2024, Orhun Parmaksız