DONE_IS_BETTER_THAN_PERFECT.

커널 컴파일 및 패치

배철수: 리눅스 월드 발행인



    <목 차>

    1. 커널이란?

    2. 왜 커널을 컴파일해야 하는가?

    3. 커널 컴파일 준비 작업    3-1. 심볼릭 링크
        3-2. 커널 소스 설치

    4. 커널 소스 패치

    5. 커널 컴파일    5-1. make menuconfig(커널 컴파일 옵션)
        5-2. make dep
        5-3. make clean
        5-4. make bzImage
        5-5. make modules
        5-6. make modules_install

    6. lilo 에 새 커널 등록

    7. 커널 모듈 올리기

    8. 리부팅

    9. 커널 옵션 항목별 설명


1 커널이란?

    초보자는 커널이 무엇인지를 묻는다. 이 대답은 참 어렵다. 커널은 리눅스 그 자체라고 볼 수 있다. 여러분은 레드햇이나 데비안 같은 배포본을 리눅스라고 보통 말하나 좁은 의미에서의 리눅스는 커널을 의미한다. 리눅스를 다른 운영체제와 구별되게 하는 부분이 바로 커널이기 때문이다. 리누스토발즈가 리눅스를 만들었다고 말할 때의 리눅스는 커널을 말한다고 보아야 한다.

    예전에 도스를 사용해본 사람들은 디스켓 한 장으로 시스템 디스켓을 만들어 보았을 것이다. 도스에서 시스템 디스켓(부팅 디스켓이라고도 말한다.) 을 만들려면 디스켓을 넣고 아래 명령을 준다.
     

    format a:/s


    그러면 포맷이 완료된 후 "시스템 전송이 완료되었습니다.(system transferred)" 란 메시지가 나오면서 시스템 디스켓이 만들어 지고 이 디스켓으로 도스를 부팅 할 수 있다.

    이 디스켓을 dir 명령으로 보면 command.com 파일 한 개만 보이나 norton 같은 프로그램으로 조사하면 두 개의 숨겨진 파일을 볼 수 있다. 즉 msdos.sys 와 io.sys 파일이다. 도스에서는 이 셋 즉 io.sys, msdos.sys, command.com 을 시스템 파일이라 부른다. 윈95, 98 에도 물론 이 파일들이 들어 있다.(c: 드라이브에 있다.) 윈95, 98도 아직 도스의 그늘을 벗어나지 못했기 때문이다.

    리눅스의 커널은 바로 도스의 msdos.sys와 io.sys를 합한 것과 비슷한 역할을 한다고 보면 된다. 즉 사용자 프로그램과 하드웨어를 연결해 주는 역할을 한다. 하드웨어 중 가장 중요한 것이 바로 CPU와 메모리 이므로 이 둘을 관리하는 것이 커널의 가장 중요한 부분이다. 도스의 command.com은 명령 해석기라고 해서 사용자의 입력을 해석하는 역할을 담당하는데 이에 해당하는 프로그램은 리눅스에는 여러가지가 있다. 대표적인 것은 bash 이다.

    리눅스에서 커널은 보통 /boot 디렉토리나 루트디렉토리(/)에 vmlinuz, bzImage 란 이름으로 들어 있다.(디렉토리 및 이름은 마음대로 지정할 수 있다.) 정확한 이름을 알려면 /etc/lilo.conf 파일을 보면 된다. 이 파일에서 "image= "로 시작하는 라인에 나와 있는 파일명이 커널이다.

    리눅스에서는 lilo.conf 파일에 여러 개의 커널을 등록해 놓고 선택해서 부팅 할 수 있다. 아래의 lilo.conf 파일에는 4 개의 커널이 등록되어 있다.
     

    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=40
    image=/boot/bzImage.1009
           label=bz9
           read-only
           root=/dev/hda2
    image=/boot/bzImage.0929
           label=bz8
           read-only
           root=/dev/hda2
    image=/boot/bzImage.0912
           label=bz7
           read-only
           root=/dev/hda2
    image=/boot/bzImage.0909
           label=bz6
           read-only
           root=/dev/hda2


    위의 경우 부팅 시에 4 개의 커널 중 한 개를 선택해서 부팅 할 수 있다. "boot: " 프롬프트가 나오면 TAB키를 누른다. 그러면 아래처럼 선택 가능한 커널 목록이 나온다.
     

    LILO boot:
    bz9 bz8 bz7 bz6


    여기서 넷 중 하나를 입력하면 해당 커널이 메모리에 로드된다. 즉 사용된다. (아래에서는 bz9를 입력하였으므로 /boot/bzImage.1009) 커널로 부팅된다.
     

    boot: bz9
    Loading bz9............
    Linux version 2.2.17 (root@www) (gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)) #80
    Detected 731480 kHz processor.
    Console: colour VGA+ 80x25
    Calibrating delay loop... 1458.18 BogoMIPS
    ------------------


    현재 메모리에 올라와 있는 커널을 변경하려면 리눅스를 리부팅해야 한다.


2. 왜 커널을 컴파일해야 하는가?

    리눅스를 많이 사용하는 사람들도 커널을 컴파일해야 한다고 말하면 그게 왜 필요하냐고 묻는다. 배포본에서 제공하는 기본 커널에 모듈 올려서 사용하면 되지 않느냐고 말한다. 커널 모듈이란 커널의 코드를 별도의 파일로 저장해 놓은걸 말한다. 모듈은 그 기능이 필요할 때만 메모리에 올려서 사용할 수 있다는 장점이 있다. 요즘 배포본 들은 거의 모든 커널 옵션을 모듈로 저장하고 있으므로 모듈만으로도 물론 필요한 기능을 사용할 수 있다. 그럼에도 불구하고 커널을 꼭 컴파일해야 되는 경우가 있다. 또 커널을 스스로 컴파일해서 사용하는게 배포본에서 제공하는 기본 커널을 사용하는 것 보다 당연 낫다. 아래에 그 이유를 든다.


A. 커널을 업그레이드 하는 경우

    예를들어 자신이 사용 중인 커널 버전이 2.0.x 인데 커널 2.2.X에서 제공하는 기능을 사용하고 싶을 때가 있다. 최신 랜카드 드라이버 등은 최신 버전의 커널에만 드라이버가 들어있기 때문이다. 이때 리눅스를 최신 배포본으로 새로 설치할 수 없다면 커널만 최신버전으로 업그레이드하면 된다. 이 경우에 다른 곳에서 2.2.X 버전의 커널과 커널 모듈을 복사해서 설치한다는 건 매우 힘들다. 새로 커널을 컴파일해서 설치하는게 용이하다.

    커널은 항상 가장 최신 버전이 좋다. 최신 버전에는 구 버전에 있는 사소한 버그들이 수정되어 있고, 메모리나 CPU도 보다 효율적으로 사용한다. 또 최근에 나온 최신 하드웨어 드라이버들도 들어 있기 때문이다.


B. 커널 모듈이 아직 제공되지 않는 경우

    일부 테스트용 드라이버 등은 배포본에서 제공하는 모듈에도 들어 있지 않다. PPPoE, UDMA66/100 지원 등은 최신 배포본에도 커널 모듈이 없다. 이런 경우에는 패치 파일을 구해서 커널을 패치 한 후 커널을 컴파일해야 한다.


C. 자원 절약/ 성능 향상

    메모리나 CPU 등을 최소화해야 하는 embedded 시스템의 경우는 메모리나 CPU 부담을 덜기 위해 가급적 커널의 크기를 줄여야 한다. 이 경우에는 배포본에서 제공하는 기본 커널을 사용하지 않는다. 배포본에서 제공하는 기본 커널에는 그 시스템에서 사용하지 않는 코드가 많이 포함되어 있기 때문이다.

    또 대부분의 배포본 들은 모든 PC에서 사용이 가능하도록 기본 커널을 386 CPU 로 설정해서 컴파일한다.(386용으로 컴파일한 커널은 486이나 펜티엄에서 사용 가능하나 그 역은 안된다.) 386 CPU 용 커널을 펜티엄 III CPU에 올려 사용한다면 펜티엄 CPU가 갖고 있는 최신 기능을 100% 발휘할 수 없는 건 당연하다. 경주용 차를 시내에서 몰고 다니는 격이다. 이는 커널을 컴파일하지 않고는 해결할 수 없다.

    또 같은 기능을 모듈로 올리는 것 보다 커널에 포함하는 것이 메모리 사용, 처리 속도 등에서 유리하고 안정적이다.


D. 모듈 의존 관계를 잘 모를 경우

    커널 모듈을 여러 개 동시에 사용하는 경우는 모듈을 올리는 순서가 중요하다. 모듈을 올리는 순서가 틀리면 모듈이 메모리에 올라가지 않는다. 그러나 커널에 포함시켜 컴파일한다면 이런 순서는 알 필요가 없다.

    결론으로 커널의 경우 가장 작은 것이 가장 아름답다. 배포본에서 제공하는 기본 커널보다 여러분이 직접 필요한 기능만 선택해서 만든 커널이 크기가 작다는 것은 물어볼 필요도 없다. 자기 시스템에 맞추어 만든 커널이 모든 피시에 맞추어 만든 커널보다 효율적인 것도 당연하다.

    그리고 랜카드 드라이버 처럼 항상 사용하는 기능이라면 구태여 모듈에 넣을 필요가 없다. 그냥 커널에 포함시켜 컴파일하는게 당근 낫다. 필자는 지금도 필자가 설치하는 모든 서버의 커널은 반드시 컴파일해서 사용한다. 배포본에서 제공하는 커널은 절대 사용하지 않는다. 386 용 커널을 펜티엄에서 사용한다는 건 한마디로 자원 낭비이기 때문이다. 모듈은 새로운 기능을 테스트하는 경우에 일시적으로 사용한다.

    여러분이 리눅스 사용한다고 여자 친구에게 자랑하는데 그녀가 "커널 컴파일 어떻게 해요?" 라고 질문했을 때 "난 컴파일은 못하고 그냥 모듈 올려서 사용하는데요." 이렇게 답변하고 싶지는 않겠죠?


3. 커널 컴파일 준비작업

3.1 심볼릭 링크

    커널 컴파일에는 몇 가지 링크가 필요하다. 이 부분이 왜 필요한지는 설명하지 않는다.(필자도 자세히 알지 못하므로..) 여러분이 리눅스에서 어떤 프로그램을 컴파일하려는데 알 수 없는 에러가 발생한다면 우선 이 부분이 제대로 돼 있는지 확인해 보고 다음에 커널 소스가 /usr/src/linux에 설치되어 있는지 확인하라. 이 링크는 커널 컴파일에만 필요하지 않고 다른 프로그램을 컴파일하는 경우에도 필요한 경우가 있기 때문이다.

    아래 작업은 리눅스 설치 후에 처음 커널을 컴파일하기 전에 한번만 해주면 되고 이후에는 필요가 없다.(/usr/src/linux 디렉토리에서 커널을 컴파일할 수 있다면 아래 단계는 생략해도 된다. 아래 작업을 반복해도 문제되지 않는다.) 아래 작업은 root 계정으로 실행해야 한다.
     

    1) cd /usr/include
    2) rm -rf asm linux scsi
    3) ln -s /usr/src/linux/include/asm-i386 asm
    4) ln -s /usr/src/linux/include/linux linux
    5) ln -s /usr/src/linux/include/scsi scsi


    링크가 정확한지를 필히 확인한다. 아래처럼 나와야 한다.
     

    churlsu:/usr/include# ls -l asm linux scsi
    lrwxrwxrwx 1 root root 32 May 9 10:11 asm -> /usr/src/linux/include/asm-i386/
    lrwxrwxrwx 1 root root 29 May 9 10:11 linux -> /usr/src/linux/include/linux/
    lrwxrwxrwx 1 root root 28 May 9 10:11 scsi -> /usr/src/linux/include/scsi/

     


3.2 커널 소스 설치

    1) 소스를 다운 받는다.

      커널 소스는 여러 곳에서 미러링하고 있다. 공식 사이트는 ftp.kernel.org 이며 anonymous ftp로 다운 받을 수 있다. 필자가 글을 쓰는 현재 시점에서 안정버전 최신 커널은 2.2.17이다. 앞으로의 모든 글은 2.2.17 버전을 기준으로 한다. 2.3.X 버전은 개발자용이므로 업무용으로는 사용하지 않는게 좋다.
       

      > ftp ftp.kernel.org
      Connected to zeus.kernel.org.
      220 ProFTPD 1.2.0 Server (ProFTPD) [zeus.kernel.org]
      Name (ftp.kernel.org:root): ftp
      331 Anonymous login ok, send your complete e-mail address as password.
      Password:
      ...
      230 Anonymous access granted, restrictions apply.
      Remote system type is UNIX.
      Using binary mode to transfer files.
      ftp> cd /pub/linux/kernel/v2.2
      ftp> bin
      200 Type set to I.
      ftp> hash
      Hash mark printing on (1024 bytes/hash mark).
      ftp> get linux-2.2.17.tar.gz
      local: linux-2.2.17.tar.gz remote: linux-2.2.17.tar.gz
      200 PORT command successful.
      150 Opening BINARY mode data connection for linux-2.2.17.tar.gz (17561308 bytes).


      다운이 끝나면 linux-2.2.17.tar.gz 파일을 /usr/src 디렉토리에 넣는다.


    2) /usr/src 디렉토리에 linux 라는 디렉토리가 있다면 이를 지운다.
     

      rm -rf /usr/src/linux


    3) 커널 소스의 압축을 해제한다.

      (1) cd /usr/src
      (2) tar zxvf linux-2.2.17.tar.gz

      * 커널 소스가 bz2 파일인 경우 아래처럼 압축을 해제한다.
       

      bz2cat linux-2.2.17.tar.bz2 | tar xvf -


      /usr/src 디렉토리에 linux 라는 디렉토리가 만들어지며 그 안에 커널 소스가 위치한다.

      *  커널 소스가 여러 개 인 경우 각각의 커널 소스를 구별하기 위해
         필자의 경우 커널소스를 설치한 후 linux 라는 디렉토리를 linux-x.y.z 로 변경하고
         (mv linux linux-2.2.17), 이 디렉토리를 linux 라는 이름으로 심볼릭 링크해 준다.
         (ln -s linux-2.2.17 linux)  이유는 커널 컴파일 시 커널 소스는 반드시
         /usr/src/linux 디렉토리에 위치해야 하기 때문이다. 아래와 같다.
       

      lrwxrwxrwx 1 root root 12 Nov 27 11:38 linux -> linux-2.2.17
      drwxr-xr-x 15 1007 1007 2048 Oct 17 19:24 linux-2.2.17



4. 커널 소스 패치

    자신이 필요로 하는 커널 기능이 기본 커널 소스에 들어 있지 않은 경우에는 커널 소스를 패치해야 한다. 패치는 물론 커널 소스를 설치하고서 커널 컴파일 전에 해야 한다. 커널 소스를 패치한다는 의미는 커널 소스의 특정 파일(들)의 소스코드를 다른 코드로 변경하는 것을 말한다. 그 파일 전체를 새로운 것으로 변경하는 것 보다는 변경되는 부분만 별도 파일에 저장하는 것이 크기가 작기 때문이다. 패치 파일로 원래의 파일을 수정하는 명령은 patch 이다.

    예를 들어 설명해 보자. 커널 2.2.17 버전에는 udma66/100 지원이 들어 있지 않으므로 UDMA66/100 하드를 UDMA66/100 콘넥터에 연결해도 UDMA 기능을 사용하지 않는다. 지난 호의 리눅스월드에 이에 관한 기사를 실었는데 2.2.17 커널 소스에 UDMA66/100 지원 기능을 추가하기 위해서는 아래 패치 파일이 필요하다.
     

    -rwxr--r-- 1 root root 933374 Nov 30 17:27 ide.2.2.17.all.20000904.patch.gz


    이 패치 파일은 커널 2.2.17 용이다. 다른 버전에는 적용되지 않는다. 이 패치 파일을 사용해서 2.2.17 커널 소스를 패치하는 방법은 아래와 같다.(위 파일은 압축 파일이 아니다.) 이 파일은 현재 /usr/src 디렉토리에 있다고 가정한다.

    이 파일의 소스를 잠시 보자.(제일 첫 부분)
     

    diff -urN linux-2.2.17-pristine/CREDITS linux-2.2.17/CREDITS
    --- linux-2.2.17-pristine/CREDITS Mon Sep 4 10:39:15 2000
    +++ linux-2.2.17/CREDITS Mon Sep 4 21:13:58 2000


    여기서 세 번째 라인을 보면 +++linux-2.2.17/CREDITS 라고 나온다. 즉 linux-2.2.17/CREDITS 파일을 수정한다는 의미다. 그런데 우리의 경우는 커널 소스가 linux 디렉토리에 있고 CREDITS 파일도 이 디렉토리에 있다. 그러므로 패치하는 명령은 아래와 같다.
     

    1) cd /usr/src/linux
    2) patch -p1 < /usr/src/ide.2.2.17.all.20000904.patch.gz


    * -p1 옵션은 패치 파일의 디렉토리 경로 지정에서 몇 개의 디렉토리 구분문자(/)를 제거할
       지를 결정한다. 1 은 한 개만 제거하라는 뜻이다. 0 이라면 그대로 사용된다. 위의 경우
       현재의 디렉토리는 /usr/src/linux이고 CREDITS 파일은 현행 디렉토리에 위치하고 있다.
       따라서 패치파일의 파일 경로 linux-2.2.17/CREDITS 에서 한 개의 디렉토리 구분문자(/)를
       제거하면 CREDIT 파일이 위치한다. (즉 linux-2.2.17/ 까지를 제거하라는 뜻이다.)

    만약 /usr/src 디렉토리에서 위의 패치 명령을 실행하려면 커널 소스가 linux-2.2.17 디렉토리에 위치해야 하고 이때의 옵션은 -p0 가 될 것이다.
    이상의 패치 명령을 주면 아래처럼 결과가 나온다.(일부 생략)
     

    patching file `CREDITS'
    patching file `scripts/MAKEDEV.ide'


    커널 소스 패치의 다른 예를 들겠다.

    3com 사의 3c905b-XX 랜카드를 사용하려면 역시 3com 사의 리눅스용 드라이버 파일을 다운 받아 커널 소스를 패치하고 커널을 컴파일해야 한다. 3com사의 드라이버 파일은 아래와 같다.
     

    -rwxrw-r-- 1 bae bae 205869 Jun 18 17:51 3c90x-1.0.0i.tar.gz


    이 파일을 /usr/src 디렉토리에 넣고 압축을 해제한다.
     

    tar zxvf 3c90x-1.0.0i.tar.gz


    그러면 3c90x-1.0.0 이라는 디렉토리가 만들어 지고 그 디렉토리 내용은 아래와 같다.
     

    -rw-r--r-- 1 3513 13900 170567 Feb 26 2000 3c90x.c
    -rw-r--r-- 1 3513 13900 49928 Feb 26 2000 3c90x.h
    -rw-r--r-- 1 3513 13900 18599 Sep 10 1999 LICENSE
    -rw-r--r-- 1 3513 13900 13701 Mar 10 2000 README
    -rw-r--r-- 1 3513 13900 1630 Sep 1 1999 README.install
    -rwxr-xr-x 1 3513 13900 213 Feb 26 2000 compile_SMP
    -rwxr-xr-x 1 3513 13900 204 Feb 26 2000 compile_UP
    drwxr-xr-x 9 3513 13900 1024 Feb 26 2000 i486
    -rwxr-xr-x 1 3513 13900 1345 Feb 23 2000 install3c90x
    -rw-r--r-- 1 3513 13900 257215 Feb 26 2000 patch-2.0.36
    -rw-r--r-- 1 3513 13900 231252 Mar 10 2000 patch-2.2.5


    위에서 patch-2.2.5 파일이 커널 2.2.5 버전용 패치 파일이나 이 파일을 커널 2.2.17에서도 사용 가능하다.
    이 파일의 맨 첫 부분을 보면 다음과 같다.
     

    --- Documentation/Configure.help Fri Aug 6 16:41:13 1999
    +++ Documentation/Configure.help.patched Fri Aug 6 14:08:55 1999 @@ -5782,6 +5782,36 @@
    Documentation/networking/net-modules.txt. The module will be called 3c509.o.


    위에서 Docomentation 이라는 디렉토리는 커널 소스의 /usr/src/linux 디렉토리에 있다. 따라서 /usr/src/linux 디렉토리에서 위의 파일 경로를 변경없이(-p0) 적용해서 패치 하면 된다. 방법은 아래와 같다.
     

    1) cd /usr/src/linux
    2) patch -p0 < ../3c90x-1.0.0/patch-2.2.5


    *  ../3c90x-1.0.0/patch-2.2.5 은 패치 파일 위치를 상대 경로로 적은 것이다.
        이를 /usr/src/3c90x-1.0.0/patch-2.2.5 로 표시해도 된다.
        이 명령을 주면 아래 메시지가 화면에 표시된다.
     

     patching file `Documentation/Configure.help'
    Hunk #1 succeeded at 6500 (offset 718 lines).
    patching file `drivers/net/Config.in'
    Hunk #1 succeeded at 76 (offset 18 lines).
    patching file `drivers/net/Makefile'
    Hunk #1 succeeded at 540 (offset 30 lines).
    patching file `drivers/net/Space.c'
    Hunk #1 succeeded at 84 (offset 3 lines).
    Hunk #2 succeeded at 193 (offset 19 lines).
    patching file `drivers/net/3c90x.c'
    patching file `drivers/net/3c90x.h'
    patching file `Documentation/networking/3c90x.txt'


    이렇게 패치를 했다고 끝난게 아니다. 패치가 끝났으면 반드시 make menuconfig에서 패치한 부분을 선택해 주어야 한다. 3c905 드라이버를 패치했으면 make menuconfig 에서 아래 메뉴가 추가로 나온다.(안 나오면 패치가 안되었거나 make menuconfig에서 이더넷 관련 선택을 빠뜨린 것이다.)
     

    [*] 3c90x/3c980 B/C series "Cyclone/Hurricane/Tornado" support (NEW)


    커널 패치는 보통 해당 패치 파일 작성자가 패치 방법을 작성해 놓은 경우가 많으므로 그 방법대로 따라하면 된다.


5. 커널 컴파일

    이제 본격적으로 커널을 컴파일하는 작업이 남아 있다. 아래 순서는 가장 많이 쓰이는 방법을 설명했다. 다른 방법도 물론 있다.


5.1  make menuconfig

    커널에 포함될 옵션을 선택하는 부분이다. 여기서는 그 옵션을 커널에 포함시킬지 모듈로 만들 것인지 또는 어느 쪽에도 넣지 않을지를 선택한다. 단 모든 옵션이 모듈로 선택할 수 있지는 않다. 일부는 모듈 옵션이 없다.  

    또 일부 메뉴는 단지 다른 선택 메뉴를 표시할지 않을지 만을 결정한다. 예를 들어 [ ] NFS server support (NEW) 라는 메뉴는 맨 처음 나오는 아래 메뉴를 선택하지 않으면 선택할 수 없다.(선택 메뉴가 나타나지 않는다.)
     

    [*] Prompt for development and/or incomplete code/drivers


    또 ip firewall 을 선택해야만 ip masquerading 선택 메뉴가 나타난다. 즉 ip masquerade 는 커널에 ip firewall 기능이 들어가야 가능하기 때문이다. 즉 메뉴 선택에는 상호 의존 관계가 있으므로 유의해야 한다.

    각 선택 메뉴에 대해서는 이 글의 맨 뒤에서 자세히 설명하겠다.


5.2  make dep

5.3  make clean

5.4  make bzImage

    이 단계까지 마치면 /usr/src/linux/arch/i386/boot 디렉토리에 bzImage 라는 이름으로 새 커널이 만들어 진다. 하지만 만들어질 따름이지 이 커널이 메모리에 들어 있는 사용 중인 커널을 대치해 주는 것은 아니다. lilo를 수정 후 리부팅해야 커널이 바뀐다.

    아래는 커널 모듈을 만든다. 메뉴에서 모듈로 선택한 항목은 /lib/modules/KERVEL-VERSION 디렉토리에 모듈로 저장된다.(2.2.17의 경우 /lib/modules/2.2.17) make menuconfig에서 모듈을 전혀 선택하지 않았어도 아래 단계는 필요하다. 일부 기능은 오직 모듈로만 가능하기 때문이다. 예를 들어 ip masquerade 를 선택한 경우 이와 관련된 일부 기능은 모듈로만 만들어 지므로 아래 두 단계를 실행해서 모듈을 설치해주어야 한다.

5.5  make modules

5.6  make modules_install


6. lilo.conf에 새 커널 등록

    새 커널이 만들어 졌으면 다음 번 리부팅 때 새로운 커널이 사용되도록 /etc/lilo.conf 에 새 커널을 등록하고서 lilo 명령을 실행해야 한다. lilo.conf에는 여러 개의 커널을 등록할 수 있으므로 새로운 커널을 등록할 때는 기존 커널을 다른 이름으로 변경해 선택 부팅 할 수 있게 만드는 것이 좋다. 그래야 새 커널로 부팅해서 문제가 발생하면 기존의 커널로 리부팅 할 수 있기 때문이다.

    기존의 커널 이름이 vmlinuz 이고 /boot 디렉토리에 위치하고 있다고 가정하면 새 커널을 등록하는 순서이다.

    1) cp /usr/src/linux/arch/i386/boot/bzImage /boot

    2) /etc/lilo.conf 수정
     

    image=/boot/bzImage
    label=linux
    read-only
    root=/dev/hda2
    image=/boot/vmlinuz
    label=backup
    read-only
    root=/dev/hda2


    위에서는 루트 파티션이 /dev/hda2 에 위치하는 경우이다. 기존 커널은 backup 이라는 라벨로 변경했다. lilo.conf 의 다른 부분은 그대로 두어야 한다. 단 "default = XXX" 옵션이 있다면 이를 default=linux 로 변경해야 한다.

    3) lilo <enter>


7. 커널 모듈 올리기

    모듈로 선택한 커널 옵션은 레드햇의 경우는 /etc/conf.modules 에 데비안은 /etc/modules에 등록해야 부팅 때 자동으로 메모리에 적재된다. 일시적으로 사용할 때는 insmod 명령으로 가능하다.


8. 리부팅

    새 커널은 리부팅해야 효력이 발생된다. 커널이 변경되었는지 확인하려면 아래 명령을 준다. 현재 메모리에 올라와 있는 커널의 버전과 만든 날짜가 나타난다.
     

    A. uname -a

    Linux www 2.2.17 #8 Mon Oct 9 03:13:53 KST 2000 i686 unknown



9. 커널 옵션 항목별 설명

    커널 옵션 중 상당수는 필자도 사용해 본적이 없어 자세히 알지 못하므로 이 경우는 메뉴의 도움말 및 다른 자료들을 참조해서 설명한다. 2.2.17 버전을 기준으로 했다. 아래에서 선택을 하는 것은 Yes,(스페이스 키를 눌러 * 또는 M이 나타나게 함.), 선택 않는 것은 No(공백)로 표현했다.

    아래는 make menuconfig 에서 맨 처음 나오는 메인메뉴이다. 왼쪽의 번호는 필자가 설명을 위해 부여했다.

    Main Menu
    Arrow keys navigate the menu. <Enter> selects submenus --->. Highlighted
    letters are hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes
    features. Press <Esc><Esc> to exit, <?> for Help. Legend: [*] built-in
    [ ] excluded <M> module < > module capable
    ---------------------------------------------------------
    1) Code maturity level options --->
    2) Processor type and features --->
    3) Loadable module support --->
    4) General setup --->
    5) Plug and Play support --->
    6) Block devices --->
    7) Networking options --->
    8) Telephony Support --->
    9) SCSI support --->
    10) I2O device support --->
    11) Network device support --->
    12) Amateur Radio support --->
    13) IrDA (infrared) support --->
    14) ISDN subsystem --->
    15) Old CD-ROM drivers (not SCSI, not IDE) --->
    16) Character devices --->
    17) Filesystems --->
    18) Console drivers --->
    19) Sound --->
    20) Kernel hacking --->
     

    <Select> < Exit > < Help >


1) Code maturity level options

    1-1> Prompt for development and/or incomplete code/drivers

    커널 코드/드라이버 중 아직 개발이 완성되지 않은 부분을 사용할 것인지를 선택한다. 이 메뉴를 선택해야 일부 개발 중인 커널 옵션 선택 메뉴가 나타난다. 예를 들어 리눅스를 NFS Server로 사용하는 것 등이다. 다른 선택 메뉴 표시 여부만 결정하므로 선택하는게 좋다.


2) processor type and features

    2-1> (PPro/6x86MX) Processor family  

    ( ) 386
    ( ) 486/Cx486
    ( ) 586/K5/5x86/6x86
    ( ) Pentium/K6/TSC
    ( ) PPro/6x86MX


    CPU를 선택한다. 상위 CPU를 선택하면 하위 CPU에서 작동하지 않을 수 있다. 즉 586을 선택하면 386 이나 486 CPU에서 작동하지 않을 수 있다. 하위 CPU를 선택하면 상위의 모든 CPU에서 사용 가능하다. 386을 선택하면 모든 인텔 호환 CPU에서 사용 가능하다. 아래가 선택 기준이다.

      2-1-1. 386 AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI, 486DLC/DLC2, UMC 486SX-S

      2-1-2. 486AMD/Cyrix/IBM/Intel DX4, 486DX/DX2/SL/SX/SX2, AMD/Cyrix 5x86, NexGen Nx586, UMC U5D, U5S

      2-1-3. 586펜티엄 모델 중 TSC(time stamp counter) 레지스터가 없는 CPU

      2-1-4. Pentium entium/Pentium MMX, AMD K5, K6, K6-3D

      2-1-5. PProCyrix/IBM/National Semiconductor 6x86MX, MII, Pentium II/Pentium Pro

    2-2> Maximum Physical Memory

    최대 물리적 메모리 크기를 선택한다. 1GB 와 2GB 중 선택한다. 1기가 이상 메모리를 사용하지 않는다면 1기가를 선택한다.

    2-3> Math emulation

    부동 소수점 연산 코프로세서를 내장하지 않은 CPU(486SX, 386) 에서는 선택해야 한다. 486SX나 386 CPU 경우에도 코프로세서를 보드에 별도로 장착한 경우는 이 옵션이 필요 없다. 요즘 나오는 피시는 무조건 no 이다.

    2-4> MTRR (Memory Type Range Register) support

    펜티엄 프로, 펜티엄 II CPU 이상의 시스템에서 이를 선택하면 PCI/AGP 버스의 그래픽 이미지 처리속도가 2.5 배 정도까지 향상되는 경우가 있다. X 윈도우에서 유용하다. 선택 않아도 문제는 없다.

    2-5> Symmetric multi-processing support

    둘 이 상의 CPU를 사용할 때 선택한다. Y 를 선택하면 일부 싱글 CPU 시스템에서는 작동하지 않을 수도 있다. 작동하더라도 속도가 느려지므로 싱글 CPU에서는 선택하지 않는게 좋다.


3) Loadable module support

    3-1> Enable loadable module support

    모듈을 사용하는 경우는 Yes, 잘 알지 못하면 Yes로 해도 무방함.


    3-2> Set version information on all symbols for modules (NEW)?

    Yes를 선택하면 커널을 새로 컴파일 한 경우에도 예전에 컴파일한 모듈 사용이 가능하다. 다른 곳에서 모듈을 가져와 사용하는 경우 Yes를 선택하면 유리하다. No로 해도 문제 없다.


    3-3> Kernel module loader (NEW)

    모듈을 필요시 자동으로 메모리로 적재되게 하는 기능이다. 모듈을 여러 개 사용한다면 Yes


4) General setup

    4-1> Networking support

    다른 컴퓨터와 네트워크를 구성하려면 꼭 필요하다. 단독 시스템의 경우에도 필요한 경우가 있으므로 무조건 Yes


    4-2> PCI support

    피시의 버스 중에서 PCI 버스를 갖는 보드에서는 YES. 펜티엄 이상의 피시에는 모두 PCI 가 있다.

      4-2-1. PCI access mode

      1) BIOS
      2) Direct
      3) Any

      세가지의 선택이 있다.

      PCI 장치를 찾는 방식을 선택한다. 디폴트는 Any 다. 이 경우는 커널에서 직접 PCI 디바이스를 찾고 실패시는 BIOS를 참조한다. BIOS 는 PCI 장치를 BIOS에서 찾게 할 때 선택한다. Any 를 선택하는게 좋다.

      4-2-2. PCI quirks

      BIOS에서 PCI 설정을 잘 못해 주는 경우에 이를 조정해서 최적화 해준다. Yes 로 하는게 좋다. 선택하면 커널 크기가 약간 커진다.

      4-2-3. PCI bridge optimization (experimental) (NEW)

      1을 선택해야 나타난다. PCI 버스를 사용하는 경우 BIOS에 특히 문제가 있을 때 사용하면 일부 장치의 접근을 용이하게 한다. 특별한 경우만 Yes

      4-2-4. Backward-compatible /proc/pci

      PCI 버스의 정보를 얻는데 /proc 파일 시스템을 사용한다. 이 부분의 호환성을 유지하기 위한 것이다. Yes를 선택한다.


    4-3> MCA support

    MCA(MicroChannel Architecture)는 IBM 의 ps/2 기종에 채택된 버스 방식이다. 다른 피시에는 사용되지 않는다. No를 선택


    4-4> SGI Visual Workstation support

    SGI 워크스테이션에 필요하다. 피시에는 No


    4-5> System V IPC

    Yes 를 선택


    4-6> BSD Process Accounting

    Yes 를 선택


    4-7> Sysctl support

    Yes 를 선택

      4-7-1. Kernel support for a.out binaries

      초창기의 a.out 형식의 파일 지원에 필요하다. 모듈로도 가능하며 모듈 이름은 binfmt_aout.o 이다. 선택하지 않으면 메모리가 1 페이지 준다. 아직도 일부에서 a.out 을 사용하므로 선택해야 한다.

      4-7-2. Kernel support for ELF binaries

      ELF (Executable and Linkable Format) 는 기존의 a.out 을 대체해 리눅스에서 많이 사용되므로 Yes

       4-7-3. Kernel support for MISC binaries

      Java, Python, Emacs-Lisp, DOSEMU 프로그램 실행에 필요하다. Yes

       4-7-4. Kernel support for JAVA binaries (obsolete) (NEW)

      자바 바이너리 프로그램을 실행하기 위해 필요하다. Java Developers Kit(JDK)를 설치해야 한다. Yes 를 선택. 메인 메뉴 "1"을 선택해야 나타난다.


    4-8> Parallel port support

    패러랠 포트를 통해 프린터, Zip 드라이브, PLIP 연결 등을 하려면 선택한다. Yes

      4-8-1. PC-style hardware (NEW)

      IBM 호환 피시 또는 일부 알파 기종의 패러랠 포트에서는 이를 선택해야 한다. 모듈로도 가능하다. 모듈 이름은 parport_pc.o 이다. Yes

       4-8-2. Support foreign hardware (NEW)

      비 표준 패러랠 포트에서 선택한다. No


    4-9> Advanced Power Management BIOS support

    APM 기능을 리눅스에서 통제하거나 상태를 보고자 할 때 필요하다. 노트북에서는 Yes, 피시의 경우는 일부 기종에서 이를 선택시 문제가 발생할 수 있다. 하드디스크나 모니터에는 영향이 없다. Yes


      4-9-1. Ignore USER SUSPEND (NEW)

      USER SUSPEND 를 무시하는 옵션. NO

      4-9-2. Enable PM at boot time (NEW)

      NO 를 선택한다.

      4-9-3. Make CPU Idle calls when idle (NEW)

      NO 를 선택한다

      4-9-4. Enable console blanking using APM (NEW)

      NO 를 선택한다

      4-9-5. Ignore multiple suspend/resume cycles (NEW)

      노트북에서는 Yes

      4-9-6. RTC stores time in GMT (NEW)

      리눅스만 사용하며 CMOS 셋업 시간이 GMT 인 경우 Yes. 윈도우와 멀티부팅이라면 NO

      4-9-7. Allow interrupts during APM BIOS calls (NEW)

      피시에서는 No , IBM의 일부 싱크패드 기종에서는 Yes 필요.

      4-9-8. Use real mode APM BIOS call to power off (NEW)

      셧다운이 정상적으로 이루어 지지 않는 일부 기종에서만 Yes

      4-9-9. Toshiba Laptop support

      도시바 랩탑에서만 yes


5) Plug and Play support

    5-1> Plug and Play suppor

    Yes 를 선택

      5-1-1. Auto-probe for parallel devices (NEW)

      IEEE-1284 표준을 따르는 패러랠 포트 장치에서 자동으로 장치를 찾게 하는데 필요. Yes로 해도 무관


6) Block devices

    6-1> Normal PC floppy disk support

    플로피 드라이브를 사용하려면 Yes


    6-2> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support

    SCSI 하드만을 사용한다면 No, 그 외는 Yes. 루트 파일 시스템이 IDE 하드에 있다면 모듈로 올리지 말 것.


    6-3> Use old disk-only driver on primary interface

    일부 486 이전 피시(IDE 콘넥터가 1개) 에서만 Yes, 그 외는 No


    6-4> Include IDE/ATA-2 DISK support

    6-3과 비슷함. Yes 를 선택. SCSI 만(하드 및 CD 모두) 사용한다면 NO 도 가능.


      6-4-1. Use multi-mode by default

      부팅시 아래에러 발생시만 Yes.
       

      hda: set_multmode: status=0x51 { DriveReady SeekComplete Error }
      hda: set_multmode: error=0x04 { DriveStatusError }

       

    6-5> Include IDE/ATAPI CDROM support

    (E)IDE 콘넥터에 연결하는 CD 드라이버를 사용한다면 Yes. SCSI CD 드라이브라면 No 도 가능. Yes


    6-6> Include IDE/ATAPI TAPE support

    (E)IDE 콘넥터에 연결하는 테이프 드라이버를 사용한다면 Yes. SCSI 테이프 드라이브라면 No, 그 외의 경우도 No.


    6-7> Include IDE/ATAPI FLOPPY support

    IDE 콘넥터에 연결하는 플로피 장치를 사용한다면 Yes. (일반 플로피 드라이브는 IDE 콘넥터에 연결하지 않는다.) LS-120, IDE/ATAPI Iomega ZIP 드라이브에 필요. 단 구형 Zip 드라이브는 해당 안됨.


    6-8> SCSI emulation support

    IDE 콘넥터에 연결하면서 전용 IDE 드라이버가 없는 일부 IDE 장치(CDR) 등에 필요함. 이를 선택한다면 다음의 "SCSI support", "SCSI generic support"를 선택해야 한다.


    6-9> TaskFile IOCTL Debugging

    No Help


    6-10> CMD640 chipset bugfix/support

    CMD640 IDE 칩을 사용하는 보드에서는 YES. 잘 모르면 Yes 로 해도 무난.

      6-10-1. CMD640 enhanced support

      No 로 함.


    6-11> RZ1000 chipset bugfix/support

    RZ1000 IDE 칩을 사용하는 보드에서는 Yes. 잘 모르면 Yes가 무난. SCSI 만 사용하면 No.


    6-12> Generic PCI IDE chipset support

    PCI 버스에서 IDE 를 사용한다면 YES, scsi 만 사용하면 No. yes가 기본

      6-12-1. Sharing PCI IDE interrupts support

      IDE 콘트롤러가 IRQ 공유를 지원한다면 Yes. 잘 모르면 No

      6-12-2. Generic PCI bus-master DMA support

      대부분의 펜티엄은 버스 마스터 전송을 사용한다. Yes

      6-12-3. Use DMA by default when available

      6.12.2 를 선택했다면 필요하다. 단 VIA VP2 칩에서는 No. 일부 마더보드에서 Yes에서 문제 발생 가능.
      * Good-Bad DMA Model-Firmware (EXPERIMENTAL) (NEW)
      -no help
       

      6-12-4. ATA Work(s) In Progress (EXPERIMENTAL) (NEW)

      No help

      6-12-5. Boot off-board chipsets first support

      보드에 내장된 콘트롤러 외에 별도의 IDE 콘트롤러 를 사용한다면 별도의 콘트롤러가 ide0/1 이 되도록 한다. Lilo에서 pci-reverse 가 필요하고 fstab 파일에서도 수정이 필요하다. 잘 모르면 No

      6-12-6. AEC62XX chipset support
      6-12-7. ALI M15x3 chipset support
      6-12-8. AMD Viper support
      6-12-9. CMD64X chipset support
      6-12-10. Cyrix CS5530 MediaGX chipset support
      6-12-11. HPT34X chipset support
      6-12-12. HPT366 chipset support
      6-12-13. Intel PIIXn chipsets support
      6-12-14. PIIXn Tuning support (NEW)
      6-12-15. PROMISE PDC20246/PDC20262 support
      6-12-16. Special UDMA Feature (NEW)
      6-12-17. SiS5513 chipset support

      6.12.6 부터 17까지는 자신의 보드에 해당하는 경우에만 선택한다. 없으면 No


    6-13> Other IDE chipset support

    ---- Note: most of these also require special kernel boot parameters ----

    6-13-1. Generic 4 drives/port support (NEW)
    6-13-2. LI M14xx support (NEW)
    6-13-3. DTC-2278 support (NEW)
    6-13-4. Holtek HT6560B support (NEW)
    6-13-5. QDI QD6580 support (NEW)
    6-13-6. UMC-8672 support (NEW)
    6-13-7. IGNORE word93 Validation BITS

    IDE 장치 중에서 추가의 기능을 필요로 할 때 선택한다. 자신의 보드에서 해당 기능을 지원할 때만 선택한다. SCSI 만 사용하면 No

    ---------- Additional Block Devices -------------

    6-14> Loopback device support

    파일을 블록 장치로 사용할 때 필요. 잘 모르면 No


    6-15> Network block device support 

    서버에서 익스포트한 블록 장치를 사용하는 겨우에 필요하다. NFS와 Coda 는 무관하다. 잘 모르면 No


    6-16> Multiple devices driver support 

    여러 개의 하드디스크 파티션을 한 개의 블록 장치(디바이스)로 사용하기 위해 선택한다. 소프트웨어적으로 RAID 1/4/5 를 구성할 때 필요하다. 하드웨어 레이드에서는 필요 없다. 모르면 No 

      6-16-1. Linear (append) mode (NEW)
      6-16-2. RAID-0 (striping) mode (NEW)
      6-16-3. RAID-1 (mirroring) mode (NEW)
      6-16-4. RAID-4/RAID-5 mode (NEW)
      6-16-5. Boot support (linear, striped) (NEW)


    6-17> RAM disk support 

    메모리를 디스크로 사용하는데 필요하다. 모르면 No  

      6-17-1. Default RAM disk size (NEW) 

      램디스크의 디폴트 크기를 지정. 디폴트는 4096k 이다.

       6-17-2. Initial RAM disk (initrd) support (NEW)

      부트로더에서 램디스크를 사용할지를 결정한다. 설치 프로그램에서 주로 사용한다. 모르면 No


    6-18> XT hard disk support

    XT 하드 디스크는 초창기 IBM 피시에서 사용했다. No


    6-19> Mylex DAC960/DAC1100 PCI RAID Controller support

    DAC960, AcceleRAID, eXtremeRAID PCI RAID 사용에 필요하다. 모르면 No


    6-20> Parallel port IDE device support 

    패러랠 포트에 연결하는 IDE 장치 사용시 필요하다.

      6-20-1. Parallel port IDE disks (NEW)
      6-20-2. Parallel port ATAPI CD-ROMs (NEW)
      6-20-3. Parallel port ATAPI disks (NEW)
      6-20-4. Parallel port ATAPI tapes (NEW)
      6-20-5. Parallel port generic ATAPI devices (NEW)

    ----- Parallel IDE protocol modules ---------- 

    6-20-6-1. ATEN EH-100 protocol (NEW)
    6-20-6-2. MicroSolutions backpack protocol (NEW)
    6-20-6-3. DataStor Commuter protocol (NEW)
    6-20-6-4. DataStor EP-2000 protocol (NEW)
    6-20-6-5. FIT TD-2000 protocol (NEW)
    6-20-6-6. FIT TD-3000 protocol (NEW)
    6-20-6-7. Shuttle EPAT/EPEZ protocol (NEW)
    6-20-6-8. Shuttle EPIA protocol (NEW)
    6-20-6-9. Freecom IQ ASIC-2 protocol (NEW)
    6-20-6-10. FreeCom power protocol (NEW)
    6-20-6-11. KingByte KBIC-951A/971A protocols (NEW)
    6-20-6-12. KT PHd protocol (NEW)
    6-20-6-13. OnSpec 90c20 protocol (NEW)
    6-20-6-14. OnSpec 90c26 protocol (NEW)


    6-21> Compaq SMART2 support

    컴팩 일부 기종에서 필요하다.

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band