커널 이미지를 만들어 커널 버전은 최신으로 유지하자.

커널 소스는 모듈 프로그래밍이나 드라이버 설치 다양한 작업에서 필요로 하기 때문에 설치하는것이 좋다.

기본적으로 작업은 root 계정에서 이루어 진다.



(1) 커널 소스 / 패키지 다운로드

: 커널 컴파일에 앞서 커널 소스와 필요한 패키지들을 설치한다.


커널 소스

: # apt-get install linux-source


 패키지

: # apt-get install build-essential

  # apt-get install bin86

  # apt-get install kernel-pakage

  # apt-get install libncurses5-dev (menuconfig를 위한 패키지)



(2) 커널 소스 설치

: /usr/src/linux-source-x.x.x 경로로 가면 다운받은 묶여있는 커널소스(linux-source-x.x.x.tar.bz2) 확인할 있다


  (ex) linux-source-3.0.0.tar.bz2


소스 설치

: /usr/src/ 경로에 linux-source-x.x.x.tar.bz2 링크 파일을 압축해제하면, /linux-source-x.x.x/ 폴더에 소스파일이 설치된다.

 # tar jxvf linux-source-x.x.x.tar.bz2

- 설치가 끝나면 linux-source-x.x.x 디렉토리에서 커널소스를 확인할 있다.



(3) 커널 환경설정

: 커널 컴파일 전에 커널 환경설정을 현재 사용하고 있는 커널의 환경설정과 동일하게 만들어줘야 한다.


환경 설정파일 복사

- /boot 경로의 파일들은 부트로더에서 사용한다.

- /boot 경로에서 configuration 파일을 확인할 있다. (ex) config-3.0.0-12-generic

- configuration 파일을 /usr/src/linux-source-x.x.x/linux-source-x.x.x/.config 복사한다.


  # cp /boot/config-3.0.0-12-generic /usr/src/linux-source-3.0.0/linux-source-3.0.0/.config


환경 설정파일 적용

- 이전에 컴파일했던 기록이 있으면 make mrproper 명령으로 의존성을 삭제한다. ( 컴파일이면 안해줘도 된다.)

- 커널소스 디렉토리에서 make menuconfig 명령 실행(root 권한)

- 설정 창의 밑에 Load하는 부분을 클릭하고 복사한 .config 파일을 선택하여 커널 컴파일시 적용 되도록 한다.

- 설정 창에서 저장하고 나온다.



(4) 커널 컴파일

: 컴파일을 위한 소스파일 설치 / 설정파일 적용 단계를 정상적으로 마쳤다면 커널 컴파일을 실행한다.


clean / compile (make-kpkg 컴파일할 경우)

  # make-kpkg clean (처음 컴파일시 생략가능)

  # make-kpkg --initrd --revision=love01 kernel_image modules_image kernel_headers


clean / compile (make 컴파일할 경우)

  # make distclean (처음 컴파일시 생략가능)

  # make -j8  ( -j 옵션을 사용해 cpu 사용률을 높여 빠른 시간에 컴파일을 진행할 있다.)


make -j 옵션 관련 포스팅 자료 (컴파일 속도 최적화)



make의 -j 옵션은 한번에 수행할수 있는 명령(Job)을 지정하는 패럴렐옵션입니다.
예를 들어, CPU코어가 4개이라면, 한번에 수행할수 있는 명령을 -j 4으로 지정하여 
프로세스가 4개가 생성되어 병령으로 수행합니다. 명령수는 프로세스수로 정의됩니다.

이렇게 하여 소스를 컴파일시 4개 CPU의 Utilization을 최대한 모두 소모하는 것을
top명령(실행후 숫자1번 키누르세요.)으로 확인할 수 있습니다. 고가CPU 본전 뽑아야겠습니다.

필자의 실험에서는 Intel Core2 Quad 9400(2.5Ghz) 컴퓨터에서 위의 명령을 시험하였습니다. 
2.6.31커널소스를 컴파일한 결과,
평균적으로 "make -j 4"가 "make" 명령보다 2배정도 속도가 빨랐습니다.

커널개발자는 소스를 컴파일할때  make를 애용합니다.
멀티코어에서는 컴파일 속도를 위해서 "-j"옵션을 이용하여 
해당 갯수만큼의 프로세스들을 생성하고, 
프로세스들은 다시 필요에 따라 N개의 쓰레드를 생성하여 컴파일을 병렬로 수행합니다.

make개발자에 의하면 총코어갯수에서 20%의 코어갯수를 추가하는 것이 가장 속도가 좋게
작업되었다고 합니다. 따라서,   -j <숫자> = 총CPU갯수 + round( 총CPU갯수*20%) 입니다.
풀이하면, CPU가 4개이면 20%가 코어 0.8개가 되므로,
반올림해서 4+1 => -j 5가 가장 이상적인 컴파일 속도 결과가 됩니다.

그래서, 일반적으로 커널소스 컴파일시에는
간단히 #> make -j `cat /proc/cpuinfo | grep cores | wc -l ` bzImage 하는 것이 올바릅니다.

최상의 속도를 위해서는 필자처럼 아래와 같이 스크립트를 작성할수 있습니다.
invain#> vi buildsource.sh
 #!/bin/bash
# created by invain for the best performance when compiling kernel source.
realnum=`cat /proc/cpuinfo | grep cores | wc -l `
let bestnum=$realnum+$(printf %.0f `echo "$realnum*0.2"|bc`)
make -j `echo $bestnum` bzImage


아래는 코어4개(쿼드 코어)에서 안드로이드 1.6 전체소스를 컴파일시의 소요 시간 결과입니다.
 -j4   : 19분 10초
 -j5   : 18분 52초 <--- 소스 컴파일 속도가 가장 좋음.
 -j8   : 19분 15초
 -j64 :  19분 54초

Posted by cyj4369
,