개인/리눅스

[리눅스] 모듈의 관리와 설정파일

OmeGa2 2020. 2. 14. 18:26

리눅스에서 모듈은

 

리눅스에서 모듈은 대부분 커널모듈을 이야기한다. 

때문에, 모듈을 이해하기 위해서는 커널에 대해서 먼저 알고있는게 수월하다.

 

커널이란

커널은 모든 리눅스 운영체제의 핵심이라고 불리는데, 운영체제와 하드웨어 사이에서 시스템 자원을 관리하며 모든 시스템이 원할하게 동작할 수 있도록 하는 소프트웨어의 일종이다. 

 

커널은 CPU,메모리,하드웨어와 어플리케이션 사이에서 동작하면서 프로세스 관리, 네트워크 관리 등 다양한 디바이스 기능을 수행하는데, 운영체제에서 일어나는 모든 부분을 관리하고 신규 드라이브를 위해 업데이트가 필요할 때도 있다.

 

 

커널에서 사용하는 모듈은

모듈은 커널에서 수행되면서 동적 공유라이브러리와 개념이 비슷하다.

리눅스에서는 여러 명령어나 프로그램은 동일한 부분이 많아 디스크 절약을 위해 자주 사용되는 코드를 모아놓은 공유 라이브러리를 만들어 프로그램을 실행할 때 가져와서 동시에 실행한다.

 

모듈도 마찬가지다. 보통은 커널 밖에 존재하다가 필요로 할 때 해당 드라이버가 커널의 일부로 로드되어 실행된다.

이후 작업이 끝난 뒤 언로드되면 커널과는 별도로 존재한다.

 

리눅스 시스템에서 시스템 장치를 제어하는 코드는 컴파일되어 커널이 포함될 수 있다.

 

 

모놀리식 방식

모놀리식은 커널이 시스템을 제어하는 기능을 내장하고 하나의 형태로 구성되는것을 말한다.

 

이런 모놀리식 방식은 여러 단점을 가지고 있다.

커널은 모든 하드웨어 자원을 관리하게 된다. 하지만 시스템에 새로운 장치가 추가된다면,

커널을 다시 만들어야 할 수도 있다.

 

또한 실제 시스템에 사용하지 않는 하드웨어의 드라이버까지 가지고있는 경우도 발생한다.

이러면 불필요하게 덩치가 커지는 경우도 생긴다.

 

이런 문제점을 해결하기 위해 사용하는 방법이 모듈이다.

 

 

모듈을 사용하면

모듈은 여러 하드웨어 드라이버를 커널 외부에 별도로 가지고 있는 것을 말한다.

만약 새로운 장치가 추가되어 드라이버가 필요할 경우 커널을 바꿀 필요 없이, 해당 모듈만

커널에 적재해서 사용한 뒤, 이후 제거하면 된다. 

 

정리하자면 커널에서 사용되는 네트워크 드라이버를 모두 커널이 가지고 있으면

여러모로 비효율적이다. 때문에, 모듈이라는 파일로 커널 외부에 별도로 가진다.

이후 드라이버가 필요할 때만 커널에 로드시켜 사용한 뒤 제거한다.

 

리눅스 커널 모듈은 C컴파일러로 만들어진 오브젝트 파일로서 *.ko 형태로 생성되고 각 시스템에서 가능한 모듈은 lib/modules/커널버전/kernel 디렉터리 안에 생성되어 있다.

 

 

 

모듈의 사용 및 관리

 

 

1. 사용할 수 있는 모듈 확인

]# lsmod

리눅스 커널에 적재된 모듈 정보를 출력하는 명령이다.

모듈명과 크기, 이외에 Used 항목은 다른 모듈에서 사용중인 수를 나타낸다.

 

목록을 확인해보면 garp 라는 모듈의 [Used by]항목이 [1 8021q]로 나타나 있다. 

 

앞에 숫자 1은 다른 모듈 하나가 garp를 사용중인 것을 나타내며,

이는 garp를 사용중인 모듈은 8021q이라는 것을 알 수 있다.

 

 

리눅스에서 대부분의 모듈은 /lib/modules 내부에 존재하며 파일명 뒤에 .ko 가 붙는다.

만일 lsmod로 검색한 특정 모듈의 위치를 찾으려면 파일명 뒤에 .ko를 붙여 찾아야 한다.

 

 

 

2. 커널에 모듈을 로드, 언로드 하기

]# insmod [모듈명]

]# rmmod [모듈명]

lsmod 명령은 현재 커널에 적재된 모듈의 목록을 가져온다.

다른 모듈을 커널에 적재시키기 위해서는 insmod 명령을 사용한다.

 

사용하고싶은 모듈이 있는 디렉터리까지 이동해서 insmod 명령을 사용해

커널에 적재할 수 있지만, 특정 파일이나 모듈에 의존성이 있는 모듈은 적재할 수 없다.

 

이후 사용한 모듈을 커널에서 제거하려면 rmmod 명령을 사용한다.

 

can.ko 라는 모듈을 커널에 적재하려고 한다.

해당 모듈이 있는 위치까지 이동해서 insmod 명령을 통해 커널에 적재시킨다.

이후 커널에 적재된 모듈은 lsmod 로 확인할 수 있다.

 

rmmod 명령으로 can.ko 모듈을 언로드한 뒤 lsmod로 다시 확인해 보니

커널에서 빠져있는 것을 확인할 수 있다.

 

 

3. 모듈에 대한 정보 확인

]# modinfo [모듈명]

특정 모듈에 대한 라이센스나 버전 등 다양한 정보를 확인할 수 있다.

 

can.ko 모듈의 정보를 modinfo 명령으로 확인해보았다.

파일의 별칭과 가지고 있는 라이센스 (BSD/GPL)를 확인할 수 있었고,

vermagic를 통한 버전정보와 description 로 간단한 정의를 볼 수 있다.

 

 

4. modprobe 명령어

]# modprobe [옵션] [모듈명]

-l : 사용 가능한 모듈 정보 출력

-r : 모듈 제거시 의존성있는 모듈 확인, 없다면 제거

-c : 모듈의 환경설정파일의 내용 출력

insmod와 rmmod 명령으로 의존성이 있는 모듈은 커널에 적재, 제거할 수 없다.

modprobe는 모듈의 최상위 디렉토리에 있는 modules.dep 파일을 참고해서

단일모듈, 의존성이 있는 모듈 모두 커널에 자유롭게 적재, 제거할 수 있는 명령이다.

 

모듈에 대한 정보나 환경설정값을 확인할 수 잇고 '기호=값' 형식을 이용해 모듈에 매개변수를 전달할 수도 있으며, 특정 모듈을 적재할 때 다른 모듈을 의존하고 있는 경우 필요한 모듈과 같이 적재시켜준다.

 

사용할 수 있는 모듈과 그 위치 확인

 

특정 모듈의 환경설정 정보 확인

 

 

 

모듈 관련 파일

 

▷ 설정파일

/etc/modprobe.d

alias     = 특정 모듈에 별칭을 부여

options = 특정 모듈에 값을 전달

install   = 모듈을 커널에 적재할 때 명령을 지정

remove = 모듈을 제거할 때 상황을 지정

blacklist = 특정 모듈을 제한할 때 사용

리눅스에서 모듈에 관련된 대부분의 설정파일은 /etc/modprobe.d 디렉터리에 있다.

 

디렉터리에 존재하는 파일 중 .conf 형식의 모든 파일을 설정파일로 인식한다.

 

 

▷.conf 파일의 모듈 설정항목 예시

 

설정파일에 존재하는 항목은 대표적으로 alias, options, install, remove, blacklist 총 5가지가 있다.

 

alias

alias 설정은 특정 모듈에 별칭을 부여해서 사용할 때 지정한다.

 

options

모듈에 특정한 값을 전달하기 위해 사용되는 options 옵션이다.

 

install

install 항목은 모듈에 명령을 지정한다.

지정된 명령은 보통 커널에 모듈을 적재할 때 사용하며, 적재에 실패할 경우를 대비한

두번째 명령을 같이 지정하는 경우도 있다.

 

 

remove

모듈을 제거할 때 여러 상황을 지정하는 명령이다.

특정 상황이 되면 모듈이 제거되도록 설정할 수 있다.

 

 

blacklist

마지막으로 모듈의 사용을 제한할 때 이용하는 blacklist 항목이다.

 

 

 

▷모듈의 의존성이 기록되는 파일 [modules.dep]

/lib/modules/[모듈버전]/modules.dep

]# depmod

= modules.dep 파일을 갱신하고 관리하는 명령

모듈간의 의존성이 기록된 파일로는 modules.dep가 있다.

 

모듈을 콜론 (:)으로 구분해서 의존성이 있는 모듈끼리 차례대로 나열되어있다.

 

modprobe 명령은 모듈의 의존성을 modules.dep 파일을 통해 확인한다.

커널에 모듈을 로드할 때 의존성이 있는 모듈을 같이 적재하면서,

모듈을 제거할 때 의존성을 찾고, 발견되지 않는다면 자동으로 제거하기도 한다.

 

때문에 modules.dep 파일에 설정된 의존성이 잘못되어 있을 경우,

modprobe 명령을 사용할 때 문제가 생길 수도 있다.

 

만일 의존성이 변경되면 modules.dep 파일의 내용도 같이 변경되어야 정상적으로

modprobe 를 사용할 수 있다. 이 파일을 갱신할 때는 depmod 명령을 사용한다.