관리 메뉴

드럼치는 프로그래머

[Linux] 커널 컴파일 본문

★─Programing/☆─Linux

[Linux] 커널 컴파일

드럼치는한동이 2007. 7. 31. 19:43

커널 컴파일 2.4.2 => 2.4.22

# cd /usr/src

# gzip cd linux-2.4.22.tar.gz | tar xvf

# ln s linux-2.4.22 linux

# cd linux

소스를 적당한 디렉토리에 가져다가 압축을 해제한다.

 

/usr/src 디렉토리는 일종의 작업장이라고 생각하면 된다.

여기서 작업한 내용은 시스템에 전혀 영향을 주지 않는다.

압축을 풀 때 tar xvzf linux-2.4.22.tar.gz 해도 상관은 없다

하지만 압축파일이 bz2일때는 위의 방법을 쓰지못한다.

그래서 gzip로 압축을 풀고 파이프로 넘겨 tar에서 풀어주는 방식을 추천한다.

gzip에서 c 옵션은 표준출력으로 보내는 옵션이고 d는 압축을 해제한다.

tar의 f 옵션다음에 파일명이 안나오고 가 나오면 표준입력으로 받는다.

 

# make mrproper

이전에 설정한 정보를 지우거나 새로운 커널소스를 가져다 컴파일할때에는 이명령을 먼저 사용해야한다.

이전 커널을 컴파일할 때 만들어진 오브젝트파일(*.o)과 의존성설정,컴파일환경설정값, 버전정보등 새로 시작하는 컴파일에 영향을 주는 이전 정보들을 삭제한다.

이전에 설정된 컴파일 환경을 재사용한다면 이 과정을 건너뛴다.

 

# make menuconfig

가장 중요한 컴파일 옵션을 설정하는 단계이다.

일반적으로 옵션을 지정하는 방법은

make config

make menuconfig

make xconfig

make oldconfig

 

이 중에서 make oldconfig는 이전에 컴파일 하고난후 kernel.config라는 파일이 있는데 이전 컴파일시 옵션을 설정한 것을 저장해둔 파일이다.

이 파일을 /usr/src/linux에 .config 형태로 카피해서 make oldconfig를 실행시키면 이전에 설정한 부분을 제외하고 나머지부분만 물어보게 된다.

 

나머지 3개는 기능은 동일하고 인터페이스상의 편리성과 연관이 있다.

먼저 make config는 콘솔상에서 하나하나의 질의에 일일히 응답해야 되는 오래된 방법이다.

만약 설정중간에 실수를 하거나 고치고 싶으면 다시 처음부터 설정을 해야하는 애로사항이 있다. 요즘은 많이 사용하지 않는다.

두번째 make menuconfig 이다.

이는 가장 많이 쓰이는 방법이고 X가 설치되지 않은 환경에서도 직관적으로 설정이 가능하다는 장점이 있어 거의 이 방법이 쓰인다.

, 이 방법을 사용하기위해선 ncurses 패키지가 설치되어 있어야한다.

Ncurses 패키지는 콘솔상에서 전화면 편집이 가능하게 하는 패키지이다(ntsysv 역시..)

 

세번째는 make xconfig인데 요즘에 많이 쓰이는 방법이다.

하지만 서버에서 주로 X자체를 설치하지 않기 때문에 그렇게 많이 사용하지는 않는거같다.

이것을 사용할려면 tcl/tk가 설치되어 있어야한다.

 

세세한 옵션내용은 인터넷이나 서적에서 참조

 

# make dep

# make clean

모든 설정이 끝났으면 컴파일 의존성체크와 청소를 해야한다.

의존성이란 설정된 옵션들을 커널에 포함시키기 위해 컴파일 환경을 만드는 것이다.

그리고 이전에 수행했던 컴파일과정에서 생성된 오브젝트파일(*.o), 커널임시파일,(.tmp*) 설정값(configure)등을 삭제한다.

물론 한꺼번에 # make dep; make clean 이라고 수행해도 된다.

 

# make bzImage

Image의 아이는 대문자이다.

실제적인 컴파일 과정이고 가장많은 시간이 소요된다(커널 이미지를 만듬)

예전에는 make zImage를 많이 사용했었는데 이는 커널이미지가 제한된 크기를 넘어서면 System is too big 이라는 에러메세지를 남기고 컴파일에 실패하게 된다.

그래서 요즘은 보통 bzImage를 많이 사용한다.

물론 가장 좋은 방법은 커널에 쓸데없는 모듈을 제거해서 zImage로 간결하게 만드는 게 제일 좋다.

make zdisk는 커널이미지를 플로피디스크에 쓴다.

, 플로피디스크로 새 커널을 테스트할 때 사용한다.

커널이미지를 만든후 lilo까지 수행하는 make zlilo도 있지만 많이 쓰이지는 않는다.

 

컴파일에 성공하면 /usr/src/linux/arch/i386/boot 디렉토리 아래에 bzImage 파일을 찾을수 있다. (내 리눅스박스에 있는건 991643byte 이다)

 

 

# make modules

# make modules_install

커널 선택옵션에서 Y를 선택한 항목은 bzImage에 커널이미지형태로 만들어 진다.

하지만 커널이미지가 너무 비대해지면 시스템의 자원을 그만큼 많이 차지하므로 가능하면 모듈로 설치해서 실행시 로딩하는 방식이 시스템에 더욱 유용할 것이다.

Make modules는 커널옵션선택에서 M를 선택한 부분을 모듈로 만드는 작업이다.

Make modules로 생성한 모듈을 실제로 설치하는 명령이 make modules_install이다.

이 명령을 실행하면 /lib/modules/커널버전/ 디렉토리에 모듈들이 복사된다.

 

중요한건 이렇게 모듈을 설치했다고 바로 쓸수 있는게 아니고 해당 모듈을 modprobe나 insmod로 모듈을 추가해야 된다.

그리고 재부팅후 그 모듈이 계속 올라와 있게 하려면 /etc/modules.conf 파일에 해당모듈을 등록해주어야 한다.

 

이렇게 하면 새로운 커널과 모듈을 생성한것이다.

참고로 커널 컴파일에 걸린 시간을 알아보려면

# time v sh c make dep ; make clean modules modules_install

time v : 자세한 정보 출력

sh c string…’ : 명령을 뒤따르는 문자열들에서 읽어 드린다.

 

# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage-2.4.22

생성된 커널이미지를 /boot 디렉토리 아래에 적당한 이름으로 복사를 한다.

이름은 어떻게 주더라도 상관이 없지만 잠시후 lilo 관련에서 이름을 일치시켜야 한다.

 

 

/etc/lilo.conf 파일을 편집한다.

 

boot=/dev/had

map=/boot/map

install=/boot/boot.b

prompt

timeout=500

message=/boot/message

default=linux

 

 

image=/boot/vmlinuz-2.4.2-3

             lavel=linux

             read-only

             root=/dev/hda1

 

이렇게 되어있으면 아래의 내용을 추가한다.

 

image=/boot/bzImage-2.4.22

             label=linux-2.4.22

             root=/dev/hda1

 

# /sbin/lilo

 

lilo를 실행시키고 재부팅을 하면 lilo 화면에서 두개의 커널중 하나를 선택할 수가 있다.

새 커널로 부팅해보고 아무런 이상이 없으면 기존의 커널을 삭제하거나 관련 모듈을 삭제해도 된다.

하지만 만약을 대비해서(kernel panic같은) 여분의 커널을 하나정도 남겨두는게 좋다.

이렇게 하면 커널 컴파일이 끝나게 된다.

 

마지막으로 .

처음 커널 컴파일을 하고 성공적으로 설치가 됐는데 네트웍이 인식이 안됐었다.

/etc/sysconfig/network 스크립트와 /etc/sysconfig/network-script/ifg-eth0 스크립트를 확인해도 이상한 점을 찾을 수가 없었다.

혹시나 이더넷 모듈이 올라와 있는지 확인을 했다.

# lsmod

하니까 역시나 모듈이 올라오지 않았다.

/lib/modules/2.4.22 아래에 모듈관련된 항목을 확인해보니 딸랑 dummy.o 하나 올라와 있었다.

나중에 알고보니 처음 커널 옵션 선택에서 quota 관련만 추가해서 네트웍관련 부분이 아예 선택되어지지 않았고 모듈로도 선택하지 않아서였다.

커널 설정 옵션에서 해당 랜카드(8139too)를 M으로 선택했으면 모듈을 올려준후 사용할 수있고 Y로 선택했으면 커널이미지에 포함되어 있기 때문에 모듈올리는 과정이 필요없다.

 

 

필요한 모듈만 컴파일하고자 할 때


# make menuconfig

# make dep

# make clean

# make modules

# make modules_install

 

이미지를 만드는것이 아니기 때문에 make bzImage 과정이 생략된다.

새로운 모듈을 만드는것이기 때문에 /lib/modules/<커널버전> 디렉토리는 백업했다가(만약을 대비해서) 모든 작업이 완료되는 지운다(새 모듈이 만들어 졌으므로 /lib/modules/<커널버전> 디렉토리가 생성이 된다)

Comments