임베디드 시스템 위에서 작업을 하다보면 경량화 된 리눅스 이미지 위에서 작업을 해야 할 일이 있다. 그러다 보면 Ubutu 나 Debian 같은 Linux 시스템 위에서는 잘 돌아가던 프로그램이 경량화 된 리눅스 위에서는 안돌아가는 경우를 마주할 수 있다. 이런 경우 대부분의 원인은 커널의 모듈이 빠져서 그런데 이런 경우 커널 모듈(Kernel Module)을 추가해주거나 커널 설정(Kernel Config) 를 수정해서 다시 커널을 빌드해줌으로써 문제를 해결할 수 있다. 그렇다면 과연 커널 모듈이란 무엇일까?
커널 모듈은 커널의 기능을 구성하는 코드 조각으로 일반적으로 .ko (Kernel Object) 파일 형태로 저장되며, 필요에 따라 동적으로 로드되고 관리되고 필요한 모듈만 따로 구성함에 따라 커널을 효율적으로 관리할 수 있다.
커널 모듈은 어떤 기능들이 있는가?
- 디바이스 드라이버
예: 네트워크 카드, 저장 장치, 그래픽 카드 등. - 파일 시스템 지원
예: NTFS, ext4 등 - 네트워크 프로토콜 추가
TCP/IP 외의 다양한 네트워크 프로토콜 - 기타 기능 확장
커널에 포함되지 않은 추가 기능
커널 모듈 관련 명령어
다음 명령어들을 마스터해서 커널 모듈들을 확인해보자.
lsmod 를 통해 현재 모듈들을 확인할 수 있다.
lsmod # 커널 모듈 목록 확인

특정 모듈의 상세 정보를 확인하려면 modinfo 명령어를 사용한다.
modinfo <모듈 이름>

해당 커널이 어떤 module 에 dependancy 가 있는지, 모듈의 ko 파일이 어디 위치해 있는지 등을 알 수 있다.
다음 명령어를 통해 모듈을 동적으로 로드하거나 언로드 할 수 있다.
sudo modprobe <모듈 이름>
sudo modprobe -r <모듈 이름>
중요한 점은 위 명령어를 쓰려면 모듈이 kernel 이 빌드될 때 같이 빌드되어 포함되어야 한다는 점이다. 시스템에 .ko 파일이 위치해야 로드도 할 수 있는거고 "로드/언로드" 한다는 것은 부팅할 때 메모리에 올린다는 점이다. (모듈이 있는것과 로드를 하는 점은 다른 개념이다!)
그렇다면 애초에 빌드가 되어있지 않은(ko 파일이 없는) 모듈을 커널에 올리려면 어떻게 해야 할까? 다음 명령어를 사용한다.
sudo insmod /path/to/module.ko # 모듈 추가
sudo rmmod <모듈 이름> # 모듈 삭제
이 명령어를 사용하면 시스템에서 모듈을 ko 파일을 기반으로 추가하고 삭제할 수 있다.
커널 모듈 파일 위치
다음은 커널 모듈 및 관련 파일이 저장되는 주요 경로다:
- 커널 모듈 위치
/usr/lib/modules/<커널 버전>/ - 커널 이미지 위치
/boot/vmlinuz-<커널 버전> - 커널 설정 파일
/boot/config-<커널 버전> - 영구적으로 로드될 모듈 정의 파일
/etc/modules
간단한 커널 모듈 작성해보기
다음은 간단한 "Hello, World!" 커널 모듈 코드를 작성해보자.
hello.c
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void) {
printk(KERN_INFO "Hello, World!\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Onion Kim");
MODULE_DESCRIPTION("A simple hello world kernel module");
코드 설명
- __init와 __exit은 각각 모듈의 초기화 및 정리 단계에서 호출됨.
- printk(KERN_INFO, ...)는 커널 로그에 메시지를 출력.
- MODULE_LICENSE와 같은 매크로는 모듈의 메타데이터를 정의.
Makefile
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
이후 make 명령어를 쳐주면 성공적으로 build 되어 hello.ko 파일이 생성된다.

이후 insmod 와 rmmod 로 생성된 .ko 파일을 로드/언로드 해주자.

커널 메세지가 잘 올라온 것을 확인할 수 있다.
'시스템 프로그래밍' 카테고리의 다른 글
dmesg vs journalctl (0) | 2024.11.23 |
---|---|
SELinux: 리눅스 보안 툴 2 (0) | 2024.11.22 |
AppArmor, 리눅스 보안 툴 (0) | 2024.11.20 |
GStreamer 란? (1) | 2024.11.19 |
왜 자꾸 sudo apt update 를 쳐줘야 할까? (0) | 2024.11.16 |