Linux 커널 모듈 관리하기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 Linux 환경에서 커널 모듈을 관리하는 데 필요한 핵심 기술을 배웁니다. 현재 로드된 모듈 목록을 확인하여 시스템의 활성 구성 요소를 파악하고, 개별 모듈의 용도, 의존성, 기타 매개변수와 같은 상세 정보를 조사하는 방법을 살펴봅니다.

이러한 조사 기술을 바탕으로, 실행 중인 커널에서 모듈을 동적으로 제거하고 다시 로드하는 과정을 연습합니다. 마지막으로, 시스템 부팅 시 특정 커널 모듈이 자동으로 로드되도록 설정하는 방법을 배워, 재시작 후에도 수동 작업 없이 필수 기능이 즉시 사용 가능한 상태가 되도록 구성해 봅니다.

이 실습은 단계별 안내를 통해 학습과 연습을 돕는 가이드형 실습입니다. 각 단계를 주의 깊게 따라가며 실무 경험을 쌓으시기 바랍니다. 통계 데이터에 따르면 이 실습은 초급 수준이며, 95%의 완료율과 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

lsmod 와 modinfo 를 이용한 커널 모듈 목록 확인 및 조사

이 단계에서는 현재 로드된 커널 모듈의 목록을 확인하고 상세 정보를 조사하는 방법을 배웁니다. Linux 커널은 모듈식 구조로 설계되어 있어, 필요에 따라 기능의 일부를 로드하거나 제거할 수 있습니다. 이렇게 동적으로 로드 가능한 부분을 커널 모듈이라고 하며, 주로 장치 드라이버, 파일 시스템 드라이버 또는 시스템 호출과 관련이 있습니다.

먼저 시스템 커널에 현재 로드되어 있는 모든 커널 모듈의 상태를 확인해 보겠습니다. lsmod 명령어를 사용하면 깔끔하고 읽기 쉬운 목록을 볼 수 있습니다. 목록이 길어질 수 있으므로 less 유틸리티로 출력을 전달하여 편리하게 탐색하겠습니다.

터미널에서 다음 명령어를 실행하세요:

lsmod | less

모듈 목록이 나타납니다. 출력 결과는 Module, Size, Used by 세 개의 열로 구성됩니다.

  • Module: 커널 모듈의 이름입니다.
  • Size: 모듈의 크기 (바이트 단위) 입니다.
  • Used by: 현재 이 모듈을 사용 중인 다른 모듈이나 프로세스의 수이며, 그 뒤에 해당 모듈에 의존하는 모듈 목록이 표시됩니다.

출력 결과는 다음과 유사한 형태일 것입니다:

Module                  Size  Used by
nls_iso8859_1          16384  1
nls_cp437              20480  1
vfat                   20480  1
fat                    69632  1 vfat
...

화살표 키를 사용하여 목록을 스크롤할 수 있습니다. q를 누르면 less 뷰어를 종료하고 명령 프롬프트로 돌아갑니다.

이제 모듈 목록을 확인하는 방법을 알았으니, 특정 모듈에 대한 자세한 정보를 얻어보겠습니다. modinfo 명령어는 커널 모듈의 파일 경로, 라이선스, 설명, 작성자 및 의존성과 같은 다양한 세부 정보를 표시합니다.

병렬 포트와 관련된 parport 모듈을 조사해 보겠습니다.

modinfo parport

명령어를 실행하면 parport 모듈에 대한 상세 정보가 표시됩니다.

filename:       /lib/modules/x.x.x-xx-generic/kernel/drivers/parport/parport.ko
license:        GPL
description:    Parallel port driver
author:         Philip Blundell, Tim Waugh, Grant Grundler
srcversion:     <some_version_string>
depends:
retpoline:      Y
intree:         Y
vermagic:       x.x.x-xx-generic SMP mod_unload
sig_id:         ...
signer:         ...
sig_key:        ...
sig_hashalgo:   ...
signature:      ...

이 출력 결과는 모듈 파일 (.ko 파일) 의 정확한 위치, 라이선스, 간략한 설명 등을 알려줍니다. depends 필드가 비어 있는 것을 확인할 수 있는데, 이는 이 모듈이 다른 모듈에 의존하지 않음을 의미합니다.

모듈은 종종 다른 모듈에 의존하기도 합니다. depmod 명령어는 /lib/modules/$(uname -r) 디렉토리의 모듈을 분석하여 모듈 의존성 목록을 생성합니다. 이를 통해 시스템은 필요한 모듈을 자동으로 로드할 수 있습니다. 이 의존성 파일을 생성해 보겠습니다. 이 명령어는 루트 권한이 필요하므로 sudo를 사용합니다.

sudo depmod

이 명령어는 성공적으로 완료되면 보통 아무런 출력도 내보내지 않습니다. 커널의 모듈 디렉토리에 modules.dep라는 파일을 생성하거나 업데이트합니다. 경로의 $(uname -r) 부분은 현재 커널의 릴리스 버전을 삽입하는 명령어 치환 방식입니다.

이제 방금 생성한 의존성 파일을 확인해 보겠습니다.

less /lib/modules/$(uname -r)/modules.dep

이 파일에는 모듈과 그 의존성 목록이 포함되어 있으며, 모듈을 자동으로 관리하는 도구들이 이 파일을 참조합니다. q를 눌러 less를 종료할 수 있습니다.

rmmod 를 이용한 커널 모듈 제거

이 단계에서는 rmmod 명령어를 사용하여 실행 중인 커널에서 커널 모듈을 제거 (언로드) 하는 방법을 배웁니다. 모듈 제거는 하드웨어 문제를 해결하거나, 시스템 메모리를 확보하거나, 더 이상 필요하지 않은 모듈을 정리할 때 유용합니다. 중요한 점은 시스템이나 다른 모듈에서 현재 사용 중이지 않은 모듈만 제거할 수 있다는 것입니다.

조이스틱 지원을 제공하는 joydev 모듈로 실습을 이어가겠습니다. 먼저 이 모듈이 로드되어 있는지 확인해 봅시다. lsmodgrep을 조합하여 출력을 필터링할 수 있습니다.

lsmod | grep joydev

모듈이 로드되어 있다면 다음과 유사한 출력이 나타납니다. 정확한 크기는 다를 수 있습니다.

joydev                 24576  0

Used by 열의 0은 모듈이 로드되어 있지만 현재 어떤 프로세스나 다른 모듈에서도 사용하고 있지 않음을 나타냅니다. 따라서 안전하게 제거할 수 있는 상태입니다. 만약 이 숫자가 0 보다 크다면 rmmod는 실패할 가능성이 높으며, 시스템이 의존하고 있는 모듈이 제거되는 것을 방지합니다.

이제 joydev 모듈을 제거해 보겠습니다. 이 작업은 실행 중인 커널을 수정하므로 sudo를 통해 루트 권한을 얻어야 합니다.

sudo rmmod joydev

rmmod 명령어는 성공 시 보통 아무런 출력을 내보내지 않습니다. 모듈이 성공적으로 제거되었는지 확인하기 위해 다시 한번 lsmod | grep joydev 명령어를 실행합니다.

lsmod | grep joydev

이번에는 아무런 출력도 나오지 않아야 합니다. 출력이 없다는 것은 joydev 모듈이 더 이상 커널에 로드되어 있지 않음을 확인해 주는 것입니다.

insmod 를 이용한 커널 모듈 로드

이 단계에서는 insmod 명령어를 사용하여 실행 중인 커널에 커널 모듈을 수동으로 로드하는 방법을 배웁니다. 이는 rmmod와 반대되는 작업입니다. 최신 시스템에서는 의존성을 자동으로 처리해 주는 modprobe라는 더 발전된 도구를 주로 사용하지만, insmod를 이해하는 것은 커널 모듈의 작동 원리를 배우는 데 있어 기초가 됩니다.

이전 단계에서 joydev 모듈을 제거했습니다. 이제 다시 로드해 보겠습니다. insmod 명령어를 사용할 때는 .ko(Kernel Object) 확장자를 가진 모듈 객체 파일의 전체 경로를 제공해야 합니다.

커널 모듈의 표준 디렉토리는 /lib/modules/$(uname -r)/kernel/이며, 여기서 $(uname -r)은 현재 커널 버전으로 치환됩니다. joydev 모듈은 일반적으로 drivers/input/ 하위 디렉토리에 위치합니다.

전체 경로를 사용하여 joydev 모듈을 로드해 보겠습니다. 이 작업에는 루트 권한이 필요합니다.

sudo insmod /lib/modules/$(uname -r)/kernel/drivers/input/joydev.ko

rmmod와 마찬가지로 insmod도 성공하면 아무런 출력을 내보내지 않습니다.

모듈이 로드되었는지 확인하려면 다시 lsmod | grep joydev 명령어를 사용합니다.

lsmod | grep joydev

명령어를 실행한 후 출력 결과에 joydev 모듈이 표시되면 커널에 성공적으로 다시 로드된 것입니다.

joydev                 24576  0

부팅 시 커널 모듈이 자동으로 로드되도록 설정하기

이 단계에서는 시스템이 시작될 때마다 커널 모듈이 자동으로 로드되도록 설정하는 방법을 배웁니다. insmod를 사용하여 수동으로 모듈을 로드하는 것은 일시적이며 재부팅 후에는 유지되지 않습니다. 변경 사항을 영구적으로 적용하려면 부팅 과정에서 모듈을 로드하도록 시스템을 구성해야 합니다.

systemd를 사용하는 최신 Linux 시스템에서 부팅 시 커널 모듈을 자동으로 로드하는 표준 방법은 /etc/modules-load.d/ 디렉토리에 설정 파일을 추가하는 것입니다. 이 디렉토리에 있는 .conf 확장자를 가진 모든 파일을 시스템이 읽어 들여, 파일 안에 한 줄에 하나씩 나열된 모든 모듈을 로드하려고 시도합니다.

joydev 모듈이 자동으로 로드되도록 설정해 보겠습니다. /etc/modules-load.d/ 안에 joydev.conf라는 파일을 생성하고 그 안에 joydev라는 단어를 추가하겠습니다. echotee 명령어를 sudo와 함께 사용하여 한 번에 처리할 수 있습니다.

echo joydev | sudo tee /etc/modules-load.d/joydev.conf

이 명령어의 작동 원리는 다음과 같습니다:

  • echo joydev는 'joydev'라는 텍스트를 출력합니다.
  • 파이프 |는 이 텍스트를 다음 명령어의 입력으로 전달합니다.
  • sudo tee /etc/modules-load.d/joydev.conf는 전달받은 텍스트를 입력으로 받습니다. tee 명령어는 입력받은 내용을 지정된 파일 (/etc/modules-load.d/joydev.conf) 에 기록하는 동시에 화면에도 출력합니다. 이 디렉토리는 보호되어 있어 쓰기 권한을 위해 sudo를 사용합니다.

파일에 기록되는 내용인 다음 출력이 화면에 나타나야 합니다:

joydev

파일이 올바르게 생성되었는지 확인하기 위해 cat 명령어로 내용을 출력해 봅니다:

cat /etc/modules-load.d/joydev.conf

출력 결과는 방금 추가한 모듈 이름이어야 합니다:

joydev

이제 시스템이 부팅될 때마다 joydev 모듈이 자동으로 로드됩니다. 영구적인 모듈 로드 설정을 성공적으로 완료했습니다.

요약

이 실습에서는 Linux 환경에서 커널 모듈을 관리하는 기본적인 작업들을 배웠습니다. lsmod 명령어를 사용하여 현재 로드된 모든 모듈 목록을 확인하고, modinfo 명령어로 특정 모듈의 파일 경로 및 설명과 같은 상세 정보를 조사하는 연습을 했습니다.

또한 rmmod로 모듈을 제거하고 insmod로 다시 로드함으로써 커널을 동적으로 변경하는 실무 경험을 쌓았습니다. 마지막으로, 부팅 시 모듈이 자동으로 로드되도록 설정하여 시스템 재시작 후에도 필요한 드라이버나 기능이 활성화되도록 보장하는 방법을 익혔습니다. 이러한 기술은 장치 드라이버와 커널 기능을 효과적으로 관리하는 데 필수적입니다.