KERNELD MINI-HOWTO Version 1.7, last updated: July 19, 1997 by Henrik Storner (storner@osiris.ping.dk ) 번역: 1998년 10월 3일, 정재영(cychong@metro.telecom.samsung.co.kr ) 이 문서의 가장 최근 버전은 http://eolicom.olicom.dk/ storner /kerneld- mini-HOWTO.html 에서 구할 수 있다. http://eolicom.olicom.dk/ storner/kern.html를 참조하면 여러가지 mini- HOWTO 사이의 변경된 내용의 목록을 발견할 수 있을 것이다. Credits 만일 이 문서에서 틀린 점을 발견하면 나에게 알려주길 바란다. 다음의 사람들이 이 mini-HOWTO에 기고한 사람들이다. * Bjorn Ekwall < bj0rn@blox.se > * Ben Galliart < bgallia@luc.edu > * Cedric Tefft < cedric@earthling.net > * Brian Miller > * James C. Tsiao > 이 mini-HOWTO를 읽은 사람들이 보내주는 격려와 제안에 매우 감사한다. ______________________________________________________________________ 목차 1. kerneld 란 무엇인가?? 2. 왜 kerneld 를 사용하길 원하는가? 3. 필요한 것들은 어떻게 구하는가? 4. 설정은 어떻게 하는가? 5. 어떤 모듈이 로드될 지 kerneld는 어떻게 하는가? 6. kerneld의 작업 엿보기 7. kerneld의 특별한 사용 8. 흔히 발생하는 문제점들 ______________________________________________________________________ 1. kerneld 란 무엇인가?? kerneld는 Ejorn Ekwall에 의해 커널 개발 버전 1.3에서 소개된 기능이다. 이것은 2.0과 2.1대의 커널에 모두 포함되어 있다. 이 kerneld는 커널의 "모듈" - 다시 말하면 디바이스 드라이버, 네트워크 드라이버, 파일 시스템 등등 - 을 사용자가 직접 modprobe나 insmod를 사용하지 않고, 사용자가 해당 모듈을 엑세스할 때 자동적으로 로드될 수 있도록 한다. 그리고 아직 표준 커널과 통합되지는 않았지만 몇 가지 놀라운 기능들을 가지고 있다. o 기본 스크린 브랭커 대신 사용자 프로그램을 동작시킬 수 있어, 다른 스크린 세이버를 사용할 수 있다. o 스크린 블랭커 지원과 유사하게 표준 콘솔의 벨 소리를 전혀 다른 것으로 바꿀 수 있다. kerneld는 두 개의 독립된 엔티티로 구성된다. o 리눅스 커널이 어떤 작업에 필요한 데몬에게 신호(request)를 보낼 수 있게 한다. o 커널로부터의 신호를 만족시키기 위해 어떤 프로그램들이 로드되어야 하는지 알아내는 사용자 수준의 데몬. 이 두개 부분이 모두 kerneld가 동작하는데 반드시 필요한 기능들이다. 즉 이 중 어느 하나가 제대로 설정되어 않으면 동작하지 않는다. 2. 왜 kerneld 를 사용하길 원하는가? kerneld를 사용하는데는 몇 가지 이유가 있다. 여기서 언급하는 것들은 나의 경우를 말한 것이다. 다른 사람들은 또 다른 이유를 가지고 있을 것이다. o 만일 조금씩 다른 사양을 갖는 여러 가지 시스템에서 동작할 커널을 만들어야 한다면 - 예를 들면 다른 종류의 네트워크 카드 - 사용자는 매 시스템마다 다른 커널을 만들 필요없이 하나의 커널을 만들고 여러 가지 모듈을 만들 수 있다. o 모듈은 개발자들이 좀 더 쉽게 테스트할 수 있다. 개발자는 특정 드라이버 를 로드하거나 언로드하기 위해 시스템을 리부트할 필요가 없다.(이것은 단순히 kerneld에서 로드된 것 뿐만 아니라 모든 모듈에 적용된다) o kerneld는 커널의 메모리 사용량을 줄여준다. 즉 다른 어플리케이션을 돌리는데 좀 더 많은 메모리를 사용할 수 있다. 커널이 사용하는 메모리는 o 절대로* 스웝 아웃(Swap Out, 역자 주: 사용자에게 돌려준다는 의미)되지 않는다. 그러므로 만일 커널을 컴파일 할 때 사용하지 않는 드라이버에게 100kb의 메모리를 할당했다면 이것은 단지 RAM을 낭비한 셈이다. o 내가 사용하는 어떤 것들은 - 예를 들면 ftape 플로피 테이프 드라이버나 iBCS - 오직 모듈의 형태로만 이용할 수 있다. 그러나 나는 매번 이 모듈 이 필요할 때마다 로딩하는 번거로움을 겪고 싶지 않다. o 리눅스 배포본을 만드는 사람들은 284가지의 다른 부트 이미지를 만들고 싶어하지 않는다. 대신 사용자 자신이 가진 하드웨어에 필요한 드라이버를 로드하면 된다. 이러한 인스톨 방법은 레드햇 4.0에서 사용된다. 물론 사용자가 이러한 기능을 사용하고 싶은 않은 이유도 있을 것이다. 예를 들어 모든 드라이버가 포함된 하나의 커널 이미지가 필요할 지도 모른다. 이런 경우에는 이 문서를 읽는 것은 시간 낭비일 것이다. 3. 필요한 것들은 어떻게 구하는가? 커널에서의 kerneld 지원은 리눅스 커널 1.3.57에서 도입되었다. 만일 사용자가 이것보다 이전 버전의 리눅스 커널을 가지고 있는데 kerneld를 사용하고 싶다면 커널의 버전을 높여야 한다. 모든 리눅스 사이트들은 커널 소스를 가지고 있다 - 가능하면 가장 최근의 안정 버전인 2.0으로 업그레이드 하길 권한다. sunsite.unc.edu/pub/Linux/kernel/v2.0/linux-2.0.29.tar.gz tsx-11.mit.edu/pub/linux/sources/system/v2.0/linux-2.0.29.tar.gz funet.fi/pub/Linux/PEOPLE/Linus/v2.0/linux-2.0.29.tar.gz 사용자 수준의 데몬은 modules-1.2.8 과 새로운 modules-2.0 패키지에 포함 되어 있다. 이것들 역시 커널 소스와 같은 장소에서 구할 수 있지만 아래가 공식적인 장소이다. sunsite.unc.edu/pub/Linux/kernel/v2.0/modules-2.0.0.tar.gz tsx-11.mit.edu/pub/linux/sources/sbin/modules-2.0.0.tar.gz funet.fi/pub/Linux/tools/modules-2.0.0.tar.gz 주의: 만일 사용자가 최근의 2.1 개발자 버전에서 모듈 로드 기능을 이용하고 싶으면 최근의 modutils-(modules- 이 아니라) 패키지를 사용해야 한다. 그러나 아래에 있는 2.1대의 커널과 모듈을 사용할 때 발생할 수 있는 문제점에 대해 확인해야 한다. 4. 설정은 어떻게 하는가? 먼저 필요한 것들을 구한다: 적당한 버전의 커널과 최신 버전의 modules- utilities. 그리고 modules-utilities를 인스톨해야 한다. 이 작업은 매우 간단하다. 소스를 푼 다음 make install을 실행한다. 이것은 genksysm, insmod, lsmod, modprobe, depmod, kerneld 들을 컴파일하여 /sbin에 인스톨한다. 그리고 사용자가 리눅스를 부팅할때 필요한 작업을 이루어지도록 스타트업 스크립트에 필요한 내용을 추가하는 것이 좋다. 다음과 같은 내용을 /etc/rc.d/rc.S파일 (슬랙웨어의 경우) 이나 /etc/rc.d/rc.sysinit (데비안, 레드햇, 칼데라와 같은 SysVinit를 사용하는 경우)에 추가한다. # Start kerneld - this should happen very early in the # boot process, certainly BEFORE you run fsck on filesystems # that might need to have disk drivers autoloaded if [ -x /sbin/kerneld ] then /sbin/kerneld fi # Your standard fsck commands go here # And you mount command to mount the root fs read-write # Update kernel-module dependencies file # Your root-fs MUST be mounted read-write by now if [ -x /sbin/depmod ] then /sbin/depmod -a fi 첫번째 부분은 kerneld 자신을 실행시키는 것이다. 두번째 부분은 시작할때 'depmod -a'를 호출한다. depmod 프로그램은 사용 가능한 모든 모듈의 리스트를 만들고 그것들 간의 의존성을 분석하여 한 모듈이 로드되기 전에 어떤 모듈이 로드되어야 하는지 알게 해준다. 주의 : 최근 버전의 kerneld는 GNU dbm 라이브러리, libgdbm과 링크하는 것을 옵션으로 갖는다. 만일 module-utilites를 컴파일할때 이 기능을 활성화시킨 경우 libgdbm이 없으면 kerneld는 동작하지 않는다. 예를 들면 /usr가 다른 파티션 에 존재하고 /usr이 마운트되기 전에 kerneld가 동작하는 경우이다. 이런 경우 /usr/lib의 libgdbm을 /lib로 옮기거나 kerneld를 정적으로 링크할 것을 권장한다. 다음, 커널 소스를 풀고 configure를 하고 커널을 만든다. 만일 이러한 과정을 이전에 한 적이 없다면 Linux 커널 소스의 루트 디렉토리에 있는 README를 반드시 읽어봐야 한다. make config를 할 때는 다음과 같은 질문에 대해 관심을 기울여야 한다. Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y Loadable module support를 선택하지 않으면 kerneld가 로드할 모듈이 없게 된다. 그러므로 Yes를 선택해야 한다. Kernel daemon support (CONFIG_KERNELD) [Y/n/?] Y 이것 역시 반드시 필요한 것이다. 이제는 커널에서 모듈로 설정할 수 있는 다양한 것들이 제시될 것이다. 예를 들면 Normal floppy disk support (CONFIG_BLK_DEV_FD) [M/n/y/?] 여기서 M을 선택하면 해당 기능이 모듈로 컴파일된다. 일반적인 시스템을 부트할때 필요한 디바이스 - 하드디스크 드라이버, 루트 파일 시스템을 위한 드라이버만 커널에 포함하면 된다. 나머지는 모드 모듈로 사용할 수 있다. 실행한다. 둘 것이다. 이것을 부트 이미지를 두는 곳이나 LILO에서 설치하는 곳에 복사 하면 된다. 커널을 설정하고 빌드하는 방법에 대해 좀 덜 알고 싶으면 comp.os.linux.answers 에 주기적으로 포스트되고 sunsite.unc.edu의 /pub/Linux/docs/HOWTO의 Kernel-HOWTO를 참고한다. ______________________________________________________________________ /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만을 사용해서는 디바이스를 모듈로 사용할 수 없다. major 10번을 갖는 캐릭터 디바이스들 SCSI 디바이스들 특별한 초기화를 필요로하는 디바이스들 ______________________________________________________________________ char-major-10 : Mice, watchdogs and randomness 하드웨어 디바이스는 대개 메이저 디바이스 번호를 통해 구별된다. 예를 들면 ftape은 char- major-27 이다. 그러나 /dev의 내용을 보면 캐릭터 메이저 번호 10을 갖는 항목을 볼 수 있는데 이것은 매우 다양한 디바이스에 의해 사용된다. o 다양한 종류의 마우스(bus mice, PS/2 mice) o Watchdog devices o The kernel 'random' device o APM (Advanced Power Management) interface 분명히 이러한 디바이스들은 하나가 아닌 서로 다른 모듈에 의해 제어된다. 그러므로 이것들에 대한 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()씨가 알려준 해결법이다: 마지막 방법은 setmix-0.1 패키지 () 를 설치하는 것이다. 그리고 다음과 같은 내용을 /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 kerneld가 이러한 옵션을 인식하려면 1.3.69f 나 그 이후 버전의 kerneld가 필요하다. ______________________________________________________________________ 주의: 이전 버전의 mini-HOWTO 는 kerneld가 모듈을 제거하기 전에 실행시키는 "pre-remove" 라는 명령어에 대해 언급하고 있다. 그러나 이것은 제대로 동작 하지 않아, 다음 kerneld 릴리즈에서는 제거될 것으로 예상된다. 모듈 설정과 관련된 모든 이슈들은 현재 진행중이고 이 글을 읽게되는 시점에는 이미 많은 변화가 일어났을 것이다. 6. kerneld의 작업 엿보기 만일 모든 방법을 시도해보았는데도 커널이 kerneld에게 요구하는 작업이 무엇인지 모를때는, kerneld가 받는 신호를 확인해 보는 방법이 있다. 그 결과 /etc/conf.modules에 어떤 내용을 넣어야 하는 알 수 있게 된다. 이때 사용하는 것이 kdstat 유틸리티이다. 이 멋진 프로그램은 모듈 패키지에 포함되어 있지만 기본적으로 검파일되거나 설치되지 않는다. 이것을 빌드하려면 cd /usr/src/modules-2.0.0/kerneld make kdstat 이제 kerneld 가 어떤 작업이 이루어지고 있는지 화면에 표시하도록 하려면 kdstat debug를 실행시킨다. 그러면 kerneld는 콘솔에 현재 어떤 일이 일어나고 있는지 메시지를 표시한다. 이때 사용자가 사용하고 싶어하는 명령어를 실행시키면 kerneld request들을 볼 수 있을 것이다. 이제 이것을 /etc/conf.modules에 추가하고 모듈에 대한 alias를 설정한다. 디버깅을 끝내려면 '/sbin/kdstat nodebug'을 실행시킨다. 7. kerneld의 특별한 사용 어떤 사람들은 스크린세이버 모듈을 설정하는 방법을 알고 싶어할 것이다. 모듈 패키지의 'kerneld/GOODIES' 디렉토리에는 스크린세이버를 위한 커널 패치를 포함하고 있다. 이것들은 공식적인 커널의 일부는 아니다. 그러므로 사용자가 직접 커널을 패치하고 커널을 빌드해야 한다. 패치를 설치하려면 "patch" 명령어를 사용한다. cd /usr/src/linux patch -s -p1 에게 메일을 보낸다. 이때 문제점을 포스팅하기 전에 kernel과 kerneld가 최신 버전인지 확인해야 한다. kerneld가 파일 시스템 모듈을 로드할때까지 mount가 기다리지 않는다. ______________________________________________________________________ mount(8) 명령어가 kerneld가 파일시스템 모듈을 로드할 때까지 기다리지 않는 다는 보고가 있었다. lsmod는 kerneld가 모듈을 로드했다고 할 때, mount를 반복하면 마운트를 할 수 있을 것이다. 이것은 module-utilities 1.3.69f 버전 의 버그로 보이는데 이것은 Debian 사용자에게 영향을 미친다. 최신 버전의 module-utilities를 사용하면 문제점을 해결할 수 있다. kerneld가 ncpfs 모듈을 로드하지 못한다. ______________________________________________________________________ ncpfs 유틸리티를 컴파일할때 반드시 -DHAVE_KERNELD옵션을 주어야 한다. ncpfs Makefile을 살펴본다. kerneld가 smbfs 모듈을 로드하지 못한다. ______________________________________________________________________ 아마도 smbmount 유틸리티의 버전이 오래된 것일 것이다. 최신 버전(0.10이나 그 후)을 가져와 사용한다. tsx-11.mit.edu/pub/linux/filesystems/smbfs/ 나는 모든 것을 모듈로 빌드했는데 시스템이 부팅되지 않는다. kerneld가 루프 파일 시스템 모듈을 로드하지 못한다. 모든 것을 모듈로 만들 수는 없다. 커널은 루트 파일 시스템을 마운트할 수 있도록 충분한 드라이버를 가지고 있어야 하고 kerneld를 실행시키는데 필요한 프로그램들을 가지고 있어야 한다. 그러므로 다음과 같은 것들은 모듈로 만들 수 없다. o 루트 파일 시스템이 있는 하드디스크용 드라이버 o 루프 파일 시스템 드라이버 o nit를 위한 binary foramt loader, kerneld 그리고 다른 프로그램들 [실은 위에서 말한 내용이 사실은 아니다. 1.3.x 이후 버전과 2.x 대의 커널은 initial ram-disk를 LILO라 LOADLIN에 의해 로드할 수 있도록 하고, 부트 과정에서 모듈들을 이 "디스크"에서 로드할 수 있다. 자세한 정보는 커널 소스의 Documentation/initrd.txt 파일에서 얻을 수 있다.] kerneld가 부트할때 로드되지 않고 libgdbm에 대해 불평한다. 새로운 버전의 kerneld는 실행하는데 GNU dbm 라이브러리 libgdbm.so를 요구한다. 대개 /usr/lib에 이 파일이 설치되지만 혹시나 /usr 파일 시스템을 로드하기 전에 kerneld를 실행시킬 수도 있다. 이 경우 kerneld는 부트할때 실행되지는 않지만, 시스템이 부팅된 후 사용자가 직접 kerneld를 실행시켜도 괜찮다. 해결 방법은 /usr 이 마운트된 후 kerneld 스타트 업을 옮기거나 gdbm 라이브러리 를 루트 파일 시스템 - 예를 들면 /lib - 로 옮긴다. "Cannot load module xxx"라는 메시지가 표시되지만, 커널을 빌드할때 xxx를 포함시키지 않았다. ______________________________________________________________________ 슬랙웨어는(혹은 다른 배포본도) 다양한 모듈에 대해 /etc/rc.d/rc.modules에서 modprobe를 실행시킨다. 이때 어떤 모듈을 modprobe할 것인가는 원래 커널 설정에 따른다. 그러므로 커널을 재설정하면서 rc.modules에 포함되지 않은 모듈을 설치하였다면 에러를 발생시키게 된다. 그러므로 rc.modules에서 사용하지 않는 모듈은 주석으로 바꾸고, 새로 추가한 모듈의 주석 표시를 제거하여 kerneld가 필요한 모듈이 어떤 것인지 제대로 알 수 있도록 한다. 커널과 모듈을 다시 빌드하였는데 여전히 부팅할때 unresolved symbols라는 메시지가 표시된다. ______________________________________________________________________ 아마도 사용자는 커널을 재설정하고 다시 빌드하여 몇몇 모듈을 제외시켰을 것이다. 그 결과 더 이상 사용되지 않는 모듈이 /lib/modules 디렉토리에 남아 있게 된다. 이런 문제를 해결하는 가장 쉬운 방법은 /lib/mod� ules/x.y.z 디렉토리를 지우고 커널 소스 디렉토리에서 'make mod� ules_install'을 다시 하는 것이다. 이때 버전을 바꾸지 않고 커널을 재설정에만 문제가 발생한다. 만일 새로운 커널 버전으로 바꾸었을때 이러한 에러를 만난다면, 또 다른 이유에서 문제가 발생한 것이다. 리눅스 커널 2.1을 설치했는데 모듈이 로드되지 않는다. ______________________________________________________________________ 리눅스 커널 2.1이 현재 개발 커널 버전이다. 그러므로 많은 것들이 수시로 변할 것이다. 가장 크게 바뀐 중 하나는 모듈을 처리하는 방법과 커널과 모듈이 메모리에서 로드되는 곳이다. 현재 Richard Henderson은 모듈 커널 개발을 책임지고 있다. 요약해서 말하자면, 만일 커널 2.1 에서 모듈을 사용하고 싶다면 반드시 * 시스템에서 업그레이드해야할 패키지를 설명한 Documentation/Changes 파일 을 읽는다. * 최신 modutils 패키지를 사용한다. 아래의 곳에서 구할 수 있다. 만일 커널 2.1 대의 커널에서 모듈을 사용하고 싶다면 최소한 2.1.19 버전의 커널을 사용할 것을 권한다. Dial-on-demand 네트워킹은 ? ______________________________________________________________________ kerneld는 원래 on demand 다이얼 업 네트워크를 지원하도록 되어 있다: 연결되지 않은 상황에서 네트워크로 패킷을 보내면 kerneld가 PPP나 SLIP 연결을 만들기 위해 /sbin/request_route 스크립트를 실행시킨다. 이러한 방법은 그리 좋은 아이디어가 아니라고 밝혀졌다. 리눅스 네트워킹을 담당하고 있는 Alan Cox는 리눅스 커널 메일링 리스트에 다음과 같이 썼다. Request-route 기능은 진부한 것이고 이미 망가진 것이어서 커널 2.1.x 대에 서 제거되었다. request-route 스크립트와 kerneld를 사용하는 대신 www.dna.lth.se/~erics/diald.html 에서 구할 수 있는 Eric Schenk's의 diald 패키지를 설치할 것을 충고한다. Copyright Messages ______________________________________________________________________ This document is Copyright (c) Henrik Storner, 1996, 1997. Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions. All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below. In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs. If you have questions, please contact Greg Hankins, the Linux HOWTO coordinator, at via email. ______________________________________________________________________