커널 컴파일에 대한 좋은 내용

Posted by 겨울에
2011. 2. 3. 20:14 scrap/ Linux
출처 : http://blog.naver.com/joldan23/140003259064

[ 허준의 커널 컴파일 보감 ]


  작성일 : 2000년  6월 25일
  갱신일 : 2000년 10월 28일

  작성자 : 류종훈 (queenrjh@chollian.net)


  # 이 번에 새로 갱신된 이 문서에서는 "커널 옵션 한글화 프로젝트(http://kernel.pe.kr)" 에 주
  인이신 정원영님의 "커널 2.4 Intro" 글 중에서 일부분 인용했음을 알려드립니다.  또한, 데비안
  에 관한 약간의 내용및 노트북 사용자들을 위한 내용과 그 밖의 내용이 추가및 수정 되었습니다.


  리눅스를 어느정도 사용한 사용자라면 커널 컴파일이라는 것을 접하고, 이에 빠지면 중독증 환자
  가 되어 버리는 것을 종종 목격하게 됩니다. 하지만, 처음 컴파일 하는 사람이나 어느 정도 맛을
  본 사람도 프로그램밍을 할 줄 알거나 시스템에 대해 어느정도 알고 있는 사람이 아니라면, 마치
  무슨 주문도 같은 명령을 내려 자신만의 우월함을 과시하듯 컴파일 시에 화면에 출력되는 메세지
  를 즐겁게 바라보고 있는 리눅스 마법사를 초보자들은 옆에서 부러움으로 넋을 잃고 보게 됩니다.

  저 또한 많은 것을 알고 있지는 않지만, 그런 심정을 느끼는 분 들에게 도움이 되고자 쓰게 되었
  습니다. 그리고, 간혹 참고할 만한 글을 읽다 보면 '이 부분은 다른 글을 참고하세요..' 라는 것
  이 굉장히 불편했던 기억을 되살려 이 문서에는 되도록 그런 말을 하지 않도록 했습니다.

  어쨌든, 이 글이 커널 컴파일에 대해 모든 것이라고 말하지는 않습니다.  하지만, 많은 분들에게
  여러 리눅스 마법사들의 주문(?)을 조금이나마 알아 듣기위한 번역서가 되길 바랍니다.

  ------------------------------------------------------------------------------------------
  * 이 글은 rpm 과 deb, 그리고 소스로 커널 컴파일 할 때의 세가지 경우 모두 설명 하겠습니다.  
    커널 컴파일에 관심이 있어 그에 관련된 글을 읽어 보셨거나, 한 번이라도 커널 컴파일을 해보
    신 경험이 있으신 분들을 위한 글입니다.  처음 커널 컴파일 할 때의 각 명령의 내용이 이해가 
    안가셨던 분들이나, 명령을 무작정 외워서 커널 컴파일 하셨던 분들은 이 글이 아주 많은 도움
    이 되실겁니다.
  ------------------------------------------------------------------------------------------


  >> 항상 그렇듯,  먼저 커널의 개요와 컴파일의 필요성에 대해 아주 간략히 설명을 하겠습니다.

  커널이란 운영체제의 가장 핵심을 이루는 부분입니다.  도스에서는 IO.SYS 와 MSDOS.SYS 이 그에
  해당하고,  윈도우즈에서는 kernel32.dll 라는 파일이 기본적인 장치들의 구동과 입/출력을 담당
  하는 부분이라는 것을 아시는 분은 다 아실겁니다.  

  일반적인 리눅스 배포판의 커널은 여러 다른 많은 종류의 하드웨어와 상당수의 설정들을 지원 해
  야 하기 때문에 커널의 크기가 커지고, 사용하지 않는 기능이 많이 추가 되었으므로 자신의 시스
  템에 최적화되지 못해 퍼포먼스가 다소 떨어집니다. 이런 경우 필요한 사항만으로 커널을 컴파일
  해서 불필요한 기능들을 모두 제거하면 커널이 상당히 작아지고 성능에도 많은 향상을 가져올 뿐
  만 아니라 기본 배포판에서는 없는 기능을 새로 추가할 수도 있습니다. 

  더구나 리눅스는 커널 소스가 공개되어 있기 때문에 최신 버젼의 소스를 가져와서 자신의 시스템
  에 최적화하여 사용할 수 있다는 것도 아주 매력적인 일 입니다.  커널을 소스로 가져올 수 있는
  공식 사이트는 ftp://ftp.kernel.org/pub/linux/kernel/ 입니다.  이 디렉토리 안에는 여러 버전
  의 디렉토리들이 있는데 각 버젼의 디렉토리 안에는 두 종류(gzip, bzip2)로 압축된 커널 소스와
  패치 파일이 있습니다.  원하는 버젼의 커널 소스를 가져 오시면 됩니다.

  하지만, 공식 사이트는 전세계의 사용자들로 인해 트래픽이 심하기 때문에 우리나라의 미러 사이
  트를 이용하는 것이 속도가 빠릅니다.  우리나라의 커널 소스 미러 사이트는 ftp://ftp.bora.net
  /pub/linux/kernel/ 과 ftp://ftp.nuri.net/pub/Linux/kernel/pub/linux/kernel/ 이 있습니다. 

  참고로, 현재 최신 버전은 안정 커널이 2.2.17pre-* 이고, 개발 커널은 2.4.0-test-pre* 입니다. 

  ------------------------------------------------------------------------------------------

  자.. 이제부터는 딱딱하지 않게 옆에서 강의하듯 진행할 것입니다.  위의 글을 읽고 잠시 경직되
  셨던 분들은 긴장을 푸시고 천천히 따라 오시면 되겠습니다. 그리고, 수업에는 항상 준비물이 필
  요하듯이 여기서도 필요한 준비물이 있습니다.  

  이 준비물은 커널 컴파일을 하시기 전에 에러 메세지를 만나지않기 위해서는 반드시 필요한 준비
  물이기 때문에 꼭 확인하시기 바랍니다. 


    [ 필요한 패키지 ]

    아래의 패키지 버젼은 2.4.0-test 커널을 사용하기 위한 버젼입니다. 커널 버젼 2.2-* 대의 패
    키지도 별 문제 없이 될것입니다. 일단 다음의 패키지들이 설치 되어있는지 부터 확인을 해 보
    시고, 컴파일 작업을 하시기 바랍니다.

    RedHat 기반 6.1이상의 배포판이라면 modutils만 업그레이드 하면 될 것입니다.(modutils를 업
    하는데 glibc버전이 낮다면 glibc도 업해야 합니다.  glibc는 로케일과 timezone, 여러 라이브
    러리를 포함해서 의존성 문제에 많은 영향을 끼치므로  업그레이드 하는데 주의를 필요로 합니
    다. rpm 버전이 낮다면 rpm도 업해야 합니다.)  

    * glibc에 관한 자세한 내용은 박원규님의 홈페이지인 http://chem.skku.ac.kr/~wkpark/ 를 방
      문 해 보시기 바랍니다. *


           =========================================================================
              패키지 명              버 전                확인 방법
           =========================================================================
            o  Gnu C                2.7.2.3            # gcc --version
            o  Gnu make             3.77               # make --version
            o  binutils             2.9.1.0.22         # ld -v
            o  util-linux           2.10o              # kbdrate -v
            o  modutils             2.3.13             # insmod -V
            o  e2fsprogs            1.18               # /sbin/tune2fs --version
            o  pcmcia-cs            3.1.19             # cardmgr -V
            o  PPP                  2.4.0              # pppd --version
            o  isdn4k-utils         3.1beta7           # isdnctrl 2>&1|grep version
           =========================================================================


       만약 커널 2.4 버젼대의 컴파일 시 modutils 버전이 앞에서 명시한 버전보다 낮은 상태에서
       모듈 컴파일을 한다면 에러가 납니다. 꼭 modutils를 업그레이드 해야 모듈 컴파일을 할 수
       있습니다.
       
       modutils를 업하면  예전의 /etc/conf.modules가  /etc/modules.conf로 바뀌고, USB 모듈도
       자동 로딩이 가능하며, 많은 예약어를 지원합니다.

       다음의 ftp 사이트에서 구할 수 있습니다.

       ftp://ftp.kernel.org/pub/linux/utils/kernel/modutils/v2.3/

  ------------------------------------------------------------------------------------------


  지금부터의 모든 작업은 root 로 로그인 해서 해야 합니다.  참고로, 다음과 같은 명령으로 여러
  분의 커널 버젼을 확인해 볼 수 있습니다.

  [root@queenrjh home]#uname -r       <-- 단순히 커널 버젼만 표시 합니다. '-a' 라는 옵션으로
                                          도 한번 해 보세요.


  rpm 으로 할 경우 커널 컴파일에 필요한 파일은 ftp://ftp.redhat.com 에서 받아오시면 됩니다.  
  일반 사용자인 경우 다 받을 필요는 없고,  다음의 두 개의 파일만 가져와서 설치하면 됩니다.

  [root@queenrjh home]#rpm -Uvh --nodeps kernel-header-(커널버젼).i386.rpm  
  [root@queenrjh home]#rpm -Uvh --nodeps kernel-source-(커널버젼).i386.rpm  

  rpm 파일은 실제로 여러가지가 있는데 왜 위와같이 꼭 두개의 파일만 받아와서 해야 하냐고 궁금
  해 하시는 분은, 아래의 글을 읽어 보시면 왜 그런지에 대한 궁금증이 어느정도 풀리실 것입니다.


  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  Q1) 커널 rpm 에는 소스, 헤더, BOOT 등등 여러가지가 있는데 이것들을 모두 받아 설치해서 커널 
      컴파일을 해야 하나요?  

  A1) ==> 헤더, 소스 rpm 만 풀고 컴파일해도 됩니다. 


  Q2) 그렇다면, 커널소스 이외의 것들(헤더,BOOT,doc 등)이 꼭 풀어야하는 것이 아니라면 왜 있는
      것인지요? 그냥 옵션사항으로 사용자 개개인마다 알아서 풀고 싶으면 풀고 아니면 하지 말라
      는 건가요? 

  A2) ==> 처음에 리눅스를 설치할 때 커널 컴파일을 할 수 있을까요? 당연히 없겠죠? 그러니 처음
          설치할 때는 이미 각각의 기능으로 컴파일 된 rpm 파일로 설치하는 수 밖에 없죠. 그 때 
          필요한 rpm 파일이 나머지 파일들이며, 특별한 이유가 없다면 나머지는 필요가 없습니다.


  Q3) 그럼, 커널 소스만 풀어서 컴파일하면, 나머지(헤더,BOOT,doc 등)도 저절로 생성이 되나요? 

  A3) ==> 커널 컴파일해서 생성될 수 있는 것은 BOOT, smp이며, 나머지는 생성되지 않습니다. 


  Q4) 그러면, 커널소스 이외의 것들(헤더,BOOT,doc 등)도 풀고 나서 컴파일을 해 주어야 하나요? 

  A4) ==> doc 는 /usr/doc 밑에 들어가는 문서 파일이며, BOOT는 부팅할 수 있는 이미지와 모듈에
          관련된 것이고, 헤더는 /usr/src/커널버전/include 디렉토리에 들어가는 헤더 파일들 입
          니다.  


  Q5) 커널 관련된 rpm 파일은 '소스, 커널 헤더, BOOT, doc, smp, pcmcia' 등이 있는데,  이 각각
      의 파일이 어디에 쓰이는지 알려주세요.

  A5) ==> kernel-source...  커널 소스 rpm 
          kernel-headers... 커널 헤더 rpm 
          kernel-doc...     커널 문서 rpm 
          kernel-BOOT...    부팅과 모듈 관련 rpm 
          kernel-smp...     멀티 프로세서일 때 필요한 rpm 
          kernel-pcmcia...  노트북 pcmcia에 필요한 rpm 
          kernel-ibcs...    Intel Binary Compatibility Specification 관련 rpm 


  위와 같은 커널 관련의 여러 rpm 파일들로 나뉘어 있는 것은 리눅스(정확히 레드햇)라는 것을 컴
  퓨터에 처음 설치할 때는, 우리가 직접 커널 소스를 받아다 컴파일 할 때 처럼 필요한 것만을 알
  아서 설치할 수 없기 때문에 각각의 기능을 컴파일해서 따로 나눠 놓은 것입니다.

  그래서, 위의 여러 rpm 파일들은  설치 시에 기본적으로 필요한 파일들만 설치되고, 나머지 파일
  들은 사용자가 필요할 때 사용되게 됩니다. 그리고, 설치 시에 리눅스에서 인식하는 하드웨어(사
  운드카드, 랜카드 등)는 모듈로 띄워져서 인식하게 되구요.  인식하지 못하는 하드웨어나 세부적
  인 부분은 수동으로 잡아야 합니다. 

  rpm 파일의 커널은 모든것이 모듈로 포함되어 있기에 커널의 크기도 크고, 그만큼 메모리도 많이 
  잡아먹게 됩니다.  그래서, 커널 컴파일이라는 작업을 통해 커널을 최소화, 최적화하고, 또한 잡
  히지 않은 하드웨어를 인식시켜야 합니다. 

  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  이제 왜 커널에 관련된 rpm 파일이 커널 소스와 비교할 때 여러개이고, 그 각각의 파일이 어디에 
  사용되고 필요한지 아셨을 겁니다.  그럼 본격적으로 설치에 들어가겠습니다.


  rpm 파일을 -Uvh 옵션으로 설치할 경우에는 기존의 설치된 kernel-header 와 kernel-source 파일
  들을 자동으로 지우고 새 버젼의 파일로 대체 하게 됩니다. 그렇기 때문에 이전 버젼의 커널소스
  가 꼭 필요하신 분은 다른 이름으로 백업하시고, 새 버젼을 설치 하시기 바랍니다.

  CPU 가 2개 이상일 경우에는 kernel-smp-(커널버젼).i386.rpm 파일을 받아와야 하고, 노트북에서
  리눅스를 실행 시키려면 전원 관리 기능을 제공하는 kernel-pcmcia-cs-(커널버젼).i386.rpm도 설
  치해야 합니다. 소스로 설치 시에는 조금 다릅니다. 자세한 것은 이 글 맨 뒤에 설명 하겠습니다.

  위와 같이 두개의 파일을 설치 하는데 뒤의 --nodeps 옵션은 header를 풀려면 source가...
  source를 풀려면 header가 있어야 한다고 설치를 거부 하기 때문에, 이 옵션을 주어 강제로 설치 
  합니다.  설치를 하면 /usr/src/linux-(커널버젼) 라는 디렉토리가 생깁니다. 

  그리고, 기존의 linux 링크를 지우고, 다시 linux 라는 이름으로 linux-(커널버젼) 를 새로 링크
  시킵니다.  참고로 rpm 으로 설치 시에는 자동으로 되는 내용입니다.

  [root@queenrjh home]#cd /usr/src
  [root@queenrjh src]#rm -rf linux  
  [root@queenrjh src]#ln -s linux-(커널버젼) linux 



  소스를 가져와서 컴파일 할 때는 이를 /usr/src 밑에 풀어줍니다. 압축을 풀면 위의 rpm 과는 반
  대로 linux 라는 디렉토리에 압축이 풀립니다.  다음과 같이 합니다.

  [root@queenrjh src]#tar xzvf linux-(커널버젼).tar.gz (압축이 bzip2일 경우는 xlvf 옵션을 줍
                                                        니다.)
  [root@queenrjh src]#mv linux linux-(커널버젼)
  [root@queenrjh src]#ln -s linux-(커널버젼) linux

  그런데, 여기서 왜 꼭 linux 라는 링크를 만들어서 쓰는지 궁금해 하시는 분이 계실 겁니다.

  반드시 꼭 이렇게 해야 하는 것은 아니지만, /usr/src 디렉토리 아래에 여러 버젼의 리눅스 커널
  소스를 두고 작업을 할 때 편하게 하기 위해 linux-(커널버젼) 이라는 이름으로 각 각 컴파일 시
  에 그냥 쓰기 보다는 간단히 linux 라는 이름으로 링크를 시켜두고 사용하면 편하기 때문입니다.

  이유는, 나중에 설명 드리겠지만 패치 작업할 때,  패치할 파일이 linux 라는 디렉토리의 안에서
  찾도록 되어 있기 때문에 그런 이유도 있습니다.  반드시 그런 이유 때문은 아니지만, 패치할 때
  나 다른 이유로 인해 그때 그때 이름을 바꾸는 것이 불편한 것만은 사실이기 때문이죠.. 

  다시 말씀 드리지만, 위와같이 이름을 링크 안 하셔도 상관없습니다.  그 대신 나중에 패치할 경
  우가 생겼을 때 '패치가 안되고 에러만 나요..'  이런말 하셔도 절대 소용 없습니다.  절대루..

  그리고, 시스템의 심볼릭 링크가 새로운 커널 트리를  제대로 가리키고 있는지 확인해야 합니다. 

  보통 rpm 파일이 아닌 소스를 풀어서 하는 경우에 해주어야 하는 것이지만 레드햇 사용자의 경우
  /usr/include 디렉토리에 아래처럼 링크를 해주지 않아도 기본적으로 잡혀 있습니다. 확인 차 한
  번 'ls -l asm linux scsi' 로 확인 해 보시고 안 되어 있다면, 아래와 같이 해 주시면 됩니다.

  [root@queenrjh src]# cd /usr/include
  [root@queenrjh include]# rm -rf asm linux scsi
  [root@queenrjh include]# ln -s /usr/src/linux/include/asm-i386 asm
  [root@queenrjh include]# ln -s /usr/src/linux/include/linux linux
  [root@queenrjh include]# ln -s /usr/src/linux/include/scsi scsi

  위에 것은 왜 링크를 해주어야 하는 거냐고 질문을 하는 분도 계시 겠군요..  /usr/include 디렉
  토리는 표준 C 라이브러리 헤더 파일이 있는 중요한 디렉토리 입니다. 각 커널 소스에는 헤더 파
  일이 딸려 오는데 컴파일 할 때  그 중에 asm linux scsi 디렉토리의 헤더 파일들을 불러 와야만
  에러 없이 컴파일이 되는 경우가 있습니다. 

  시스템의 컴파일 환경 값으로 헤더 파일은  /usr/include 에서 불러 오기 때문에 커널 소스의 것
  으로 링크를 해 주는 것입니다.


  데비안 사용자들은  다음과 같이 두가지 명령을 해줄 경우 자동으로 kernel-*.deb 화일을 만들어
  줍니다. 

  [root@queenrjh src]#make xconfig 

  [root@queenrjh src]#make-kpkg --revision=kor3 binary 

  위와같이 하면 현재 디렉토리에 아래와 같은 4개의 deb 화일이 생깁니다.  
  위의 옵션 중에 "--revision=kor3" 에서 "kor3" 는 여러분 임의대로 정하실 수 있습니다.  이 예
  는 한글화의 "kor" 과 "3" 번째의 버젼이라는 의미로 붙였다는 것을 금방 눈치 채셨을 줄 압니다.

  kernel-doc-2.4.0-test9_kor3_all.deb 
  kernel-headers-2.4.0-test9_kor3_i386.deb 
  kernel-image-2.4.0-test9_kor3_i386.deb 
  kernel-source-2.4.0-test9_kor3_all.deb 

  각각의 파일은 위에서 설명한 rpm 커널 파일의 내용과 동일 합니다.  
  단, rpm 파일에서는 없는 kernel-image-2.4.0-test9_kor3_i386.deb라는 파일은 커널 이미지 파일
  입니다.

  데비안에서의 설치는 dpkg 명령을 통해 rpm 에서와 같이 "-i" 옵션을 주어 설치합니다.

  dpkg -i kernel-image-2.4.0-test9_kor3_i386.deb 

  데비안의 대한 더 자세한 내용은  http://debianusers.org/ 와 http://www.debian-kr.org/ 의 홈
  페이지를 통해 얻을실 수 있습니다.  물론 http://kldp.org 는 기본인 것은 다들 아시죠?

  ------------------------------------------------------------------------------------------

  여러분의 시스템에 필요한 드라이버나 새로운 기능 또는 수정된 내용의 다양한 패치를 할 경우가
  있습니다.  패치를 해야 할 경우에는 /usr/src/linux/scripts 디렉토리에 여러 단계의 패치 작업
  을 자동으로 실행하는 스크립트 patch-kernel 이 있습니다.   /usr/src 아래에 가져다 놓은 커널
  패치 파일들과 커널 소스의 버전과 비교하여 patch-kernel 은 순서에 따라 알아서 패치를 적용합
  니다. 

  [root@queenrjh src]#/usr/src/linux/scripts/patch-kernel

  하지만, 리눅서라면 자동으로 되는 것도 좋지만  직접 패치도 해 보는 것이 많은 도움이 될 겁니
  다. 우선 패치 파일도 압축 파일로 되어 있습니다.  압축을 풀어서 사용해도 되고 압축된 파일을
  바로 패치 하는 법도 있습니다.  패치 파일을 /usr/src 에 복사 한 후 다음과 같이 하면 됩니다.

  아래는 압축을 풀지 않고 바로 패치 할 경우 입니다.

  [root@queenrjh src]#gzip -cd newpatch.gzip | patch -p0  <-- 압축파일이 gzip 일 경우
  [root@queenrjh src]#bzip2 -cd newpatch.bz2 | patch -p0  <-- 압축파일이 bzip2 일 경우

  **  여기서 잠깐! :  간혹 패치 파일이 확장자만 .gz 인 경우가 있습니다.  gzip 으로 압축을 풀
  려고 해도 안 되었던 분들이 계실 겁니다.  편집기로 파일안을 한번 들여다 보시면, 압축 파일이
  아닌 패치 내용이 보일 겁니다. 이럴 경우는 그냥 확장자만 '.patch' 로 바꾸어서 아래의 내용을
  참고로 패치 하세요.  이 것은 웹 서버가 브라우져의 요청에 의해 자료를 넘겨줄 때 압축을 풀어
  서 주기 때문에 그렇습니다.  그 내용은 아파치 웹서버 설정에 있는 내용으로 알고 있습니다.
  제 기억으론..

  이번에는 압축을 풀고 패치를 할 경우 입니다. 먼저 압축을 풀어야 겠지요? 압축을 푼 패치 파일
  의 확장자는 .patch 나 .diff 끝나는게 대부분 입니다.  위와 마찬가지로 패치 파일이 /usr/src 
  디렉토리에 있을 경우입니다.

  [root@queenrjh src]#patch -p0 < newpatch.patch

  여기서도 궁금증을 항상 갖고 계신분은 -p0 은 무얼까 하고 생각하시는 분이 계실 겁니다.. 쓸데 
  없는 것을 빼고, 항상 궁금증을 갖고 계시는 분은 좋은 자세 입니다.  그럼, -p0 라는 것은 무엇
  인지 알려 드리겠습니다.  

  그리고, 위 에서 패치 파일을 /usr/src/ 에 복사하라고 했는데, 위에서 /usr/src/linux 디렉토리
  를 안 만들면 후회 하네.. 어쩌네 해놓구선, 왜 이제와서 꼭 그곳에다 복사하라고 했는지도 궁금 
  하실 겁니다.  그럼, 패치에 대해서 잠깐 말씀 드리고 설명하겠습니다.

  패치라는 것은 잘 아시다시피 어떤 곳을 고치거나 수정하기 위한 것으로 바뀌어질 부분만을 포함 
  하고있으며, 텍스트 파일 형식으로 되어있습니다. 

  패치가 적용될 파일은 보통 linux 라는 디렉토리 안에있는  특정 파일을 수정하는 내용으로 되어 
  있고,  패치하는 파일 안의 내용에는 linux 라는 경로 안의 특정 파일들을 수정하도록 하기 위한 
  내용이 들어있기 때문에 그렇습니다. 

  그래서, linux 디렉토리 안으로 직접 들어가지 않고 디렉토리 밖에서 패치할 경우에는, -p0 라고 
  옵션을 주어야 제대로 패치가 되는 것입니다. 

  그렇다면 -p1 은 무얼까요?  눈치가 빠른 분은 아셨겠지만 linux 디렉토리로 직접 들어가서 패치
  할 경우에 사용 합니다.  사실 이렇게 주는 옵션은 패치를 만든 분의 설명 파일을  먼저 읽고 해
  야 합니다. 보통 'README' 파일을 보거나 직접 .patch 파일 안을 직접들여다 보는 것도 좋습니다.

  아직 무슨말인지 잘 모르시겠지요?


  자.. 그렇다면, 다른말 필요없이 patch 파일의 내용을 한번 훑어 보죠.. 

  =============================================================================
  diff -urN v2.2.15/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c
  --- v2.2.15/linux/arch/alpha/kernel/irq.c       Wed May  3 17:16:30 2000
  +++ linux/arch/alpha/kernel/irq.c       Wed Jun  7 14:26:42 2000
  @@ -896,7 +896,13 @@
   unsigned long __init init_IRQ(unsigned long memory)
   {
          wrent(entInt, 0);
  +
  -       alpha_mv.init_irq();
  +
  +        /* If we had wanted SRM console printk echoing early, undo it now. */
  +        if (alpha_using_srm && srmcons_output) {
  +                unregister_srm_console();
  +        }
  +
          return memory;
   }
   
  =============================================================================

  맨위의 diff 라는 것이 보이는데 이 것은 패치 파일을 diff 명령에다 -urN 옵션을 주어 만들었다
  는 것을 나타 냅니다.  diff 명령은 두 파일간의 차이점을 추출해 주는 정말 똑똑한 명령 입니다.

  먼저 diff 명령을 설명하기전에 위에서 -p0, -p1 등이 이해가 안가셨던 분을위해 그것 먼저 설명 
  드리고나서 diff 명령을 알아 보겠습니다.  그럼, 아래를 보시죠..

  diff -urN v2.2.15/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c
                                                  ~~~~~~
  위의 diff 명령줄에 끝 부분에 물결표시로된 부분이 바로 그 해답입니다.

  linux 디렉토리 밑으로 해서  마지막에 irq.c 파일이 바로 패치 대상인 것입니다.  irq.c 파일을
  포함하는 제일 상위 디렉토리가 linux 디렉토리이기 때문에  그 linux 디렉토리 안으로 들어가서
  패치를 하게되면 -p1 옵션을 주어야 하고, 들어가지 않고 밖에서 패치를 하면 -p0 옵션을 주게되
  는 것입니다.  아시겠죠?  그럼, 이제 아시는 걸로 알고 diff 명령에 대해 설명 드리겠습니다.

  음..  diff 명령의 사용법을 알려 드리기 전에 먼저 왜 그 것이 필요한지 설명을 좀 하겠습니다. 

  만일 'komputa' 라는 디렉토리 밑에 소스 파일이 있고, 그 디렉토리 안에 몇가지 내용을 어떤 이
  유(버그나 기능 개선등..)로 수정한 후 tar 로 묶고, 압축을 해서 배포를 한다고 가정 해보죠..

  그럼, 그 이전에 배포한 소스를 받아서 사용 중인 사람은  새로 수정된 소스의 용량이 얼마 되지
  않는다고 하면, 다시 새로 받는 것은 문제도 되지 않지만, 소스의 용량이 10 메가 이상이 된다면
  모뎀 사용자들은 눈물을 흘려야 겠지요?   

  그래서, 소스 개발자나 버그 패치를 한 분은 바뀌어진 부분만 diff 명령으로 따로 추출해서 배포
  하고,  사용자들은 위에 설명한 patch 명령으로 수정하면 되지요..  정말 합리적이지 않나요?  

  여러분은 아직까지도 전 세계적으로 모뎀 사용자가 그것도 14,400bps 으로 사용하는 분이 아직도
  많다는 것을 아시면 놀랄겁니다..  그걸 보면, 우리나라는 인터넷 선진국임에 틀림 없습니다. 초
  고속 인터넷을 쓰는 집이 하루 하루 늘어가는 것을 보면... 

  그럼, diff 명령을 한번 알아 보죠.. 위에서 예로 설명한 'komputa' 라는 디렉토리를 다시 한 번
  예로 들어 보겠습니다.  단, 중요한 것은 수정 되기 전의 파일과 수정 한 파일을 따로 갖고 있어
  야 한다는 것입니다. 그래야 아무리 똑똑한 diff 명령이라도 둘 중의 차이점을 비교해서 패치 파
  일 이란걸 만들지 않겠습니까?  아래의 예에서 'komputa' 는 디렉토리이고, 그 안에 소스들이 있
  다고 가정합니다.

  [root@queenrjh home]#cp -r komputa komputa.org  <-- 먼저, 원본 소스 디렉토리를 다른 이름으
                                                      로 복사 합니다.

  그리고, 새로 수정 되어질 디렉토리인 'komputa' 안의 소스들을 수정합니다. 수정을 다 하셨다면
  다음과 같이 diff 명령을 내립니다.

  [root@queenrjh home]#diff -urN komputa.org komputa > newpatch.patch

  여기서 한가지 주의 해야 할 것은 앞에서도 설명 드렸듯이 위의 명령을 komputa 디렉토리 밖으로 
  나와서 해야 합니다.  이 것은 위에서도 설명드린대로,  패치 시에 -p0 옵션을 주느냐.. 아니면, 
  -p1 옵션을 주느냐의 민감한 차이로 바뀌기 때문 입니다.

  이 것 또한 반드실 이럴 필요는 없습니다.  단 여러분이 만든 패치 파일을 다른 사용자들이 패치
  시에 어떻게 패치하는 것이 더 좋은 것인지 한번 생각해 보고 하실 필요는 분명히 있는 것입니다.


  위와 같이 하면 저 위의 예제로 보인 내용과 비슷한 내용의 패치 파일이 만들어 지는 것을 볼 수
  있습니다. 이제 여러분도 패치 파일을 만들고, 패치도 적용할 수 있는 초보 마법사가 된 것 입니
  다.  위의 옵션중 '-u' 는 'unified diff'으로 패치 파일의 내용을 일정 형식으로 생성하라는 것
  이고,  'r' 옵션은 '--recursive' 으로 하부 디렉토리의 수정된 소스 파일도 적용하라는 것이며, 
  마지막의 'N' 옵션은 '--new-file'로서 원본의 내용과 달라진 내용을 뽑아내어 새로운 파일을 만
  들어 내라는 것입니다.  


  이제 위에서 예를 든 패치 파일 안의 내용이 이해가 좀 가시나요?  물론, 아직 이 정도로는 양이 
  다 안 차실테니 좀 더 알려 드리겠습니다..  아래를 한번 보죠..  

  =============================================================================
  diff -urN v2.2.15/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c
  --- v2.2.15/linux/arch/alpha/kernel/irq.c       Wed May  3 17:16:30 2000
  +++ linux/arch/alpha/kernel/irq.c       Wed Jun  7 14:26:42 2000
  @@ -896,7 +896,13 @@
  =============================================================================

  첫 번째 줄은 지금껏 설명한 내용이고, 그 다음 줄에 --- 로 시작되는 줄은 수정 되기 이전의 원
  본 디렉토리 밑에 소스를 말하는 것입니다.  말할 것도 없이 다음 줄의 +++ 로 시작되는 것은 새
  로 고쳐진 소스를 말하는 것이지요..   그 줄 뒤의 것은 소스 파일의 생성 시간과 날짜 입니다.

  간혹 날짜가 1970년대로 찍혀나오는 것이 있습니다.  이런것이 있어도 놀라실 필요는 전혀없습니
  다. 기존의 파일내용을 전부 지워서 이름만 있고 크기도 0인 파일을 만들 경우거나, 완전히 새로
  운 파일이 만들어 질때가 그런 경우입니다.  확실치는 않지만 제 경우에는 그렇더군요..
  뭐.. 중요한 내용은 아니므로 넘어가죠..  (날짜가 중요하게 여겨지는 분들은 신경 쓰시고요..)

  그럼 다음의 것은 또 무얼 가리키는 것 일까요?..  마치 무슨 암호문 같기도 한데..

  '@@' 문자로 시작되는 줄은 그 다음 줄 부터 과연 무엇이 수정 되는지를 알려주는 것입니다. 
  '@@' 문자 뒤의 숫자에서 '-'표시로 시작되는 숫자는 원본 소스의 896 째 라인부터 그 아래 7 째
  줄까지 내용이 빠진다는 것을 의미하고,  '+' 로 시작하는 것은 수정되는 소스 파일의 896 째 줄
  부터 13 줄의 내용이 첨가 된다는 것을 나타 냅니다.  아래를 다시 잘 보면 이제 어느 정도 이해
  가 될 것입니다. 

  그리고, '@@' 문자로 시작하는 그 다음 줄 부터의 내용에서  앞의 '-' 표시와 '+' 표시의 갯수가
  각 각 몇 개 인지를 세어 보세요.  그리고, 앞에 아무 표시도 없는 줄과 '-' 표시, 빈 공백 라인
  을 포함해서 총 7 줄인 것을 알수 있습니다. 그 숫자가 -896,7 와 맞아 떨어 지는 것을 알 수 있
  습니다. 또한, 앞에 아무 표시도 없는 줄과 '+' 표시, 빈 공백 줄을 포함 하면, +896,13 도 역시
  그 수를 의미 하는 것을 알 수 있습니다. 

  =============================================================================
  @@ -896,7 +896,13 @@
   unsigned long __init init_IRQ(unsigned long memory)
   {
          wrent(entInt, 0);
  +
  -       alpha_mv.init_irq();
  +
  +        /* If we had wanted SRM console printk echoing early, undo it now. */
  +        if (alpha_using_srm && srmcons_output) {
  +                unregister_srm_console();
  +        }
  +
          return memory;
   }
   
  =============================================================================

  더 간단히 보는 방법도 있습니다. 정확히 맞아 떨어지는 것은 아니지만, 빨리 대강 훑어보는데는
  도움이 됩니다.  '@@'로 시작하는 줄의 '-' 표시 다음 두개의 숫자중 뒤의 숫자에서 6을 뺀 값이
  결국 빠지는 값이 됩니다.  이유는 '@@'로 시작하는 줄 아래를 잘 보시면, '-' 나 '+' 문자가 나
  오기 전까지 공백을 포함한 줄이 항상 3줄이고,  다시 '@@'로 시작하는 줄이 나오기 전까지의 줄
  도 공백을 포함해서 3줄로 끝나게 됩니다. 무슨 얘기를 하는지 모르시는 분을 위해 예를 들어 설
  명 하겠습니다.

  위의 '@@ -896,7 +896,13 @@' 줄에서 896번째의 줄에서 7줄 만큼의 내용을 뺀다는 내용은 아실겁
  니다.  7이라는 숫자에서 6을 빼면 '1'...  다시 설명하면, 896번째의 줄에서 결국 1줄만이 빠지
  는 겁니다.  위를 다시 보십시요..  그렇죠?   '-' 라는 표시가 한번 밖에 없지요?  이제 아시겠
  습니까?  

  그럼, 이번에는 뒤의 숫자를 볼까요?  '+896,13 @@' 의 내용도 다를바 없습니다.  두번째 숫자인
  13에서 6을 빼면 7이 됩니다.  다시한번 위의 내용에서 '+' 표시를 세어 보세요..  7개 맞지요?

  하지만, 이렇게 보는 것이 절대적은 아닙니다.  단, 빨리보기 위해 이렇게 보시면 편하다는 것을
  알려 드린것 뿐입니다.  이유는 패치할 파일의 내용이 처음부터 빠진다거나 추가되는 내용이라면 
  그렇지 않으리라는 것은 짐작이 가실 겁니다.  이해가 안되시는 분을 위해 예를 또 한번 들지요.

  =============================================================================
  @@ -896,3 +896,6 @@
  + unsigned long __init init_IRQ(unsigned long memory)
  + {
  +       wrent(entInt, 0);

          alpha_mv.init_irq();

  =============================================================================

  =============================================================================
  @@ -896,6 +896,3 @@
          if (alpha_using_srm && srmcons_output) {
                  unregister_srm_console();
          }
  -
  -       return memory;
  - }
  =============================================================================

  첫번째의 예에서 제가 말씀드린대로 한다면, 3에서 6을 뺄 수가 없지요?  첫번째 예는 패치할 파
  일의 맨 처음부터 추가되는 예이고, 두번째 예는 반대로 패치할 파일의 맨 마지막의 내용이 빠지
  는 내용을 예로 든것입니다.  이제는 이해가 가십니까?

  아.. 여기서 한가지 중요한 사항이 있는데, 일부 패치하시는 분들이 패치 파일 안의 내용을 직접
  수정할 때 눈으로 봐서는 아무 이상이 없는데도 패치가 안되는 경우가 있을 것입니다.

  이런 경우는 극히 드문 경우지만 원인은 사용자가 직접 수정하였을 때 생기는데,  여러분이 수정
  하신 부분의 앞 줄이 "+", "-", "@@" 표시와 diff 명령으로 시작하는 부분은 빼고, 전부 한 칸의
  공백을 띄어 주어야 합니다.  원본에서 빼거나 추가 할 부분 앞에  "-" 표시나  "+" 표시가 들어
  가기 때문에 각 줄의 앞에는  "+", "-", "@@" 표시와 diff 명령 외에는 다른 문자나 기호가 오면
  패치시 항상 에러가 나게 됩니다.  

  그러므로, 괜히 패치 파일의 내용을 함부로 건드리시면 안됩니다.  그렇지 않으면 패치시 고달프
  게 될겁니다.  시험삼아 한번 해 보세요..  *^^*  

  마법사가 되기위한 길은 거져 먹을 만큼 쉬운 것이 아닙니다. 이 옵션을 직접 그 흔한 'hello' C
  소스 파일을 원본 파일과 수정 파일을 하나씩 만들어서 직접 테스트 해 보세요.  옵션을 주고 안
  준 차이가 과연 무엇인지를..  좋은 경험이 될 것입니다.  지금 바로 해 보세요.. ^^;

  옵션 얘기가 나와서 말인데..  참고로, 위의 예를 다시 들어 간혹 -urN 과 -u -r -N 이렇게 따로
  내릴 경우를 보게 되는데,  리눅스에서는 특별하게 달리 만들어진 프로그램이 아닌 경우를  빼고
  는 같은 것입니다.  또한, 옵션 중에  앞에 '-' 표시를 두개 붙인 '--force' 와 같은 옵션은 GNU
  의 산물로써 GNU 에서 제작된 프로그램들은 알파벳 1개로 된 옵션 이외에 사람이 이해 하기 쉬운
  단어 형식으로 된 옵션을 지원하므로,  단어 형식의 옵션 앞에는 '-' 표시가 하나 더 붙습니다.
  예를 들어, 도움말을 보기 위한 옵션으로 '-h' 와 '--help' 둘 다 지원하는 것이 그 예 입니다.


  그럼, 왜 이렇게 커널과 별 상관 없는 듯한 얘기를 하는지는 제 맘을 헤아릴 수 있는 분이나, 한
  번 이라도 패치를 해 보려고 했다가 패치는 안되고 밑에 얘기할 .rej (rejected - '거부된' 라는
  뜻임) 파일만 잔뜩 쌓일 때의 실망감을 아는 분은 위의 패치 내용을 아는 것이 얼마나 도움이 될
  것 인지는 두 말하면 잔소리라는 것을 잘 아실 겁니다.

  자.. (한숨 한번 쉬고.. 힘드네요..) 커널 소스도 마찬 가지 입니다.  만일 linux-2.2.14 소스를
  사용하시다가  linux-2.2.17pre-* 의 최신 버젼을 사용하고 싶을 때, 인터넷 속도가 빠르신 분은
  거의 20 메가에 가까운 소스를 한번에 다 받으셔도 되지만, 그렇지 않은 분들은 여전히 눈물만..

  그래서, 패치 파일을 받아 와야 하는데  여기서 중요한 사실은 linux-2.2.14 과 linux-2.2.17pre
  사이의 중간 버젼의 패치를 모두 받아와야 한다는 것입니다. 즉, linux-2.2.15, linux-2.2.16 버
  젼의 패치가 필요 하다는 것이지요..   하지만, linux-2.2.14 에서 linux-2.4.0-test* 버젼을 사
  용하기 위해 그 중간 단계의 패치 버젼을 다 가져와서 사용 하려는 분이 있다면..  없겠죠? ^^;

  어쨋든, 우여곡절을 다 겪어서 패치가 성공했다면 패치 대상이 된 파일의 원본은 이름끝에 .orig
  라는 이름이 붙어 백업 됩니다.  패치 과정에서 문제가 생겨 실패 했다면 실패한 파일 이름 뒤에
  위에서 잠시 설명한 그 문제의  '.rej' 파일이 만들어 집니다.  .rej 파일을 잘 살펴 보시고, 다
  시 패치 작업을 수행 합니다. 

  소스가 복잡한 경우에는 .rej 라는 파일이 각 디렉토리 마다 생길 수 있는데, 그 것을 일일히 찾
  는 다는 것은 시간 낭비이므로,  아래와 같이 find 명령으로 찾아 보시면 됩니다.

  [root@queenrjh src]#cd linux
  [root@queenrjh linux]#find . -name "*.rej"

  위와 같이 해서 '*.rej' 파일을 찾을 수 없다면 패치가 성공한 것이므로,  다음과 같은 명령으로
  원본 파일인 '*.orig' 파일을 삭제합니다. 

  [root@queenrjh home]#find /usr/src/linux/ -name "*.orig" -exec rm -f {} \; 

  역시 또다른 암호문과 같은 명령이 시작 되는군요.. 리눅스나 유닉스는 이런 명령어와 옵션의 천
  국입니다.  열심히 공부해서 그 암호문들을 다 박살내 봅시다.  마법사들을 부러워만 하지말고..

  위의 find 명령중 파일명을 인용 부호인 (") 으로 묶은 것은 별표 '*' 를 우리가 흔히 알고 있듯
  이 파일명 전체를 의미 하는 메타 문자 이므로, '.rej' 나 '.orig' 라는 확장자를 포함한 파일을 
  쉘이 해석하기 위해서 이고, -exec 옵션에서부터 라인의 끝을 나타내는 세미 콜론 ';' 까지 중간
  에 있는 명령을 수행 하라는 것인데,  중간에 '{}' 라는 부분은 찾은 파일의 이름으로 대체 되기 
  위해 쓰는 것이고, 세미콜론 앞의 백 슬래시인 '\' 표시는 뒤의 명령의 끝을 알리는 세미 콜론을 
  쉘이 먼저 해석하지 않기 위해 쓰이는 것입니다.  

  위와같은 내용을 아시고  다음부터 find 명령을 쓰신다면,  확실히 예전에 모르고 이상한 문자를 
  단순히 외워서 할 때와는 달리 기억이 잘 나실 겁니다.  그렇죠?  단순히 외우는 건 오래가지 못
  합니다..  원리를 알자~~!!

  그럼 (") 인 겹 따옴표로 묶은 것은 왜 일까요?  우리가 일반적으로 쓰는 홑 따옴표도 있는데..
  우선, 홑 따옴표든.. 겹 따옴표든 이것을 '인용부호' (quote) 라고 부릅니다.  분명히 서로 다른
  기능이 있기에 구분해서 쓸 것이라는 것은 벌써 짐작 하셨을 겁니다. 그럼, 먼저 인용 부호의 필
  요성에 대해 살펴 봅시다..

  [root@queenrjh home]#echo I love    you      <-- love 다음에 공백을 2칸 이상 띄웠다면..

  위와 같이 명령을 내리면 love 와 you 사이의 공백은 1칸 이상은 무시 됩니다. 그래서 출력은 다
  음과 같이 'I love you' 라고 출력되게 됩니다.  여기서 '아 하~ ' 하고 눈치를 채셨을 겁니다.
  맞습니다. 공백을 포함한 문자열을 묶어서 사용할 때는 인용 부호를 쓰게 됩니다.  그렇다면, 이
  제 각 인용 부호의 차이점을 알아 보겠습니다.

  [root@queenrjh home]#echo "I love    you"

  [root@queenrjh home]#echo 'I love    you'

  위의 두 차이점은 무엇일까요? 사실 위와 같이 단순 문자열을 묶어서 사용할 때의 차이점은 없습
  니다.  그러나, 다음의 예를 보죠..

  [root@queenrjh home]#echo "I love    you $SHELL"

  [root@queenrjh home]#echo 'I love    you $SHELL'

  자.. 이제는 서로의 차이가 확연히 드러나는 순간입니다.  지금 리눅스 박스 앞에 앉아 계시다면
  위의 예를 한 번 해 보세요..  이제 좀 아시겠지요?  겹 따옴표 (") 는 메타 문자를 해석 하면서
  본인의 임무인 문자 열을 묶어서 나타 냅니다.  그러나, 홑 따옴표 (') 는 메타 문자를 무시하고
  단순한 문자 열 로만 취급하게 됩니다. 이 차이는 아주 중요합니다. 별 생각없이 인용 부호를 사
  용 하셨다면, 지금 부터 확실히 인지 하시고 쓰시기 바랍니다.

  '$' 표시는 변수의 기능으로 쓰기 위해 변수로 쓰일 문자 앞에 붙여 줌으로써, 그 문자가 변수라
  는 것을 쉘에게 알려주는 메타 문자 입니다.  변수로 쓰이는 문자는 일반적으로 위에서 'SHELL'
  처럼 대문자를 사용 합니다.  물론 소문자를 사용하기도 합니다만, 대문자를 사용하는 이유는 단
  지 관례라고 생각 하시면 됩니다.  눈에도 확연히 잘 띄구요..  

  하지만, 이것도 반드시라고는 할 수 없습니다. 어떤 분들은 환경변수와 구분하기 위해서 꼭 소문
  자로 써야 된다고 하시는 분이 있으므로..   결론은 여러분 맘...

  참고로, 위 에서 잠깐 설명했던 '\' 나 '*' 또는, '$' 와 같은 문자를 '메타 문자' 라고 부르며,
  각각 특수한 용도로 사용을 하게 됩니다.  위 의 세가지 말고도 많은 메타 문자가 있으며, 이 메
  타 문자를 명령어가 해석하지 않고, 쉘이 먼저 해석하여 명령에게 그 값을 돌려주게 됩니다.  

  명령어가 해석하고 싶어도 할 수 없습니다.  왜냐하면, 메타 문자는 쉘 만이 해석 할 수 있는 특
  권을 갖고 있으니까요.  꼭 기억 하세요.  메타 문자를 함부로 처리하면 쉘 한테 혼납니다.. ^^;

  특히, 백 슬래시인 '\' 는 메타 문자를 해석 시키지 않는 역할을 합니다.  자기도 메타 문자이면
  서 메타 문자를 제어하는 왕초 라고나 할까요?  단, 백 슬래시 다음에 오는 메타 문자 한개만 그
  기능을 없앱니다.  일정 범위 안의 메타 문자의 효력을 없애기 위해서는, 위에서 설명한 홑 따옴
  표 (') 만이 그 일을 할 수 있지요.  그럼, 다음의 예를 조금 들어 보겠습니다..

  [root@queenrjh home]#echo SHELL     <-- echo 명령을 예와 같이 내리면 그냥 'SHELL' 이라고만 
                                          출력 됩니다.

  [root@queenrjh home]#echo $SHELL    <-- 이번에는 사용하고 있는 쉘의 경로와 이름이 출력되는 
                                          것을 볼 수 있습니다.

  [root@queenrjh home]#echo \$SHELL   <-- 여기서는 '$SHELL' 라는 출력을 보여줍니다. '$'의 기
                                          능을 '\' 표시가 자신의 능력으로 막았군요.


  명령 뒤에 메타 문자가 나오면 먼저 쉘이 해석하고, 그 값을 명령에게 돌려 주기 때문에 echo 명
  령은 '$SHELL' 이라는 메타 문자 다음의 것은 구경도 못하게 되고,  '/bin/bash' 라는 값만 출력
  하게 됩니다.  


  그럼, 아래와 같은 경우는 어떻게 될까요?  궁금 하시죠?  한번 해 보시면 피가되고, 살이.. ^^; 

  [root@queenrjh home]#echo $SHELL $PATH $HOME $USER

  [root@queenrjh home]#echo \$SHELL \$PATH \$HOME \$USER

  [root@queenrjh home]#echo '$SHELL $PATH $HOME $USER'


  그리고, 변수는 '환경 변수' 와 '지역 변수(사용자 정의 변수)' 로 나뉘어 집니다.  자신이 정의
  한 변수를 쉘에서 계속 사용하려고 하신다면,  아래와 같이 쉘에서 정의를 하시고 사용하시면 됩
  니다.

  [root@queenrjh home]#export STAR=Blizzard      <-- export 명령으로 지역 변수를 환경 변수화 
                                                     시킵니다.
  [root@queenrjh home]#echo $STAR
  Blizzard


  참고로 하나 더, 간혹 홑 따옴표는 홑 따옴표인데 키보드의 숫자 "1" 왼쪽의 (`) 표시를 보신 적
  이 있으실 겁니다.  이것은 주로 쉘 스크립트 안에서 쓰이는데, 쓰이는 용도는 변수의 값에 리눅
  스 명령의 내용이 들어갈 때 쓰입니다.  다시 예를 들어 볼까요?

  command=`echo $opt`

  위의 예는 echo 명령을 통해 opt 변수의 내용을 출력한 값을 command 변수 안에 넣으라는 것입니
  다.  이 때 (`) 표시인 홑 따옴표 대신 스트링 문자를 둘러싸는 겹 따옴표를 쓰게 되면, command 
  의 변수 안에는 단순히 "echo" 라는 문자열과 opt의 변수 내용이 같이 스트링 값으로 들어갑니다.


  음.. 얘기가 완전히 다른 길로 빠져 버렸군요.  그래도, 모르는 것 보다는, 아는 것이 힘이니까..  
  내친 김에 아는 분도 계시겠지만, 모르는 분들을 위해서 아래의 팁까지...

  ------------------------------------------------------------------------------------------

  [팁!]

  다음으로 진행 하기에 앞서 커널 컴파일을 할 때 이에 대한 프로세서를 가장 우선순위에 두고 싶
  다면 make 명령 앞에 nice -20 또는 nice --20 을 적어 줍니다.

  예를 들어 아래와 같이 할 수 있습니다.

  nice -20 make mrproper menuconfig dep clean bzImage
  nice -20 make modules modules_install

  nice명령어는 어떤 프로그램을 컴파일을 하던지 ./configure 나 make명령 앞에 붙여 주면 됩니다.


  그리고,  2개 이상의 cpu 를 가지고 있을 경우 컴파일을 각 cpu 에 동시에 할당 해 주면, 컴파일 
  을 병렬로 처리 하기 때문에 속도가 빨라 집니다.  그렇게 하기 위해서는 '-j (숫자)' 옵션을 사
  용 합니다.  -j 옵션 다음의 숫자를 지정할 공식은 다음과 같습니다.

          -j (숫자) =  ( 램 용량 / 8 ) + 1

  예로, 램이 128 메가인 경우에는 -j 17 이 됩니다. SMP 시스템에서 더 많은 이득을 볼 수 있지만,
  단일 프로세서 시스템에서도 -j 는 적절한 성능을 보여 줍니다.

  실제 사용 예는 아래와 같습니다.

  make -j5 mrproper menuconfig ....
  make -j5 modules modules_install ....

  ------------------------------------------------------------------------------------------

  자.. 이제부터 본격적인 커널 컴파일에 들어 갑니다...

  [root@queenrjh include]#cd /usr/src/linux  
  [root@queenrjh linux]#make mrproper 

  make mrproper 명령을 내리는 이유는 이전 커널을 컴파일할 때 만들어진 오브젝트 파일과의 의존
  성 설정내용, 컴파일 환경 설정값, 버전 정보 등 새로 시작하는 컴파일에 영향을 주는 이전 정보
  를 소스 커널의 원래 설정으로 초기화 해 주는 명령이므로 새로 커널 소스를 설치했을 경우는 이 
  명령이 필요 없습니다. 

  그러나, 새로 받아온 소스로 컴파일 하는 것이 아니라, 기존의 커널 소스를 계속 사용 할 것이고, 
  그 소스로 컴파일을 한 번 이라도 하였으며, 그 소스의 설정 값들을 잃고 싶지 않은 분이라면 이
  명령을 내리지 마십시요.


  지금부터는 본격적인 커널 설정에 들어가는 내용입니다. 콘솔에서 실행 하시던지, 아니면 X 터미
  널에서 다음 명령을 내리시던지 간에 반드시 /usr/src/linux 디렉토리로 이동하시고 명령을 내리
  십시요.

  [root@queenrjh linux]#make xconfig 

  커널 설정에는 xconfig, menuconfig, config 가 있는데 X-윈도우가 된다면 xconfig로 설정하는게 
  편합니다.  make xconfig를 수행하기 위해서는 X-윈도우와 TcL/Tk 인터프리터/툴킷 라이브러리가 
  반드시 필요합니다.  그리고, 설정이 끝나면 반드시 주 화면의 'Store Configurationto FiLe' 항
  목에서 설정 내용을 파일로 저장합니다. 참고로, 커널 옵션 설정후 설정내용은 /usr/src/linux에
  '.config' 라는 이름으로 저장됩니다. 

  make menuconfig 는 ncurses(new-curses)라는 라이브러리가 설치되어 있어야 합니다. ncurses 는 
  화면 입/출력에 쓰이는 라이브러리 입니다. ncurses 가 설치되지 않았다면 실행되지 않는 풀그림
  들이 많으므로 반드시 설치합니다. 위와 마찬가지로 설정을 마쳤다면 반드시 저장하고 나옵니다.

  config 는 텍스트로 된 방식으로 요즘 거의 쓰이지 않고 있습니다. 심심 하다면 한번 해보시길..

  어떤 식으로 할지를 선택 하셨다면 원하시는 명령으로 커널 설정을 하시면 됩니다.  중요한 것은
  자신의 시스템에서 사용하고 있는 하드웨어를 잘 알고 있어야 한다는 겁니다.  세상에 거져 되는
  것은 없나 봅니다.. ^^;


  음..  그리고, 지금부터는 커널 설정 내용중 가장 기본이 되는 부분만을 간단히 소개해 드리겠습
  니다. 초기의 문서에는 아예 넣지 않았는데, http://kldp.org 의 권순선님께서 이 내용까지 넣으
  면 완벽(?)하다는 유혹에...  아래의 내용은 http://kernel.pe.kr 의 정원영님 글에서 그대로 인
  용했습니다. 


  [ 기본적인 커널 옵션 설정 ]


  일반적인 데스크탑 PC사양(1 CPU, No SCSI)에서 필요로 하는 커널 옵션들을 설명하며, 그다지 필
  요성이 없는 옵션들은 제외시켰다. 


  Code maturity level options ---> 

  [*] Prompt for development and/or incomplete code/drivers - 개발 수준의 옵션들도 선택 가능
      하게 해준다. 


  Loadable module support ---> 

  [*] Enable loadable module support - 모듈을 사용할수 있게 해줌. 
  [*] Kernel module loader - 커널이 알아서 모듈을 올려준다. 


  Processor type and features ---> 

  (Pentium-Pro/Celeron/Pentium-II) Processor family 
  (X) Pentium-Pro/Celeron/Pentium-II - 테스트 PC가 Pentium II이므로 ... 시스템에 맞는걸 선택
      한다. 
  [*] MTRR (Memory Type Range Register) support - 프로세서가 메모리 영역 접근을 제어할 수 있
      음. 그래픽의 쓰기 속도 향상.


  General setup ---> 

  [*] Networking support - 네트워킹 지원. 
  [*] PCI support - PCI 지원.

  (Any) PCI access mode - 커널이 직접 액세스 시도.
  [*] System V IPC - System V IPC를 지원하게 함, Shared Memory도 여기서 지원한다. 
  [*] BSD Process Accounting - 프로세스 정보를 파일에 저장.
  [*] Sysctl support - 특정 커널의 파라미터와 변수들을 동적으로 변경시킬수 있도록 함.

  (ELF) Kernel core (/proc/kcore) format - ELF core 포맷.
  <*> Kernel support for a.out binaries - a.out 바이너리 지원.
  <*> Kernel support for ELF binaries - ELF 바이너리 지원.


  Plug and Play configuration ---> 

  <*> Plug and Play support - Plug and Play 지원.


  Block devices ---> 

  <*> Normal PC floppy disk support - 플로피 드라이버 장치 지원.
  <M> Loopback device support - 한 파일을 하나의 파일 시스템처럼 인식 시킴.


  Networking options ---> 

  <*> Packet socket - 네트웍 디바이스와의 직접통신을 하게 해준다. 
  <*> Packet socket: mmapped IO - 더 빠른 통신을 할 수있게 한다. 
  <*> Unix domain sockets 
  [*] TCP/IP networking - TCP/IP 네트워킹 지원.
  [*] IP: TCP syncookie support (disabled per default) - 서비스 거부 공격을 받을때 대처해 줌. 


  ATA/IDE/MFM/RLL support ---> 

  <*> ATA/IDE/MFM/RLL support 


  IDE, ATA and ATAPI Block devices ---> 

  <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support - IDE를 사용할수 있도록 해준다. 
  <*> Include IDE/ATA-2 DISK support - 하드디스크 사용가능하게 함.
  <*> Include IDE/ATAPI CDROM support - CD-ROM 사용가능하게 함.
  <M> Include IDE/ATAPI FLOPPY support - ZIP 드라이브등을 사용가능하게 함.

  --- IDE chipset support/bugfixes 
  <*> Generic PCI IDE chipset support - PCI 방식의 IDE 지원.
  <*> Sharing PCI IDE interrupts support - IRQ 공유 지원.
  <*> Generic PCI bus-master DMA support - DMA 지원.
  <*> Use PCI DMA by default when available - VIA VP2 칩셋을 사용한다면 절대 선택하지 말것.
  <*> HPT366 chipset support - Ultra DMA 66 지원.


  Network device support ---> 

  [*] Network device support 


  Ethernet (10 or 100Mbit) ---> 
  [*] Ethernet (10 or 100Mbit) - 자신의 시스템에 맞는걸 선택 (RealTek 8139등을 쓴다면, 
      [*]EISA, VLB, PCI and on board controllers를 선택하면 하부 목록이 나온다.) 


  Character devices ---> 

  [*] Virtual terminal - 가상 터미널 지원.
  [*] Support for console on virtual terminal - 가상터미널을 시스템 콘솔로 쓸수있게 해준다. 
  [*] Unix98 PTY support - Unix98 가상터미널 지원.
  [*] (256) Maximum number of Unix98 PTYs in use (0-2048) Unix98 PTY 개수의 최대값.


  Mice ---> 
  <*> Mouse Support (not serial and bus mice) 
  [*] PS/2 mouse (aka "auxiliary device") support - PS/2 마우스 지원.
  <M> /dev/agpgart (AGP Support) - AGP 지원. (하부메뉴중 자신의 보드에 맞는거 선택)


  File systems ---> 

  <*> Kernel automounter support - 원격 파일 시스템을 자동으로 마운트 해준다.(NFS등을 사용할
      때) N을선택해도 상관없다. 
  <M> DOS FAT fs support - FAT 기반의 파일 시스템 지원.
  <M> MSDOS fs support - MSDOS 파티션 마운트 지원.
  <M> VFAT (Windows-95) fs support - 윈도즈 파티션 지원.
  <M> ISO 9660 CDROM file system support - CD-ROM 파일 시스템 지원.
  [*] Microsoft Joliet CDROM extensions - Joliet CDROM을 읽을 수 있게 한다. 
  [*] /proc file system support - 프로세스를 위한 가상 파일 시스템.
  [*] /dev/pts file system for Unix98 PTYs - 위에서 [*] Unix98 PTY support를 선택했다면 선택
      해야 한다. 
  <*> Second extended fs support - 현재 리눅스 파일 시스템.


  Network File Systems ---> 
  <M> NFS file system support - 네트웍 파일 시스템 지원.
  <M> SMB file system support (to mount Windows shares etc.) - 윈도즈의 네트웍 기능들을 공유
      할 수 있게 해준다. 


  Native Language Support ---> 
  Default NLS Option: "cp949" - 디폴트로 한글이 선택되도록 한다. 
  <*> Codepage 437 (United States, Canada) 
  <*> Codepage 949 (UnifiedHangul) - 윈도 파티션을 마운트 했을 때 한글을 볼 수 있도록 해준다. 
  <*> NLS ISO 8859-1 (Latin 1; Western European Languages) 


  Console drivers ---> 

  [*] VGA text console - VGA 표준 디스플레이를 통해 텍스트 모드에서 사용 가능하게 한다. 


  Sound ---> 시스템에 맞는걸 선택한다.


  Kernel hacking ---> 

  [*] Magic SysRq key - 시스템이 다운되더라도 제어할 수 있도록 해준다. 


  위의 옵션에서 설명했듯이, 윈도우의 파티션을 마운트 했을 때  한글 이름으로 된 파일이나 디렉
  토리가  "?????" 이런식으로 보이는 문제를 해결하기 위해서는 커널에 한글 패치를 해야 하는데,
  커널  2.2.16 부터는  한글을  보기 위한  패치를  하지  않아도  되게끔  커널 소스 디렉토리인 
  linux/fs/nls 에 nls_cp949.c 라는 파일로 한글을 지원합니다.  

  이 것을 모르시는 분은 아직도 게시판에 " '???' 와 같이 한글이 보이지 않는데 어떻게 하나요?"
  라는 글이 거의 하루 걸러 올라오는 걸 볼 수있죠..  다시 말씀드리지만, 한글 사용을 위한 커널
  옵션 설정은 내용 중 Filesystems 에서 아래의 두 가지 항목을 선택 하세요.

  <*> DOS FAT fs support 
  <*> VFAT(Windows-95) fs support 

  그리고, 밑으로 조금 내려가다 보시면, Native Language Support 라는 설정 내용이 있습니다. 그
  안의 내용 중 Default NLS Option: "cp949" 로 바꿔 주시고, 아래의 항목을 선택 하시면 됩니다.

  <*> Codepage 949 (UnifiedHangul) 


  커널 설정 내용은 아주 많지만, 위의 내용 정도로 간단히 소개하고 끝내겠습니다.  그 대신 커널 
  옵션 한글화 프로젝트 팀(http://kernel.pe.kr)의 홈페이지에 있는 것을 참고 하세요. 자세한 건
  http://kernel.pe.kr/data/doc/kernel_option.html에서 커널 설정에 관련된 좋은 자료를 얻을 수
  있습니다. 그 이외의 다양한 글과 자료는 여러분도 다 아시는 http://kldp.org 를 이용하십시요.
  의외로 많은 분들이 다른 곳에서 헤메고 계시더군요..  

  그리고, 참고로 말씀 드리자면 자신의 시스템에 가장 필요한 것 외에는 선택하지 마시고, 필요한
  디바이스는 모듈로 하는 것이 가장 좋은 방법입니다.

  ------------------------------------------------------------------------------------------

  위에서 커널 컴파일 설정을 다 하셨으면 꼭 저장을 하고 나온 후, 아래와 같은 명령을 내립니다.

  [root@queenrjh linux]#make dep; make clean
  [root@queenrjh linux]#make bzImage

  make dep는 설정을 다 한 후에 커널 이미지를 생성하기에 앞서 필요한 라이브러리나 헤더 파일등
  이 시스템에 제대로 있는지의 의존성을 확인하기 위한 것이고,  make clean 은 기존의 소스로 컴
  파일을 한 번 이라도 한 경우에 생겼을 오브젝트 파일이나 임시 파일, 커널 이미지등의 잔여물을
  없애기 위한 것으로 소스 파일이나 rpm 파일을 새로 가져와서 처음 할 경우에는 안 해도 별 상관
  없지만, 습관처럼 그냥 외워서 하시는 것도 나쁘지 않습니다. 그래야 나중에 괴로움을 겪지 않습
  니다. 앞으로 모 화장품 CF 에서 처럼 '딥 클린'이라고 외워 보세요. 잊어먹지 않을 겁니다. ^^;

  위와 같이 하면 커널 이미지를 만듭니다. zImage 도 있지만 커널 이미지가 클경우 마지막에 에러
  가 나므로 아예 처음부터 bzImage 명령으로 작업하는 것이 나을 겁니다.  

  make bzImage 명령시 출력되는 장황한 메세지를 안 보이게 하려면 -s 옵션을 주어서 다음과 같이
  하면 됩니다.  나중에 경과 메세지나 잘못 되었을 경우의 에러 메세지만 보여줄 것입니다. 

          make -s zImage  또는    make -s bzImage

  간혹 어떤 분은 zImage 와 bzImage 명령에서 Image 스펠링에서 앞의 I(대문자 i) 를 소문자로 명
  령을 내리시고는, 명령이 듣지 않는다고 하시는 분이 계십니다..  [반드시!!] 대문자로 하세요..


  make bzImage 명령 대신 make bzlilo 명령이 있는데 이것은 기존의 커널 이미지와 System.map 를
  백업하고, 새로운 커널 이미지인 vmlinuz-(커널버젼) 이미지를 만든 다음, 다시 vmlinuz 로 심볼
  릭 링크하고, System.map 도 마찬가지로 System.map-(커널버젼) 을 System.map 로 심볼릭 링크하
  며, lilo 까지 알아서 하게 됩니다. 

  단, 커널 이미지가 설치되는 디렉토리가 '/boot' 디렉토리가 아닌 '/' 루트에 설치 됩니다.  rpm
  사용자는 기본으로 설정되어 있기 때문에 해당 사항 없습니다.

  만일 /boot 디렉토리에 자동으로 설치되게 하려면, /usr/src/linux/Makefile 파일에서 다음과 같
  이 맨 앞의 주석처리인 '#' 부분을 제거하면 됩니다.

  #
  # INSTALL_PATH specifies where to place the updated kernel and system map
  # images.  Uncomment if you want to place them anywhere other than root.
  #

  #export INSTALL_PATH=/boot      <-- 맨 앞의 '#' 부분을 제거한다.


  즉,  make bzlilo 는 make bzImage;make install;lilo 를 동시에 하는 명령이므로 편할지는 모르
  지만 제대로 잘 안되는 경우도 있고, 자기의 입맛에 맞게끔 하기 위해서는 아무래도 수동으로 작
  업하는 것이 제일 확실합니다.  

  make zlilo 도 있는데, 이것은 미루어 짐작할 수 있는 것과 같이 make zImage;make install;lilo
  를 한 번에 해주는 명령입니다.

  하지만,  make bzlilo 와 zlilo 명령의 단점은  자신이 원하는 식으로 여러개의 커널을 선택해서
  부팅할 수 있게 하기 위해서는 먼저 /etc/lilo.conf 를 수정했을 경우에 사용해야 효과가 있으며, 
  또한 x86 의 인텔 계열에서 사용 가능 합니다. 왜냐하면 x86 에서 lilo 를 사용하기 때문입니다. 

  make install 명령을 따로 내릴 경우도 마찬가지로 x86 계열에서만 사용 가능 합니다. 위 에서의
  make bzImage;make install;lilo 라고 실행 한다고 했는데, 사실 뒤의 lilo 명령은 make install 
  안에 들어 있는 내용이기 때문입니다. 

  수동으로 할 시에는 다음과 같이 합니다.

  [root@queenrjh linux]#cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-(커널버젼)
  [root@queenrjh linux]#mv /usr/src/linux/System.map /boot/System.map-(커널버젼)
  [root@queenrjh linux]#mv /boot/System.map /boot/System.map-(이전 커널버젼)

  간혹 커널에 이상이 발생하면, 화면에 여러 가지 레지스터들과 그 16진수 내용에 대한 한 페이지
  의 정보가 출력됩니다.   만약에 System.map 이 있다면, klogd 는 16진수 주소를 그 주소가 나타
  내는 함수 이름으로 변환합니다.  이 정보로 정확히 어느 위치에서 커널이 문제를 일으켰는지 판
  단할 수 있습니다. 그런데, System.map 이 없다면, 거의 필요없는 16진수 주소를 보게 될 겁니다. 
  이 값들은 각 기계마다 다르고, 커널 설정마다 다릅니다.

  하지만, 일반적으로 System.map 파일은 시스템의 부팅 시에는 어떠한 영향도 주지 않습니다. 단,
  System.map 파일이 없다면, 시스템에 문제가 발생할 때 주어지는 정보는 여러분이나 커널 개발자
  에게 무엇이 문제인지에 대한 어떠한 단서도 주지 못 할 것이라는 경고 메세지만 뿌려 줍니다. 

  그렇다면 여기서 lilo.conf 를 한 번이라도 들여다 보신 분이나 편집해 보신 분이라면 커널 이미
  지를 여러개를 등록시켜 사용하는 것을 본 경험이 있으나, System.map 은 어떻게 각 커널에 맞게
  사용해야 하는지 의문을 가지실 것입니다.

  방법은 /etc/rc.d/init.d/syslog 파일에서 'daemon klogd' 로 시작하는 줄을 다음과 같이 고칩니
  다.

          daemon klogd -k /boot/System.map-'uname -r'

  커널 버전을 확인하여(uname -r), 'System.map' 뒤에 붙인 후, 그 파일명을 -k 옵션으로 klogd로
  넘기는 것입니다. 

  ------------------------------------------------------------------------------------------

  그리고, make zdisk 와 make bzdisk 라는 명령이 있는데 이것은 컴파일한 새 커널 이미지를 부팅
  가능한 부트 디스크로 만들어 줍니다.  이것은 주로 새로운 커널을 시스템에서 사용하기 전에 제
  대로 동작 하는지 테스트해 보기 위한 용도로 사용 합니다.  그러나, 약간의 문제점이 있어서 잘
  사용하지 않는다고 하더군요..  저도 사용하질 않습니다. 편한 것은 다른 문제를 갖고 오는 경우
  가 종종 있기 때문에..

  반드시 부팅 디스켓은 만들어야 하므로 부팅 디스켓을 만들기 위한 플로피 디스켓을 A: 드라이브
  에 넣고, 만일 디스켓이 포맷이 되지 않았다면 먼저 다음과 같이 합니다.

  [root@queenrjh linux]#fdformat /dev/fd0H1440   <-- 1.44 메가로 포맷한다. 

  그리고, 리눅스 시스템으로 포맷을 하는 명령은 아래와 같이 두가지인데, 둘 중 아무것이나 사용
  하셔도 상관 없습니다.

  [root@queenrjh linux]#mke2fs /dev/fd0          <-- 파일 시스템을 만든다.

  또는,

  [root@queenrjh linux]#mkfs -t ext2 /dev/fd0    <-- 파일 시스템을 만든다.


  참고로, 도스용으로 파일 시스템을 만들 경우에는 다음과 같이 두가지 중 맘에 드는 명령을 내리
  시면 됩니다.  

  'mkdosfs /dev/fd0' 또는, 'mkfs -t dos /dev/fd0' 


  그 다음, 이번에도 아래와 같이 두가지의 방법중  편한 방법으로 부팅 디스켓을 만듭니다.

  [root@queenrjh linux]#dd if=/usr/src/linux/arch/i386/boot/bzImage of=/dev/fd0  

  또는,

  [root@queenrjh linux]#cat /usr/src/linux/arch/i386/boot/bzImage > /dev/fd0 


  위와 같이 하셨으면, 아래의 rdev 명령으로 커널 이미지에 기록된 루트 파티션에 대한 정보를 설
  정해 주어야 부팅 시에 루트 파티션을 제대로 찾습니다.

  [root@queenrjh linux]#rdev /dev/fd0 /dev/(루트 파티션)

  [root@queenrjh linux]#rdev /dev/fd0       <-- 루트 파티션이 제대로 설정 되었는지는 이 명령
                                                을 통해 확인 해 봅니다.


  그리고, 또다른 방법으로는 mkbootdisk 라는 명령이 있습니다.  형식은 아래와 같습니다.

  mkbootdisk --device /dev/fd0 '커널 버젼' 과 같이 입력합니다.

  만약 자신의 플로피 드라이브 장치명이 fd0인 경우 위의 --device /dev/fd0 부분은 사실 필요 없
  습니다.  그렇지 않고, 여러분의 플로피 드라이브 장치명이 '/dev/fd0' 가 아닐 경우에는 다음과 
  같이 '/dev/fd1' 으로 입력해 주셔야 합니다.

  또한, 위 형식의 맨 뒤에있는 '커널버젼' 은 /boot 디렉토리에 'vmlinuz-(커널 버젼)' 라는 파일
  을 가리키는 것입니다. 그러므로 위에서 'vmlinuz-(커널 버젼)' 라는 커널 이미지를 만들지 않고 
  'bzImage-(커널 버젼)' 으로 만들었다면, 'vmlinuz-(커널 버젼)' 라는 이름으로 링크를 만들어야 
  mkbootdisk 명령이 커널 이미지를 제대로 찾아 부팅 디스켓을 만들 수 있게 됩니다.


  하지만,  어떤 이유로..  위와 같이 자세히 부팅 디스켓을 만드는 법을 알려 주어도 만들지 않은
  분이나, 만들었어도 디스켓이 불량이라 제대로 되지 않는 분은 누구를 탓하겠습니까...

  도스 사용자가 한번 쯤 겪었을 부팅 디스켓의 중요함은 리눅스에서도 간과 할 수 없는 아주 중요
  한 일 임에 틀림 없습니다.  요즘 리눅스 사용자는 윈도우와 같이 사용하므로(NT 제외) 윈도우를 
  다시 깔기라도 하는 날에는 여지없이 lilo 는 날아가 버립니다. 그럼 위와같이 부팅 디스켓이 없
  다면 어떻게 해야 할까요?..  

  일단, 두가지 방법을 제시 해 보겠습니다.  첫 번째는 CD 로 부팅이 가능한 시스템에서 입니다.
  리눅스 CD 로 설치 할 때 와 같이 CD 로 부팅을 하면  'LILO Boot:' 라는 프롬프트가 나옵니다. 
  이때 다음과 같이 합니다. 

  LILO Boot: linux(or vmlinuz) root=/dev/(루트 파티션) ro initrd= 

  와 같이 하시면 설치 모드가 아닌 리눅스가 깔린 루트 파티션으로 패스 워드 없이 로그인 됩니다. 


  두 번째는 CD 로 부팅 가능하지 않은 시스템에서 입니다.  윈도우 98로 들어가서 리눅스 CD를 넣
  은 뒤에 loadlin 을 사용하여 리눅스로 부팅하는 방법입니다.

  C:\>cd d:\dosutils\
  C:\>loadlin autoboot\vmlinuz root=/dev/(루트 파티션) ro

  만일, 스카시 사용자라면 ro 뒤에 'initrd=autoboot\initrd.img' 라고 써주면 됩니다. 제대로 부
  팅이 되었다면, /sbin/lilo 를 실행시켜서 리로를 다시 인식 시켜 줘야 합니다.

  위의 'ro' 는 'read-only' 의 뜻으로 루트 파티션으로 마운트 되어 쓰기 가능하기 전까지는 읽기
  만 지원해야 파일 시스템에 이상이 없으므로, 보통 ro 옵션을 써 주지만 안 써 주어도 크게 상관
  은 없습니다. 안 해 주어도 된다는 것은 그 만큼 리눅스가 유연성이나 융통성에서 강하다는 것을 
  나타내 주는 것이지요.

  ** 여기서 실험 정신이 강한 분이라면, 위와 같은 상황을 일부러 만들어서 해 보셔도 좋습니다.
     먼저 위와 같이 부팅 디스켓을 충실히 만든 후에 윈도우의 'MS 도스 창'에서 'fdisk /mbr' 을
     실행시켜서 MBR(Master Boot Record) 에 있는 lilo 를 저 세상으로 날려 버립니다. 

     하지만, 윈도우나 도스를 전혀 안 쓰시고 오로지 리눅스로만 쓰시는 분이 계시다면 위의 명령
     을 사용 할 수 없으실 겁니다.  그럴 경우에 리눅스에서 리로를 없애는 방법은  'lilo -U' 을 
     사용하시면 됩니다.  어찌되었건 리로를 고이 잠들게 하신 후에 위에  반드시! 부팅 디스켓을 
     만드시고, 알려드린 방법대로 한번 실험해 보십시요.  하지만, 책임은 절대 못집니다.. ^^;  

  ------------------------------------------------------------------------------------------

  잠깐만..  쉬어갑시다!!


  * 아래의 글은 커널 옵션 한글화 프로젝트 홈페이지의 정원영님께서 쓰신 글을 인용한 것입
  니다.


  [쉬어가기] 왜 커널 이미지를 압축하는가? 

  글쓴이: 정원영 [http://kernel.pe.kr]


  우리는 커널 컴파일을 할때 make zImage, make bzImage 이런식으로 커널 이미지를 압축한다.
  ( make zlilo, zdisk, bzlilo 모두 마찬가지..) 아무런 의심없이 무의식적으로 당연히 이렇
  게 쓰고 있다.

  여기에는 약간의 배경지식이 필요한데 간략히 설명하겠다.

  우리가 흔히 아는 매킨토시의 M68계열 processor는 8bit환경에서 32bit환경으로 발전되었지
  만, 인텔의 8086계열은 DOS의 대중성 때문에 바로 32bit 환경으로 가지못하고 16bit 환경을 
  가지게 되었다. 대중적으로 많이 쓰이고 있는 DOS를 계속 쓸수 있도록 하기 위해서였다. 이
  러한 이유 때문에 리얼모드, 보호모드, 가상86모드가 생겼다.

  리얼모드, 보호모드, 가상86모드 모두 세그먼트 레지스터와 오프셋 레지스터를 이용하여 주
  소를 지정하는데 이들 레지스터의 사용방법이 다르다.

  리얼모드는 세그먼트x10h + 오프셋으로 주소를 만드는데 16bit에서 세그먼트와 오프셋의 최
  대 값은 FFFF이다. 그러므로 최대로 지정할수 있는 주소는 FFFF0 + FFFF가 된다. 이걸 계산
  하면 1MB + 64KB가 된다.

  보호모드에서는 주소지정 방식이 리얼모드와는 많이 다르고, 페이징등을 이용하여 32bit 모
  두 주소 값을 만들 수 있으므로 이론적으론 4GB의 메모리를 이용할 수 있으며, 가상 86모드 
  또한 선형주소를 만들어내는 과정만 다르므로 기본 매커니즘은 보호모드와 같다. (보호모드
  와 가상 86모드의 주소 생성법은 생략한다.)

  프로그램은 code 부분과 data부분으로 나누어지는데,  리얼모드에서 프로그램의 code부분은 
  반드시 위 최대 주소 지정영역 내에 있어야 한다는 것이다.  리얼모드에서는 여러개의 프로
  그램이 메모리에 올라와서 수행될수 없으며(만약 여러개의 프로그램이 메모리에서 수행된다
  면 다른 프로그램영역을 침범 할 수 있기 때문이다.) interrupt를 이용하는 RAM상주 프로그
  램 만이 메모리를 같이 차지할 수 있다.

  위에서 설명한 리얼모드의 약 1MB정도의 영역중 Coventional Memory가 640KB를 차지하고 나
  머지는 비디오램이나 기타 디바이스가 차지한다.

  그러므로, 커널 이미지는 Coventional Memory 즉 640KB내에 들어가야 하므로 커널 이미지의 
  크기가 640KB 보다 작아야 한다.  커널 이미지의 압축으로  이러한 제약을 부분적으로 극복 
  하였으나 640KB의 일부는 여러가지 버퍼(DMA buffer)나  특정 주소가 시스템에 예약되어 있
  으므로 640KB보다 더 작은 크기의 커널이 요구된다. 
  이러한 문제의 대안으로 커널을 Extended Memory에 적재하는 방법을 생각해 볼 수 있다.

  Extended Memory 영역에 자유로이 적재하기 위해서는 보호모드를 사용해야 하는데 보호모드
  에서는 BIOS와 같이 시스템이 완전히 준비되기 전의 기본적인 기능들을 사용할 수 없다.  
  이럴 경우 디스크를 액세스하는 자체적인 함수를 준비하여 커널을 Extended Memory 에 적재
  하거나 아니면 커널을 줄이는 수 밖에 없는 것이다.


  - 폐인 -  
   
  ------------------------------------------------------------------------------------------

  그 다음은 모듈을 만들고 설치하는 과정입니다.

  [root@queenrjh linux]#mv /lib/modules/2.0.36 /lib/modules/2.0.36-org  <-- 구 버전의 모듈
                                                                            을 백업 합니다.

  [root@queenrjh linux]#make modules               <-- 모듈을 만듭니다.

  [root@queenrjh linux]#make modules_install       <-- 모듈을 설치합니다.

  [root@queenrjh linux]#depmod -a (커널버젼)  <-- 의존성 검사를 합니다. (레드햇에서는 부팅 
                                                  시의 초기화에서 자동으로 해 주므로 안 해
                                                  도 상관 없지만, 부팅 시에 무슨 일이 생길
                                                  지 또 모르는 일 이므로 그냥 해 줍니다.)


  그 다음에 커널 옵션에서 모듈을 하나라도 선택을 하셨다면 모듈을 만들어야 합니다. 그러나, 주
  의할 점은 기존에 있던 모듈을 삭제하거나 다른 이름으로 백업하지 않으면, 간혹 같은 커널 버전
  대에서는 컴파일을 하고 설치시에 그냥 그 위에 덮어서 쓰기 때문에  모듈이 서로 뒤섞여서 문제
  가 종종 발생 하게 됩니다.  

  그래서, 이전의 모듈이 있는 /lib/modules/(커널버전) 디렉토리를 지우거나 백업하고, 모듈을 새
  로 만들어 주어야 합니다.  참고로, depmod -a (커널버젼) 명령으로 의한 각 모듈의 의존성 정보
  는 /lib/modules/(커널버젼)/modules.dep 파일에 저장됩니다.  간혹 modules.dep 파일을 직접 수
  정할 경우가 생길 수 있습니다.  파일 안의 내용을 한 번 훑어 보는 것도 나중에 도움이 됩니다.

  모듈은 '/etc/conf.modules' 라는 파일 안에 모듈 이름을 적어서 인식 시킵니다. 특히, 리눅스에
  서 네트워크는 기본이고,  필수 사항 입니다.   일반적으로 네트워크 카드를 설정 하기 위해서는 
  'insmod' 나 'modprobe' 명령으로 모듈을 인식 시켜주지만, 직접 '/etc/conf.modules' 파일 안에
  'alias'로 네트워크 모듈을 적어 주시면 됩니다.  아래에 간단한 예를 들어 보겠습니다.

  [root@queenrjh home]#vi /etc/conf.modules
  alias eth0 ne io=0x300 irq=10
  alias eth1 rtl8139
  alias eth2 eepro100

  위의 첫 번째 줄은  ne 호환 isa 용의 네트워크 카드를 alias 로 장치명과 모듈명, io 주소, irq
  값을 순서대로 넣은 것입니다.  그리고, 다음 줄 역시 같은 형식이지만 io 주소와 irq 값이 없는
  것은 pci 용의 네트워크 카드이기 때문에 입력을 해주지 않아도 자동으로 인식되기 때문 입니다. 

  isa 용은 반드시 io 주소와 irq 의 값을 넣어 주셔야 하고,  1개 이상의 네트워크 카드를 시스템
  에 장착 하신다면, 각 각의 네트워크 카드를 커널 설정에서 모듈로 선택 하셔야 제대로 인식합니
  다.  그리고, 네트워크 카드의 모듈이 있는 곳은 /lib/modules/(커널버젼)/net 의 디렉토리에 있
  습니다.

  ==========================================================================================

  ** 참고:  커널 2.4.0-test-* 버전에서는 모듈의 디렉토리 구조가 많이 바뀌었습니다. **

       커널 2.4.0-test6-* 이상의 버전부터는 모듈이 위치하는 "/lib/modules/커널버전" 의
       디렉토리 구조가 더욱 세분화 되었습니다.

       [root@queenrjh 2.4.0-test9]$ ls -l

       lrwxrwxrwx  1 root  root    26 Oct  4 17:09 build -> /usr/src/linux-2.4.0-test9/
       drwxr-xr-x  6 root  root  1024 Oct  4 17:09 kernel/
       -rw-r--r--  1 root  root  1340 Oct  5 20:33 modules.dep
       -rw-r--r--  1 root  root  3235 Oct  5 20:33 modules.pcimap
       drwxr-xr-x  2 root  root  1024 Oct  4 17:09 pcmcia/


       위의 kernel 디렉토리에 들어가보면 다음과 같이 세분화 되어 있습니다.

       [root@queenrjh 2.4.0-test9]$ cd kernel

       [root@queenrjh kernel]$ ls -l

       drwxr-xr-x   3 root     root         1024 Oct  4 17:09 arch/
       drwxr-xr-x   8 root     root         1024 Oct  4 17:10 drivers/
       drwxr-xr-x   9 root     root         1024 Oct  4 17:09 fs/
       drwxr-xr-x   4 root     root         1024 Oct  4 17:09 net/


       drivers 디렉토리 구조를 보면 예전 모듈들의 디렉토리 구조가 이곳으로 옮겨 왔음을
       알 수 있습니다.

       [root@queenrjh drivers]$ ls -l

       drwxr-xr-x   2 root     root         1024 Oct  4 17:09 block/
       drwxr-xr-x   3 root     root         1024 Oct  4 17:09 char/
       drwxr-xr-x   2 root     root         1024 Oct  4 17:09 ide/
       drwxr-xr-x   2 root     root         1024 Oct  4 17:09 net/
       drwxr-xr-x   2 root     root         1024 Oct  4 17:09 sound/
       drwxr-xr-x   2 root     root         1024 Oct  4 17:10 video/


       또한, 공유메모리를 사용하기 위해서는 /var/shm(또는, /dev/shm)을 마운트 해야합니
             다. 커널 2.3 개발버전을 처음 컴파일하고 부팅했을 때 제일 처음 직면했던 문제인데
       System V 공유 메모리를 사용하지 못해서  부팅시 자동으로 뜨는 아파치 데몬이 뜨지 
             못하는 문제와 여러 프로그램을 실행했을 때 공유 메모리를 사용하지 못해 에러가 나
             는 문제가 발생했었습니다.  2.4-test-* 버전을 쓰기위해선 꼭 해줘야 하는 부분입니
             다.

       # mkdir /var/shm

       # vi /etc/fstab
       none            /var/shm           shm         defaults        0 0

  ==========================================================================================

  ------------------------------------------------------------------------------------------

  위에서 언급 했던..  소스로 커널 컴파일 할 때의 노트북 사용자는 pcmcia 소스를 따로 받아와서 
  컴파일 해줘야 하는데, 소스 파일은 http://freshmeat.net 에서 검색어를  pcmcia 로 찾으면, 한
  10번째 항목 정도에 있습니다.  그걸 받아오시면 됩니다.  참고로 현재 최신 버전은 cs-3.1.* 입
  니다. 

  [root@queenrjh src]#tar xvzf pcmcia-cs-3.1.*.tar.gz
  [root@queenrjh src]#cd pcmcia-cs-3.1.15

  [root@queenrjh pcmcia-cs-3.1.15]#make config
  [root@queenrjh pcmcia-cs-3.1.15]#make all
  [root@queenrjh pcmcia-cs-3.1.15]#make install


  지금부터의 내용도 한글 문서 프로젝트의 주인이신 권순선님의 권유로 노트북의 자료를 수집해서
  약간의 내용을 첨가했습니다.  노트북 사용자들께서는 참고 하시기 바랍니다.


  pcmcia 랜카드를 설치했는데도 네트워크가 안되는 경우는 일반적으로 network 스크립트가 실행된
  후  pcmcia가  실행되어  랜카드 초기화가  실패하는  경우일 수 있으므로,  일단 부팅하고 나서 
  /etc/rc.d/init.d/network restart를 해주면 됩니다. 

  그렇지 않으면, /etc/inittab 파일 안의 실행 레벨을 직접 편집해서 network 서비스를 pcmcia 데
  몬 뒤로 옮겨 놓으면 됩니다. 

  참고로, /etc/rc.d/init.d/ 는 각 데몬들의 실행 스크립트 파일이 있는 곳이고,  rc0.d ~ rc6.d/
  는 실행 레벨에 따라 각기 실행되는 스크립트를 링크해둔 파일이 위치해 있는 곳입니다. 

  다시말해,  rc0.d ~ rc6.d/ 의 파일들은 init.d/ 디렉토리의 파일들이 링크되어 있는 것이고, 각
  파일명 앞에는 숫자가 붙어 있는데, 이것은 실행 순서를 의미합니다. 

  이야기를 꺼냈으니, rc0.d ~ rc6.d/ 의 내용에 대해 좀더 알아볼까요? 

  여러분이 리눅스 설치시에 그래픽 모드로 리눅스를 시작하게 하셨다면, 실행 레벨은 '5' 가 됩니
  다.  이때 뜨는 데몬들이 바로 rc5.d/ 에 있는 것이죠. 

  또한, 실행 레벨은 0 ~ 6 까지 있으며, 그 내용은 다음과 같습니다. 

  0 - halt : 시스템 정지를 뜻한다.  우리가 보통 shutdown 시킬 때 사용되는 레벨입니다. 
  1 - Single user mode : 싱글 사용자 모드입니다.  흔히 패스워드를 잃어 버렸을 때, 실행시키죠.
  2 - Multiuser, without NFS : 다중 사용자 모드이지만, 네트워크는 지원하지 않습니다. 
  3 - Full multiuser mode : 기본으로 사용되는 다중 사용자 모드이며, 네트워크도 지원합니다.
  4 - unused : 일반적으로 사용되지 않습니다. 
  5 - X11 : 위에서 말씀드린 그래픽 모드로 실행될 때 사용되는 모드입니다. 
  6 - reboot : reboot 명령을 내렸을 때 실행되는 레벨입니다. 

  즉, 위의 레벨에 따라 rc0 ~ 6.d/ 까지 해당 스크립트가 실행되는 것입니다. 

  파일명 앞의 'S'는 데몬 시작 "Start" 를, 'K'는 "kill" 을 의미하죠. 즉, 데몬을 메모리에서 제
  거 하는 것입니다.  

  각 데몬들을 띄우고 내리는 실행 방법은 다음과 같이 합니다.

  [root@queenrjh ]# /etc/rc.d/init.d/[파일명] start 또는, stop 으로 하시면 됩니다. 


  노트북의 전원 관리는 apm 명령을 사용합니다.  "apm -s" 의 '-s'(소문자) 옵션은 서스펜드(일시
  정지)모드, '-S'(대문자) 옵션은 스탠바이(대기)모드, 그리고, 옵션없이 apm 명령을 내리게 되면
  전원 연결상태와 배터리 충전양이 나옵니다. 

  당연히 이 기능을 사용하기 위해서는 커널 컴파일 설정에 apm 항목들을 체크해야 합니다. 
  또한, "ntsysv" 를 실행시켜서 "apmd" 데몬이 시작시에 뜨도록 설정되어 있는지도 확인해 보세요.

  하드디스크의 전원관리는 hdparm 명령을 사용합니다. 사용법은 "hdparm -S 시간(초단위)" 해주면
  하드 드라이브의 모터 회전이 멈추는  서스펜드 모드로 들어갑니다. 


  노트북의 콘솔상에서 화면 확장을 하게될 경우 글꼴에 계단 현상이 생기는 경우는 프레임 버퍼를
  사용하면 해결됩니다. 그렇게 하면, 화면을 확장할 필요없이 노트북의 해상도를 그대로 사용하면
  됩니다. (저는 사실 이게 무슨 말인지 잘 모르겠지만 이런 경우가 있다더군요..)

  노트북이 아니더라도 프레임 버퍼를 일반 PC에서도 사용하는 경우가 있으니 설명 드리겠습니다.
  물론, 커널 컴파일 설정에서 프레임 버퍼기능을 집어넣어야 가능합니다. 기본적인 설정의 내용은
  다음과 같습니다.


          Console drivers --->

         [*] VGA text conSoLe
         [*] Video mode SeLection Support
            < > MDA text conSoLe (duaL-headed) (EXPERIMENTAL)
         [*] Support for frame buffer devices (EXPERIMENTAL) (NEW)
         [*] VESA VGA graphics console (NEW)


   Video mode SeLection Support : 커널을 시작할 때 "vga=???" 옵션으로 비디오 모드를 선택하는
   기능입니다.  여기서 "vga=???" 의 ??? 는 비디오 모드 값을 가리킵니다.

  위의 내용을 설정하고 커널 컴파일 하신 다음 /etc/lilo.conf 에다가 "vga=???"라는 부분을 추가
  하신 후 반드시 /sbin/lilo를 실행시킵니다.  lilo.conf 부분의 내용을 잠시 보여드리면,


         image=/boot/vmlinuz
         label=linux 
         root=/dev/hda1
         initrd=/boot/initrd-2.2.17.img
         read-only
         vga=313     <== 이 비디오 모드 값은 아래의 내용을 참고 하세요.


    아래의 비디오 모드 값들은 위의 "vga=???" 의 "???" 값 대신 입력하실 수 있습니다. 
    이 값들은 각 값들에 0x200 을 더한 값입니다.(?? 제가 참고 한 문서에 이렇게 쓰여
    있더군요..)  참고로, 프레임 버퍼에서 한글 입/출력을 위해 쓰여지는 값은 이 값을
    사용합니다.

    --------+---------------------------------------------
    Colours | 640x480 800x600 1024x768 1280x1024 1600x1200
    --------+---------------------------------------------
    256     |  0301    0303     0305     0307      031C
    32,768  |  0310    0313     0316     0319      031D
    65,536  |  0311    0314     0317     031A      031E
    16.8M   |  0312    0315     0318     031B      031F
    --------+---------------------------------------------


    아래는 위의 값을 십진수로 표시한 것입니다.

    --------+---------------------------------------------
    Colours | 640x480 800x600 1024x768 1280x1024 1600x1200
    --------+---------------------------------------------
    256     |   769     771      773      775       796
    32,768  |   784     787      790      793       797
    65,536  |   785     788      791      794       798
    16.8M   |   786     789      792      795       799
    --------+---------------------------------------------

  ------------------------------------------------------------------------------------------

  그리고, 일반 사용자는 거의 필요없는 사항이지만, 스카시 드라이버처럼 시스템을 부팅하는데 필
  요한 디바이스나 기능을 모듈로 컴파일해서 사용하는 사용자라면 시스템을 부팅하기 위하여 초기
  램 디스크 이미지를 만들어야 합니다.  아예 모듈을 커널에 넣어서 컴파일한 경우는 필요 없습니
  다.  하지만, 모듈을 커널에 넣어서 컴파일 하지도 않고 램 디스크 이미지를 만들지도 않은 경우
  에는 아예 부팅이 되지 않습니다.

  그래서, 램 디스크 이미지를 만들기 위해서는 mkinitrd 명령을 사용 해야 합니다. mkinitrd 명령
  을 사용 할 수 있으려면 루프 백 장치가 로드되어 있어야 합니다. 루프 백 장치 모듈이 로드되어
  있는지 확인하기 위해서는 다음과 같이 합니다.  

  [root@queenrjh boot]#lsmod |grep loop

  'loop' 와 관련된 내용이 없다면, 아래와 같이 명령을 내려 보세요.

  [root@queenrjh boot]#modprobe loop

  위와 같이 했지만, 커널 자체에서 컴파일되지 않아서 loop 디바이스를 사용할 수 없다는 에러 메
  세지가 뜬다면, 커널 설정 부분에서 아래의 내용을 모듈로 선택 하시고, 다시 컴파일 하는 수 밖
  에 없습니다.

  Block devices 의 항목에서
  <M> Loopback device support 을 모듈로 설정합니다.

  다시 컴파일 하신 후에, lsmod 명령으로 loop 모듈이 제대로 올려져 있는지 확인 해 보세요. 
  그리고, mkinitrd 명령을 사용하여 이미지를 실제로 만듭니다.

  [root@queenrjh boot]#mkinitrd /boot/initrd-(커널버젼).img (커널버젼)
   
  위의 과정은 일반 사용자가 반드시 해야 하는 것이 아니라는 것을 다시 한번 강조 합니다.  시스
  템을 부팅하는데 필요한 디바이스나 기능을  모듈로 컴파일해서 사용하는 사용자 만이 위와 같은
  작업으로 램 디스크 이미지를 만들어 사용하는 것입니다.

  ------------------------------------------------------------------------------------------

  자.. 이제 마지막으로 새 커널을 lilo 에게 알려줘야 합니다.  /etc/lilo.conf 파일을 편집한 후 
  /sbin/lilo 를 "반드시" 실행 시키고, 재 부팅 하면 됩니다.  아래의 내용을 참고로 해서 자신의
  시스템에 맞게 lilo.conf 를 수정해서 사용하세요..  

  [root@queenrjh boot]#vi /etc/lilo.conf 

  image=/boot/vmlinuz             <-- 구 버젼 용
  label=linux 
  root=/dev/(루트 파티션)
  initrd=/boot/initrd-(커널버젼).img
  read-only
  vga=ask

  image=/boot/vmlinuz-(커널버젼)  <-- 신 버젼 용
  label=new                       <-- 부팅 시에 'new' 라고 치면 새로운 커널로 부팅이 됩니다.
  root=/dev/(루트 파티션)
  initrd=/boot/initrd-(커널버젼).img
  read-only
  vga=ask

  [root@queenrjh boot]#lilo

  [root@queenrjh boot]#reboot

  재 부팅시에 리로에서 'linux' 라고 치면 예전 커널로..  'new' 라고 치시면 새로운 커널로 부팅
  을 하게 됩니다.  이렇게 한 것은 어디까지나 예에 불과합니다. 여러분께서 예전에(지금도 -_-;) 
  도스에서 Autoexec.bat 파일을 통해 여러 설정으로 부팅하려고 부단히 노력한 분은 아실 겁니다.

  리눅스 또한 틀리지 않습니다.  리로를 잘 다루시면 부팅이 편하고, 즐겁습니다.. (무슨 광고 멘
  트 같군요... ^^;)

  자.. 이제 어느정도 커널 컴파일에 대한 감이 새롭게 오십니까?..  이전에 무턱대고 명령을 내리
  면서 생겼던 궁금증이나 중간에 또다른 문제로 인해 고생하셨던 분들은 어느 정도 도움이 되셨으
  리라 생각됩니다.  앞으로 여러분만의 즐거운 커널 컴파일이 되시기를 바랍니다.


  아래에 지금까지의 순서를 정리 해 놓았으니 참고 하시기 바랍니다.

  ------------------------------------------------------------------------------------------

  정리를 해보면,

  1. 커널 소스를 받아온다. rpm 의 경우도 마찬가지..

  2. /usr/src 로 복사 해서 압축을 풉니다.  rpm 의 경우는 -Uvh 옵션으로 설치 하시고 원하시면, 
     기존의 커널 소스를 백업 한다.

  3. /usr/src 에 기존의 linux 링크를 새로운 버젼으로 다시 링크한다.

  4. /usr/include 의 asm linux scsi 링크 또한 제대로 되어 있는지 확인 해 본다.

  5. 적용할 패치가 있다면 /usr/src 로 가져와서 적용한다. 

  6. make mrproper 명령 후 make config, xconfig, menuconfig 중 하나를 선택해서,  커널 설정을 
     한다.  설정이 끝나면 꼭 저장하고 나온다.

  7. make dep; make clean 명령을 내리고,  수동으로 할 경우에는 make bzImage 명령으로 커널 이
     미지를 만든다.  자동으로 설치까지 하기를 원하는 경우에는 make bzlilo 라는 명령을 내린다.  

  8. /usr/src/linux/arch/i386/boot/bzImage 의 커널 이미지를 /boot/vmlinuz-(커널버젼) 로 복사
     한다.   만일 여러 버젼의 커널로 다중 부팅을 하길 원한다면, /usr/src/linux/System.map 를
     /boot/System.map-(커널버젼) 으로 복사하고,  기존의 /boot/System.map 를 System.map-(이전
     커널버젼) 으로 이름을 바꾼다.

     그리고, /etc/rc.d/init.d/syslog 파일 중 'daemon klogd' 으로 시작되는 부분을 다음과 같이
     수정한다.    daemon klogd -k /boot/System.map-'uname -r'

  9. 부팅 디스켓을 '꼭' , "반드시" 맹근다.  ^^;

  10. /lib/modules/(커널버젼) 디렉토리의 구 버젼 모듈을 다른 이름으로 백업 해 주고, 
      make modules; make modules_install 명령으로 모듈을 만들고,  설치한 후에 depmod -a 명령
      으로 모듈 의존성 검사를 해준다.

  11. /etc/lilo.conf 파일을 시스템에 맞게 수정을 해 주고, /sbin/lilo 를 실행시켜서 lilo.conf
      의 수정한 내용을 인식 시켜준다.

  ==========================================================================================

'scrap >  Linux' 카테고리의 다른 글

ies4linux  (0) 2011.02.03
Fedora Linux 13 : nVidia graphic driver  (0) 2011.02.03
[우분투] 설치 후 할것들  (0) 2011.02.03
kernel compile  (0) 2011.02.03
Fedora 13, hangul  (0) 2011.02.03