다음 이전 차례

5. 어떤 모듈이 로드될 지 kerneld는 어떻게 하는가?

흔한 형태의 모듈에 대해서는 kerneld가 정보를 가지고 있겠지만 때로는 kerneld가 커널이 요청한 것을 어떻게 처리해야하는 지 모를 수 있다. 한가지 이상의 모듈이 존재하는 CD-ROM 드라이버나 네트워크 드라이버가 이러한 경우 이다.

커널로부터 kerneld 데몬에게 전달되는 요구사항은 다음 중 하나이다.

kerneld는 어떤 모듈이 로드되어야 하는지를 /etc/conf.modules 파일을 검사 해서 결정한다. 여기에는 두가지 항목이 있는데 경로명(로드된 모듈 파일이 있는 곳)과 별명(alias: 로드될 모듈의 이름)이 그것이다. 만일 이 파일이 존재하지 않는다면 다음과 같이 만들 수 있다.

/sbin/modprobe -c | grep -v '^path' >/etc/conf.modules 만일 기본 패스에 다른 패스를 추가하려면, 추가하려는 패스 뿐만 아니라 모든 기본 패스도 추가해야 한다. 이것은 /etc/conf.modules의 패스가 modprobe가 알고 있는 기본 패스를 완전히 대체하기 때문이다. 대개 사용자는 이러한 경로를 직접 손으로 입력하고 싶어하지 않고 내부적으로 이러한 작업이 이루어지길 바랄 것이다.

alias나 다른 옵션을 직접 추가하고 싶다면 /etc/conf.modules에 추가한 내용은 modprobe가 이미 알고 있는 것에 추가될 것이다. 만일 사용자가 alias나 옵션을 재정의하였다면, /etc/conf.modules의 내용이 기본 설정을 대신할 것이다.

블럭 디바이스(Block devices)


   '/sbin/modprobe -c'를 실행하면 kerneld가 알고 있는 모듈들의 목록과 어떤
   신호들이 이것과 연관되어 있는지 표시된다. 예를 들어 플로피 드라이버를
   로드하도록 하는 신호는 메이저 번호 2를 갖는 블럭 디바이스이다.
   osiris:~ $ /sbin/modprobe -c | grep floppy
   alias block-major-2 floppy
   왜 블럭 메이저 번호가 2일까? 그 이유는 /dev/fd* 플로피 디바이스들이 메이저
   번호 2를 사용하고 블럭 디바이스들이기 때문이다.
   osiris:~ $ ls -l /dev/fd0 /dev/fd1
   brw-rw-rw-   1 root     root       2,   0 Mar  3  1995 /dev/fd0
   brw-r--r--   1 root     root       2,   1 Mar  3  1995 /dev/fd1

캐릭터 디바이스(Character devices)


   캐릭터 디바이스도 비슷한 방법으로 처리된다. 예를 들어 ftape 플로피 드라이버
   는 메이저 번호 27을 갖는다.

   osiris:~ $ ls -lL /dev/ftape
   crw-rw----   1 root     disk      27,   0 Jul 18  1994 /dev/ftape
   그러나 기본적으로 kerneld는 ftape 드라이버를 알지 못한다. 이것은
   '/sbin/modprobe -c'의 결과 목록에 들어있지 않다.

   그러므로 kerneld가 ftape 드라이버를 로드하도록 하려면 /etc/conf.modules에
   다음과 같은 내용을 추가해야 한다.
   alias char-major-27 ftape

네트워크 디바이스(Network devices)


   사용자는 'char-major-xxx' 나 'block-major-yyy'형태의 설정 대신 디바이스의
   이름을 사용할 수 있다. 이같은 방법은 네트워크 디바이스에 특히 유용하다.
   예를 들어 eth0로 동작하는 ne2000 네트워크 카드는 다음과 같은 방법으로
   로드할 수 있다.

   alias eth0 ne
   만일 드라비어에 옵션을 인자로 넘기려면 - 예를 들면 네트워크 카드가 사용할
   IRQ 등 - 'options'를 추가한다.

   options ne irq=5
   이것은 kerneld가 NE2000 드라이버를 다음과 같이 로드하도록 한다.

   /sbin/modprobe ne irq=5
   물론 실제 옵션은 사용자가 로드하려는 모듈에게만 사용된다.

바이너리 포맷(Binary formats)


   바이너리 포맷 역시 유사한 방법으로 처리된다. 사용자가 kerneld가 어떻게
   로드할 지 모르는 프로그램을 실행할 때마다 kerneld는 'binfmt-xxx'와 같이
   요구한다. 이때 xxx는 바이너리 포맷의 첫번째 몇개 바이트로부터 결정되는 숫자
   이다. 그러므로 ZMAGIC (a.out) 바이너리 포맷을 위한 binfmt_aout을 로드하기
   위한 kerneld 설정은

   alias binfmt-267 binfmt_aout
   ZMAGIC 파일에 대한 매직 넘버(/etc/magic 참조)는 267이다.(/etc/magic 파일을
   보면 숫자가 0413으로 표시되어 있을 것이다. 그러나 이것은 kerneld가 8진수를
   사용하기 때문이고, 8진수 413은 10진수 267이다. a.out 실행 파일에 대해서는
   조금씩 다른 3가지 변종이 존재한다. 그러므로 이것들 모두를 지원하는
   binfmt_aout을 로드하려면

   alias binfmt-264 binfmt_aout  # pure executable (NMAGIC)
   alias binfmt-267 binfmt_aout  # demand-paged executable (ZMAGIC)
   alias binfmt-204 binfmt_aout  # demand-paged executable (QMAGIC)
   a.out, Java 그리고 iBCS 이진 포맷은 kerneld에 의해 자동적으로 인식되므로
   특별한 설정은 필요없다.

Line disciplines (slip, cslip and ppp)


   Line disciplines은 "tty-ldisc-x"와 같이 요청되는데 이때 'x'는 대개 1
   (SLIP) 이거나 3 (PPP)이다. 이 두가지 모두 kerneld에 의해 자동적으로
   인식된다.

   PPP의 경우 ppp를 위해 bsd_comp 데이터 압축 모듈을 로드하고 싶으면 다음과
   같은 두 줄을 /etc/conf.modules에 추가해야 한다.
   alias tty-ldisc-3 bsd_comp
   alias ppp0 bsd_comp

네트워크 프로토콜 패밀리 (IPX, AppleTalk, AX.25)


   몇몇 네트워크 프로토콜 역시 모듈로 로드될 수 있다. 커널은 "net-pf-X"와
   같은 형식으로 kerneld에게 프로토콜 패밀리에 대해 요청한다. 이때 X는
   사용하고자 하는 패밀리를 표시하는 번호이다. 예를 들면 net-pf-3은 AX.25
   이고, net-pf-4는 IPX 그리고 net-pf-5는 AppleTalk이다.(이 번호들은
   리눅스 소스 파일 include/linux/socket.h 에 정의된 AF_AX25, AF_IPX 값에
   의해 결정된다. (역자 주: 인터넷에서 흔히 사용되는 IP 프로토콜값은 2 이다)
   그러므로 IPX 모듈을 자동으로 로드하려면 다음과 같은 내용을
   /etc/conf.modules에 입력해야 한다.

   alias net-pf-4 ipx

   ! 확인 !
   이제 아래에서 볼 내용은 부팅할때 정의되지 않은 프로토콜 패밀리와 관련된
   에러 메시지가 발생할 때 어떻게 대처하는지에 대해 알아본다.

파일 시스템


   파일 시스템에 대한 kerneld 신호는 파일 시스템 타입의 이름이다. 흔히
   "iso9660" 파일 시스템 타입을 갖는 CD-ROM 파일 시스템에 대한 isofs 모듈을
   로드하려면 아래와 같이 한다.

   alias iso9660 isofs

특별한 설정을 필요로하는 디바이스들



   몇몇 디바이스들은 alias만을 사용해서는 디바이스를 모듈로 사용할 수 없다.
<itemize>
<item> major 10번을 갖는 캐릭터 디바이스들
<item> SCSI 디바이스들
<item>특별한 초기화를 필요로하는 디바이스들
<itemize>

char-major-10 : Mice, watchdogs and randomness 하드웨어 디바이스는 대개 메이저 디바이스 번호를 통해 구별된다. 예를 들면 ftape은 char-major-27 이다. 그러나 /dev의 내용을 보면 캐릭터 메이저 번호 10을 갖는 항목을 볼 수 있는데 이것은 매우 다양한 디바이스에 의해 사용된다.

분명히 이러한 디바이스들은 하나가 아닌 서로 다른 모듈에 의해 제어된다. 그러므로 이것들에 대한 kerneld 설정은 메이저 번호와 마이너 번호를 사용해야 한다.

alias char-major-10-1 psaux # For PS/2 mouse alias char-major-10-130 wdt # For WDT watchdog

이것을 사용하기 위해서는 커널의 버전이 1.3.82이상이어야 한다. 이전 버전은 kerneld 에게 마이너 번호를 넘겨주지 않아 kerneld가 어떤 디바이스 모듈을 로드할지 알지 못한다. 드라이버 로드하기: scsi_hostadpater 항목


   SCSI 디바이스를 위한 드라이버는 SCSI 호스트 어댑터(예를 들면 Adaptec 1542)
   와 사용자가 사용하는 SCSI 디바이스 타입 - 예를 들면 하드 디스크, CD-ROM
   그리고 테이프 드라이브 - 에 대한 드라이버로 구성된다. 이 모든 것들은 모듈로
   로드될 수 있다. 그러나 예를 들어 Adaptec card에 연결된 CD-ROM을 엑세스
   할 때 커널과 kerneld는 SCSI CD-ROM을 지원하기 위해 sr_mod 모듈을 로드해야
   한다는 것만을 알고 CD-ROM이 연결된 SCSI 컨트롤러에 대해서는 모른다. 그러므로
   SCSI 컨트롤러를 지원하는 어떤 모듈을 로드해야 할 지는 모른다.
   이러한 문제점을 해결하려면 /etc/conf.modules의 SCSI 드라이버 모듈항목에서
   다양한 SCSI 컨트롤러 모듈중에 어떤 것을 kerneld가 로드해야 할지를 지정한다.

        alias scd0 sr_mod               # sr_mod for SCSI CD-ROM's ...
        alias scsi_hostadapter aha1542  # ... need the Adaptec driver

   이러한 기능은 커널 1.3.82 이상의 버전에서만 가능하다.
   위와 같은 작업은 오직 하나의 SCSI 컨트롤러만 있을때 제대로 동작한다. 만일
   하나 이상의 컨트롤러가 있다면 좀 더 복잡한 작업을 해야 한다.
   일반적으로 다른 호스트 어댑터용 드라비어가 이미 설치되어 있다면 kerneld는
   SCSI 호스트 어댑터에 대한 드라이버를 로드할 수 없다. - 반드시 두개의 드라
   이버를 커널에 포함시키던가(모듈이 아니라) 직접 모듈을 로드해야 한다.
   그러나 kerneld가 여러개의 SCSI 드라이버를 로드하도록 하는 방법이 있다.
   아래의 내용은 James Tsiao씨의 아이디어이다.:

   kerneld가 두번째 SCSI 드라이버를 로드하도록 하려면 modules.dep를 직접
   수정하여 의존성을 만들면 된다. 단지 아래와 같이 하면 된다.
      /lib/modules/2.0.30/scsi/st.o: /lib/modules/2.0.30/scsi/aha1542.o
   kerneld는 st.o를 로드하기 전에 aha1542.o를 로드할 것이다. 집에 있는
   내 컴퓨터에 위와 같은 설정이 있고 이것은 테이프와 CD-ROM 그리고 일반적인
   SCSI 디바이스들(generic scsi devices)에서 잘 동작한다. 이때 단점은
   'depmod -a'가 제대로   의존성을 검사하지 못하므로 사용자가 직접 추가하고,
   부팅할때 'depmod -a'를 사용해서는 안된다는 거이다. 그러나 한번 설정이 되면
   kerneld는 자동으로 aha1542.o를 로드한다.

   이 때 주의해야 할 것은 이러한 방법은 서로 다른 두 개의 컨트롤러의 다른
   SCSI 디바이스에만 제대로 동작한다는 것이다. 예를 들면 한개의 컨트롤러에
   하드 디스크가 있고, 다른 컨트롤러에 CD-ROM 드라이브나 테이프 혹은
   일반적인 SCSI 디바이스가 있는 경우이다.

모듈을 로드하는 것만으로 충분하지 않을때 : 설치 후 항목(The 'post-install' entry)


   때때로 모듈을 로드하는 것만으로도 충분하지 않을 때가 있다. 예를 들어
   모듈로 컴파일된 사운드 카드가 있을때, 초기값을 소리값을 지정하는 것이
   편한다. 이때 문제점은 설정값들이 다음에 모듈이 로드될때 사라진다는 것이다.
   여기 Ben Galliart(<url url="mailto: bgallia@luc.edu" name="bgallia@luc.edu" >)씨가 알려준 해결법이다:
   마지막 방법은 setmix-0.1 패키지 (<url url="http://sunsite.unc.edu/pub/Linux/apps
   /sound/mixers/setmix-0.1.tar.gz" name="sunsite.unc.edu/pub/Linux/apps
   /sound/mixers/setmix-0.1.tar.gz"  >) 를 설치하는 것이다.

   그리고 다음과 같은 내용을 /etc/conf.modules에 추가한다:

       post-install sound /usr/local/bin/setmix -f /etc/volume.conf

   이것은 사운드 모듈이 로드된 후 kerneld가 "post-install sound"라고 쓰여진
   명령어를 실행시킨다. 그러므로 사운드 모듈은 '/usr/local/bin/setmix -f
   /etc/volume.conf'의 명령으로부터 소리 볼륨값을 갖게 된다.

   이러한 방법은 tunelp 프로그램으로 환경 설정을 해야하는 lp 모듈과 같은
   다른 모듈에도 유용한다.

        post-install lp tunelp <options>

   kerneld가 이러한 옵션을 인식하려면 1.3.69f 나 그 이후 버전의 kerneld가
   필요하다.

주의: 이전 버전의 mini-HOWTO 는 kerneld가 모듈을 제거하기 전에 실행시키는 "pre-remove" 라는 명령어에 대해 언급하고 있다. 그러나 이것은 제대로 동작 하지 않아, 다음 kerneld 릴리즈에서는 제거될 것으로 예상된다. 모듈 설정과 관련된 모든 이슈들은 현재 진행중이고 이 글을 읽게되는 시점에는 이미 많은 변화가 일어났을 것이다.
다음 이전 차례