WHEREIS

모듈(Module)이란?
모듈의 사전적인 의미는 프로그램이나 하드웨어 기능단위, 교환가능한 구성부분, 그리고, 우주선의
일부를 이루지만 독립적으로 행동할 수 있는 작은 소선을 뜻한다. 리눅스에서의 모듈은 우주선의 경
우와 비슷하다. 우주선의 모체는 커널이미지이고, 작은 소선이 커널 모듈이다. 커널 모듈이 필요할
때는 커널 이미지에 합류하고 필요하지 않을 때에는 커널에서 빠져 나와 모듈 형태로 존재하므로 시
스템의 메모리를 절약할 수 있다. 따라서, 보통 모듈이 로드되었다는 것은 커널 밖에 존재하던 해당
드라이버가 커널의 일부로 되었다는 뜻이다. 언로드하면 다시 커널과 별도로 존재한다.


2. 모듈관리
(1) 개요: 리눅스 시스템에서 시스템장치를 제어하는 코드는 컴파일되어 커널에 포함될 수 있다. 
          그런데 커널은 대부분의 시스템장치에 대한 기능을 이미 내장하고 있으므로 모노리딕(mono
          lithic)이라 하며 커널이 자체에 모든 시스템 하드웨어를 관리한다는 의미이다. 모노리딕
          커널은 그다지 융통성이 뛰어나지 못해 시스템에 새로운 장치가 추가될 경우 커널을 새롭 
          게 만들어야 할 필요가 있다. 또한 모노리딕 커널은 실제 시스템에 장착되지 않은 하드웨
          어 드라이버까지 포함하고 있으므로 지나치게 비대해질 가능성이 있다. 대신 대부분의 
          사용자들은 모듈형(modular)커널을 사용하는데 이것은 커널이 필요한 경우에만 장치 드라
          이버를 적재하는 방식이다 모듈을 이용하면 드라이버를 업그레이드하는 편리한 방식을 
          통해 시스템이 운영중에도 하드웨어 설정을 변경할 수 있다.
(2) 모듈파일
   1) 설명: 리눅스 커널 모듈은 C컴파일러로 만들어진 오브젝트(.o)이지만 실행파일(이 경우 커널 
           실행파일)안에 링크되어 들어가지 않는다. 대부분의 모듈은 커널과 함께 컴파일되어 
           배포된다. 모듈은 커널과 매우 밀접한 관계가 있으므로 여러 커널이 설치될 경우 각 
           커널에 맞는 독립된 모듈의 집합이 설치된다. 이것은 모듈이 다른 버전 커널에 삽입을
           막아준다. 
   2) 모듈의 위치: '모듈은 /lib/modules/커널버전' 디렉토리에 위치한다. 여기서 커널버전은 
                  uname -r의 실행 결과 나오는 문자열이 된다. 또한 이 디렉토리의 하위디렉토리
                  로 아래와 같은 디렉토리가 생성되면서 관련 모듈들이 위치한다.
     ㄱ. block: RAID 제어기, IDE 테이프 드라이버와 같은 블록장치를 위한 모듈
     ㄴ. cdrom: 비표준 CD-ROM장치를 위한 장치 드라이버
     ㄷ. fs: MS도스와 같이 파일시스템을 위한 드라이버(msdos.o)
     ㄹ. ipv4: IP 매스커레이딩(masquerading)과 같이 IP처리에 관련된 모듈
     ㅁ. misc: 다른 분류에 속하지 않는 것으로 이 디렉토리의 최상위는 비어 있다.
     ㅂ. net: 네트워크 인터페이스 드라이버 모듈
     ㅅ. scsi: SCSI 컨트롤러 드라이버 모듈
     ㅇ. video: 비디오 어댑터을 위한 특별한 드라이버 모듈
    (참고) 2.4 커널버전인 경우에는 /lib/modules/2.4.2-3/kernel/drivers 에 위치한다.
(3) 모듈의 사용: 모듈이 로드되면 동작중인 커널에 동적으로 링크되어 사용한다. 대부분의 리눅스
                 커널 모듈은 자동으로 처리된다. 그러나 종종 필요한 모듈을 직접 처리해야 하는 
                 경우도 있으며 스크립트에서도 모듈을 처리하는 부분을 볼수도 있다. 예를 들면
                 특정 드라이버에 문제가 있을 경우 새 버전의 드라이버 소스 코드를 구해 컴파일
                 한 후 새로운 모듈을 동작중인 커널에 넣을 필요가 있다. 이 경우에는 모듈관련 
                 명령어를 사용해야 한다.

3. 모듈관련명령어
(1) lsmod
   1) 설명: 적재된 각각의 모듈명, 크기, 사용횟수 다른 참조 모듈 등의 정보를 출력한다. 이 명령
           의 실행결과는 /proc/modules파일의 내용과 같다.
   2) 사용법
     lsmod
   3) 사용예
     [root@www /root]# lsmod
     Module                  Size  Used by
     autofs                 11296   1  (autoclean)
     8139too                16512   1  (autoclean)
     3c59x                  25376   1  (autoclean)
     ipchains               39360   0  (unused)
     usb-uhci               20752   0  (unused)
     usbcore                49728   1  [usb-uhci]
(2) insmod
   1) 설명: 동작중인 커널에 모듈을 적재한다. 모듈은 자동으로 검색되고 삽입된다. 그러나 의존성
           이 있는 모듈인 경우에는 적재를 하지 못한다.
   2) 사용법
     insmod [option] 모듈
   3) option
     -s : 실행결과를 터미널 대신 syslog에 기록한다.
     -v : 메시지를 자세히 보여준다.
   4) 사용예
     [root@www scsi]# insmod ide-scsi.o
(3) modprobe
   1) 설명: insmod와 마찬가지로 modprobe도 모듈을 적재할 때 사용된다. 그러나 modprobe는 단일
           모듈, 의존성이 있는 여러 모듈, 특정 디렉토리의 모든 모듈들을 적재할 수 있다. -r 
           옵션을 사용하면 모듈을 제거할 때에도 사용할 수 있다. 또한 모듈에 '기호=값'형식을
           이용하여 매개변수를 전달할 수 있다. 만일 모듈이 다른 모듈에 의존하고 있을 경우 
           필요한 모듈을 먼저 적재한다. 이 명령어는 최상위 모듈디렉토리에 존재하는 modules.dep
           파일을 참고해 모듈간의 의존성을 해결한다.
   2) 사용법
     modprobe [option] 모듈 [기호=값]
   3) option
     -l : 사용가능한 모든 모듈을 보여준다.
     -r : rmmod와 같이 모듈을 제거한다. 여러 모듈을 한꺼번에 지정할 수 있다. 또한 의존성이 
         걸려 있는 모듈들도 찾아 자동으로 제거한다.
     -c : 기본값과 /etc/modules.conf(배포판에 따라 /etc/conf.modules)에 정의된 지시자를 포함
         해 완전한 모듈설정을 보여준다. 
   4) 사용예
     ㄱ. [root@www net]# modprobe -l
         /lib/modules/2.4.18/kernel/drivers/block/loop.o
         /lib/modules/2.4.18/kernel/drivers/md/lvm-mod.o
         /lib/modules/2.4.18/kernel/drivers/net/3c501.o
         /lib/modules/2.4.18/kernel/drivers/net/3c503.o
           => 사용가능한 모든 모듈을 보여준다.
     ㄴ. [root@www net]# modprobe ide-scsi
           => ide-scsi 라는 모듈을 올린다.
     ㄷ. [root@www net]# modprobe -r ide-scsi
           => ide-scsi라는 모듈을 제거한다.
     ㄹ. [root@www net]# modprobe -c
           => 모듈설정들을 보여준다.
(4) rmmod
   1) 설명: 모듈을 커널에서 제거하는 명령이다. 의존성이 있는 모듈은 제거하지 못한다.
   2) 사용법
     rmmod [option] 모듈
   3) option 
     -a : 사용되지 않는 모든 모듈을 제거한다.
   4) 사용예
     [root@www /etc]# rmmod ide-scsi
(5) modinfo
   1) 설명: 모듈 오브젝트 파일의 모듈 정보를 보여준다. 어떤 모듈은 아무 정보도 없으며, 어떤 
           모듈은 한 행 정도의 간단한 설명이 있고 몇몇은 비교적 상세하게 설명하고 있다.
   2) 사용법
     modinfo option 모듈_오브젝트_파일
   3) option
     -a : 모듈 제작자를 표시한다.
     -d : 모듈에 대한 설명을 보여준다.
     -p : 모듈이 지원하는 매개변수를 보여준다.
   4) 사용예
     ㄱ. [root@www net]# modinfo -d 3c59x.o
         3Com 3c59x/3c9xx ethernet driver LK1.1.16 19 July 2001
           => 모듈에 대한 설명을 보여준다.
     ㄴ. [root@www net]# modinfo -p 3c59x.o
           => 모듈이 지원하는 매개변수를 보여준다.

4. 모듈 사용하기
(1)모듈 올리기
    1) insmod 모듈이름
      예) insmod ne io=0x300 irq=3 (참고로 '*' 가 아니고 그냥 알파벳 'x'임.)
    2) modprobe 모듈이름
      예) modprobe ne
    *한꺼번에 할 경우
      modprobe ne io=0x300 irq=3
   (참고) insmod와 modprobe명령 모두 모듈을 적재하지만 insmod명령을 사용하면 의존성문제때문에
         모듈이 적재되지 않는 경우도 있고, 적재되더라도 정상적으로 동작하지 않을 수도 있다. 따
         라서, modprobe 명령을 이용하는 것이 좋다.
(2)모듈의 확인 : lsmod
    *사용예
     [root@house /root]# lsmod
     Module                  Size  Used by
     autofs                  9316   1  (autoclean)
     lockd                  31496   1  (autoclean)
     sunrpc                 53028   1  (autoclean) [lockd]
     ne                      6672   1  (autoclean)
     8390                    6076   0  (autoclean) [ne]
     eepro100               15924   1  (autoclean)
     aic7xxx               135768   2
   (설명) 위에서는 ne 라는 모듈과 다른 여러 모듈이 사용중임을 알 수 있다. 이 예에서는 ne(8390
         과 의존성이 있는 모듈)와 eepro100이 랜카드 모듈이고 두 개 모두 used항목이 1이기 때문
         에 현재 사용중임을 알 수 있다. 
(3)모듈 내리기(삭제)
    rmmod 모듈이름
   (참고) 모듈이 현재 사용중이라면 모듈의 삭제가 안된다. 이 경우에는 ifconfig eth0 down등의 명
         령으로 이더넷카드 사용을 중지하고 rmmod명령을 사용해야 한다.
(4)모듈의 관련파일
    1) /boot/module-info : 모듈, 특히 랜카드관련 모듈에 대한 정보를 볼 수 있다. (배포판에 따라
                          또는 2.4대 커널에는 없을 수도 있음)
    2) /etc/modules.conf : 부팅과 동시에 로드되는 모듈들을 알 수 있다. 또한 modprobe과정없이 
                          모듈을 올릴 수 있다.
       예) ne io=0x300 irq=3 인 경우
           alias eth1 ne      => alias [인터페이스이름] [모듈]
           options ne io=0x300 irq=3 => options [모듈] io=[설정한 주소] irq=[설정한 irq값]
     (참고) 2.2 커널버전에서는 /etc/conf.modules 이었음
    3) /usr/src/linux/Documentation/networking/net-modules.txt : 리눅스에서 사용가능한 이더넷
                                                                카드에 대한 정보를 담고있다.

5. 모듈관련 설정파일: /etc/modules.conf
(1) 설명: 경우에 따라 하드웨어 인터럽트나 DMA채널값 등의 모듈 인자를 조절해야 하는 경우가 
          있다. 또한 모듈을 삽입하거나 제거를 위해 특별한 절차를 따라야 할 때도 있는데, 이
          러한 설정을 하는 파일이 /etc/modules.conf(또는 /etc/conf.modules)이다.
(2) 설정
   1) 주석: 공백행이나 #로 시작되는 행은 무시한다.
   2) keep: path지시자보다 앞서 나오면 기본 경로를 유지하고 지정된 경로를 추가한다.
   3) depfile=절대경로:
     ㄱ. 설명: 모듈 의존성 파일 modules.dep의 기본위치를 변경한다.
     ㄴ. 사용예
        depfile=/lib/modules/2.4.18/modules.dep
   4) path=경로: 이 지시자는 모듈을 검색할 디렉토리를 지정한다.
   5) options 모듈 옵션1=값1 옵션2=값2 
     ㄱ. 설명: modules.conf나 modprobe명령행에서 options를 이용해 모듈에 특정한 값을 전달할 수
              있다. 명령행에서 지정한 값이 설정 파일의 값보다 우선 적용된다. 모듈은 .so확장자
              를 제외한 모듈명이다. 옵션은 '옵션=값'의 형식을 이용하며 이 값들은 모듈이 인식할
              수 있는 값이어야 하며 'modinfo -p'를 이용해 확인할 수 있다. 
     ㄴ. 사용예
        option ne io=0x300 irq=3
   6) alias 
     ㄱ. 설명: 앨리어스를 이용해 특정 모듈에 대한 일반 이름을 부여한다.
     ㄴ. 사용예
        alias eth0 3c59x
   7) pre-install 모듈명령
     ㄱ. 설명: 모듈을 적재하기 전에 지정된 셀 명령을 실행한다. 예를 들어 PCMCIA서비스는 pcmcia
              _core모듈보다 앞서 실행되어야 하는 데 이런 경우에 사용한다.
     ㄴ. 사용예
        pre-install pcmcia_core /etc/rc.d/init.d/pcmcia start
   8) install 모듈명령: 기본 모듈 적재 명령 대신 이곳에 지정된 명령을 사용한다.
   9) post-install: 모듈을 적재한 후 지정된 쉘 명령을 실행한다.
   10)pre-remove 모듈: 모듈을 제거 전에 지정 쉘 명령을 실행한다.
   11)remove 모듈: 기본 모듈 제거 명령 대신 이곳에 지정된 명령을 사용한다.
   12)post-remove 모듈: 모듈을 제거한 후 지정 쉘 명령을 실행한다.
(3) /etc/modules.conf의 예
    alias eth0 8139too
    alias eth1 ne     
    options ne io=0x300 irq=3

6. 모듈 의존성파일: modules.dep
(1) 설명: modprobe명령은 모듈 사이의 의존성을 파악해 자동으로 필요한 모듈을 먼저 적재할 수 
          있다. 이를 위해 modprobe는 적재해야 할 모듈을 찾기 위해 /lib/modules/커널버전/module
          s.dep를 검색한다.
(2) modules.dep의 형식
   module_name.o: 의존성1 의존성2 .....
(3) modules.dep의 예
   /lib/modules/2.4.18/kernel/net/ipv4/netfilter/ip_conntrack_ftp.o:       /lib/modules/2.4.18
   /kernel/net/ipv4/netfilter/ip_conntrack.o
(4) 참고
    시스템에서 사용할 수 있는 모든 모듈은 modules.dep에 등록되어 있으며 .o확장자를 포함한 전체
   경로를 통해 참조한다. 다른 모듈이 필요로 하지 않은 모듈도 등록되어 있으며 의존성 부분은 비
   어 있다. modprobe에 의해 필요한 모든 모듈이 커널에 우선 적재되고 나면 원래 의도했던 모듈을
   적재한다. 
(5) 관련명령어: depmod
    modprobe가 정상으로 동작하기 위해 modules.dep는 항상 적절하게 갱신되어야 한다. 만일 모듈
   간의 의존성이 변경되면서 modules.dep이 수정되지 않는다면 의존성을 가진 필요한 모듈을 찾지
   못해 modprobe가 동작하지 않는다. 따라서 modules.dep는 시스템이 부팅할 때마다 갱신된다. 
   이 때 갱신해주는 명령이 'depmod -a'이다. 이러한 작업은 모듈간의 의존성이 변경되었을 경우에
   필요하다. 보통 /etc/rc.d/rc.sysinit파일에 등록되어 부팅시마다 수행한다.

(참고) 모듈로 설치하지 않고 커널 속에 집어넣기
1. 개요
   모듈로 설치하지 않고 커널이미지 안에 네트워크 모듈을 집어넣을 수 있다. 이 방법은 리눅스가 
  모듈기능을 지원하기 전에 사용하던 방법으로 커널 컴파일시에 네트워크 카드를 선택하고 컴파일
  한 후에 /etc/lilo.conf에 랜카드 관련 항목을 입력하여 인식시킨다.
2. 방법
  (1) 커널 컴파일시에 네트워크카드를 인식시키고 컴파일한다.
  (2) /etc/lilo.conf파일에 다음과 같은 형식으로 내용을 적는다.
     append="ether=3, 0x300, eth0"
      => ehter는 이더넷을 가리키고, eth0에 IRQ는 3, IO주소는 0x300를 할당한다는 뜻이다.
  (3) /sbin/lilo를 실행하여 lilo.conf파일을 재반영시킨다.
  (4) 시스템을 재부팅하면 랜카드가 인식된다.


출처 : 대전국제IT교육센터 정성재 강사

'OS - Linux > Linux - ETC' 카테고리의 다른 글

apache core 파일 분석  (0) 2014.04.01
null 파일이 삭제 된 경우  (0) 2014.03.07
메모리 관련 커널튜닝  (0) 2014.02.28
apache+tomcat 로드밸런싱  (0) 2014.02.26
SUDO 명령어 사용 시 참고  (0) 2014.02.26

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band
loading