커널 컴파일

이 글은 커널 컴파일을 하는데 있어서 옵션과 그 방법들에 대한 글입니다.

먼저 최신 커널을 다운받는다.

2011.1.13일자 최신 커널  stable  버전은 2.6.37 이며

git 주소 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 에서 다운 받을수 있다.


git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

시간이 많이 걸릴수 있으므로 알아서 준비하자.


먼저 eabi 컴파일이 가능한 컴파일러를 하나 준비한다.

환경변수에   ARCH 와 CROSS_COMPILE 을 잡아 놓으면 매우 편하다.

export CROSS_COMPILE=arm-none-eabi- ARCH=arm



일단 README  라는 파일이 있다.
괞히 있는 것이 아니라 친절한 설명을 해 놓은 것으므로 항상 읽어주는 센스를 발휘하자.


여기에는 다운받은 커널이 압축파일일 경우 압축을 푸는 방법을  tar.gz  / bz2  파일 모두 설명해 준다.

 65         gzip -cd linux-2.6.XX.tar.gz | tar xvf -
 66 
 67    or
 68         bzip2 -dc linux-2.6.XX.tar.bz2 | tar xvf -
 
 패치하는 방법도 같이 설명해 준다.
 
 83         gzip -cd ../patch-2.6.xx.gz | patch -p1
 84 
 85    or
 86         bzip2 -dc ../patch-2.6.xx.bz2 | patch -p1

알겠지만 --dry-run 이 무슨 옵션인지 위와 같은 패치 작업을 할때는 아는 것이 중요하다.

이 옵션은 실제 파일에 적용은 하지 않고 실행 결과를 프린트해준다.

무언가 중요한 잘못을 저질렀을때 파일을 복구하는 방법도 있지만 귀찮은 일을 하지 않게 예방해주고

결행을 할것인지 말것인지 판단하게 해준다.

 
 
 자 이제 커널 빌드를 해 본다.
 많이 해본신 분들은 잘 아시겠지만 커널 빌드시에 생기는 오브젝트 파일들은 VI 로 작업시나  grep   신공시에
 시간을 많이 걸리게 합니다.
 
 그래서 그런 귀찮은 파일들은 한군데로 보내 버리는 옵션이 있습니다.
 
  output dir 의 위치를 지정하는 것이죠
  
 바닐라 커널을 방금 다운 받은 상태에서 아래와 같이 진행합니다.
 
 현재의 정보를 확인합니다.

root@boggle70-desktop:linux-2.6# du ./
1174160 ./
약 1.2 G 정도입니다.

root@boggle70-desktop:linux-2.6# git status
# On branch master
nothing to commit (working directory clean)
root@boggle70-desktop:linux-2.6# 


이제 설정과 컴파일을 진행해 봅니다.
대신 출력 디렉토리를 지정하는 옵션을 주고 진행합니다.
 
 root@boggle70-desktop:linux-2.6# make O=../s5pv210/ s5pv210_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  GEN     /work/kernel/temp/build/Makefile
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
root@boggle70-desktop:linux-2.6# make O=../s5pv210/ zImage

컴파일이 끝났습니다.

 
이제 다시 현재 디렉토리의 정보를 보겠습니다.

root@boggle70-desktop:linux-2.6# du ./
1174160 ./

그대로군요

root@boggle70-desktop:linux-2.6# git status
# On branch master
nothing to commit (working directory clean)
root@boggle70-desktop:linux-2.6#

네... 수정되거나 추가된 파일이 전혀 없습니다.

 root@boggle70-desktop:linux-2.6# make O=../build/ menuconfig
 
 을 통해서 수정을 해도 역시 동일합니다.
 
 
 이제 의문이 생깁니다.
 현재 상태에서 다른 디렉토리에 다른 타겟으로 컴파일이 가능할까?
 
 한번 시도해 보니다.
 
 s5p64x0_defconfig  을 컴파일 해 봅니다.
 
 
root@boggle70-desktop:linux-2.6# make O=../s3c6410 s5p64x0_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  GEN     /work/kernel/ttt/s3c6410/Makefile
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
root@boggle70-desktop:linux-2.6# make O=../s3c6410 menuconfig
  GEN     /work/kernel/ttt/s3c6410/Makefile
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTCC  scripts/kconfig/mconf.o
  HOSTLD  scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig


*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.

root@boggle70-desktop:linux-2.6# make O=../s3c6410 zImage
 
 
 
 컴파일은 완료되었고 현재 디렉토리 상태를 확인합니다.
 
 root@boggle70-desktop:linux-2.6# du ./
1174160 ./
root@boggle70-desktop:linux-2.6# git status
# On branch master
nothing to commit (working directory clean)
root@boggle70-desktop:linux-2.6#
 
 
여전히 현재의 디렉토리에는 전혀 변화한 것이 없습니다.
커널 소스는 아주 깨끗하게 관리가 되며 빌드디렉토리를 따로 두어 관리할수 있습니다. 
 
 마지막으로 커널 빌드시에 -j 옵션을 주면 단일 컴파일이 아닌 병렬  컴파일을 
 진행하게 해준다.
 
root@boggle70-desktop:linux-2.6# make O=../s3c6410 zImage -j 4   와 같이 해주면 된다.
-j 뒤의 숫자는 자신의 cpu core 갯수와 비슷하게 하면 됩니다.

혹스 2.6.x  이전의 2.4.x 버전의 컴파일 모습을 보고 싶다면 ( 좀더 많은 경로와 정보가 표시되는)
V=1 을 사용하면 됩니다.

root@boggle70-desktop:linux-2.6# make O=../s3c6410 -j 4 zImage V=1