본문 바로가기
linux

커널 소스 컴파일

by 상레알 2010. 6. 1.

[출처] http://ggblog123.blogspot.com/2009/10/cent-os.html

[출처] http://smgs2848.blogspot.com/2008/04/kernel-compile-httphanaduri.html

 

CentOS 54, 커널컴파일,

- 먼저 CentOS용 커널컴파일도구를 다운받는다.

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

 

# yum install gcc

# yum install ncurses-devel

# yum install rpm-build

# yum install bison

 

위에 4개가 설치가 안되면 오류가 나지만 이거에 대한 오류는 이 문서에 추가하였음

 

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

전체적인 흐름...

make mrproper -* /make xconfig -* make dep;make clean -* //make zlilo

|make menuconfig| |make bzlilo/

make config / |/make zImage

\make bzImage/

-* make modules

-* lilo 설정

-* make install -* lilo 설정

-* make modules_install

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

 

Setp 1) 커널소스를 다운받고, 압축을 푼다.

 

# cd /usr/src

 

# wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.32-rc5.tar...

 

/usr/src/ # tar xvjf linux-2.6.32-rc5.tar.bz2

 

/usr/src/ # ln -s linux-2.6.32-rc5 linux

 

Step 2) 메뉴구성및 청소,

 

cd /usr/src/linux

 

/usr/src/linux/ # make clean

 

/usr/src/linux/ # make mrproper

 

- 커널 컴파일과 관련해서 여러 가지 문제가 발생할 수 있는 것들을 초기화

그러나 make mrproper를 써야하는 상황이라면 좀 더 커널 성정에 대해 자세히 알아야 한다 커널 설정과 커널 컴파일시 생성되는 파일을 초기화 시켜버릴 것이다. 특히 이것을 수행하게 되면 기존에 커널 설정해 놓은 정보도 모두 날라가 버린다고 한다...하지만 난했음-_-v

 

-->kernel-source 설치가 되어 있지않다면 오류가 난다. yum install kernel...........

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

make target...?! 타겟을 찾을수 없다고..

redhat 계열..

kernel-2.0.xx-x (x는 버전넘버)

kernel-headers-2.0.xx-x

kernel-modules-2.0.xx-x

kernel-source-2.0.xx-x

kernelcfg-0.4-x

등이 설치 되어 있는지 확인 아마 kernel-source 부분의 문제일 것이다.

그럼 kernel-source를 설치하고 하면 된다.

kernel-source를 설치하기 위한 기본적인 다른 것을 설치하다 잘 안될시 몇 가지는

rpm -ivh ~~~ --nodeps (의존성 무시하고 강제로 설치하기)를 사용하였다.

 

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

 

/usr/src/linux/ # make menuconfig

-> make xconfig/menuconfig/config

위 3개난 다 같이 커널 설정을하느것이다.

xconfig

--> make menuconfig 오류!

dialog.h:130: warning: array `attributes' assumed to have one element

make[1]: *** [checklist.o] Error 1

make[1]: Leaving directory `/usr/src/linux-2.4.20-30.9.ppdd/scripts/lxdialog'

make: *** [menuconfig] Error 2

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

make menuconfig 는 ncurses인터페이스로 시작하기ㅤ때문문에

yum -y install ncurses-devel 명령어를 쳐서 ncurses-devel 설치 후

다시 시작하면 실행이 된다.

 

make menuconfig 에 대한 옵션 설명은 맨뒤에 하기로 한다 넘 많아서ㅠ

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

make dep

의존성 검사

 

 

커널 이미지 파일 생성을 위한 컴파일 작업

 

# make bzImage

 

=> 오류 !!!!

gcc: installation problem, cannot exec `tradcpp0': No such file or directory

make[1]: *** [entry.o] Error 1

make[1]: Leaving directory `/usr/src/linux-2.4.20-30.9.ppdd/arch/i386/kernel'

make: *** [_dir_arch/i386/kernel] Error 2

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

 

make dep ; make clean

 

 

그리고, 그다음에 make dep이라는 것은 config 설정이 끝났으면 그것을 실제 컴파일 과정에 들어가게 하기 위해서 여러가지 의존성 설정을 하는 것입니다. 예를 들어 sb(사운드 블레스터 모듈) 이 뜨기 전에 sound라는 모듈이 떠야하고 sound가 뜨기 전에 soundcore가 떠야 한다는 둥의 의존성입니다...이 의존성은 make config 시에 정해 지는 것이구요 make dep이라는 명령으로 실제로 적용시키는 것입니다. 그다음에 make clean은 그냥 찌꺼기를 청소하는 것이라고만 아시면되겠구요

 

make zImage/make bzImage - 택1 난 make bzImage

 

그리고, make zImage가 있고, bzImage기능이 있는데 전자는 말 그대로 커널을 컴파일해서 이미지를 만드는 것입니다 (저는 이 과정이 끝난뒤에 압축이 이루어 이는 것으로 알고 있습니다. 앞에 붙은 'z'가 압축을 의미한 것으로 알고 있습니다. 이것은

/usr/src/linux/arch/i386/Makefile을 살펴 보면 'compressed: zImage'라는 항목으로 확인 할 수 있습니다.) 그리고 후자는 b가 붙는데 커널의 이미지가 일정 크기 이상이 되면

컴파일 방식이 바뀌어야 하는 모양입니다. (여기서 b는 big을 의미하는 거겠죠? ^^;)

그래서 커널 이미지가 큰 경우 이 방식으로 컴파일을 해야 합니다 그러나 제 경험상 커널 컴파일에 대해 좀 노하우가 쌓이게되고 컴파일을 잘하게 되시면 이것은 쓰지 않게 되실겁니다... 그렇다면 어떨때는 make zImage를 쓰고,어떨때는 make bzImage를 쓰는가??? 이것은 make zImage를 수행한뒤에 맨 뒤에 에러메시지에 "make bzImage를 사용하십시요"라고 (물론 영어로) 나온다면 make bzImage로 커널 컴파일을 다시하면 됩니다..

 

make zlilo/make bzlilo

그리고, make zlilo와 make zImage는 별로 차이가 없는 명령입니다.

make zlilo는 lilo사용자를 위한 커널 컴파일 및 설치 명령입니다.

make zImage;make install;lilo 정도의 명령 입니다.

하지만 뒤에서(lilo설정에서)

make zlilo와 make zImage;make install;lilo간의 차이를 설명드리죠

(정확히는 make zlilo는 make zImage뒤에

'mv /vmlinuz /vmlinuz.old;

mv /System.map /System.old;

cat zImage * /vmlinuz;

cp /usr/src/linux/System.map /;

/sbin/lilo;' 를 수행하게 됩니다.)

(참고: make bzlilo라는 것도 있는데, zlilo와 bzlilo의 차이는 zImage와 bzImage의 차이와 같다고 생각됩니다 역시 /usr/src/linux/arch/i386/Makefile을 살펴 보시면 확인할 수 있음)

 

그럼 따로 따로 설명을 해봅시다.

“make bzImage"는 현재 가장 많이 사용하는 커널이미지 생성방법이며 가장 보편적인 작업입니다. ”커널 컴파일 옵션 설정“ 단계에서 기본적인 커널기능만을 설정해도 커널이미지 파일의 크기는 1MB가 넘어갈 수 있습니다. 따라서 이런 경우에 ”make zImage"방법을 사요아시면 거의 대부분 “System is too big" 이라는 컴파일에러가 발생하여 커널이미지파일의 크기가 크다는 에러가 발생하게 됩니다. 이 방법은 "make zImage"방법보다 큰 커널 이미지 파일을 생성할 수 있으므로 이 방법을 사용할 것이다.

“make zImage"는 bzImage를 사용했을 때 보다 더 작은 커널이미지가 필요할 경우에 사용하는 방법입니다. 이 방법을 사용했을 경우에 흔히 ”System is too big" 이라는 에러메시지가 자주 발생하게 되는데 이는 “커널컴파일 옵션설정”단계에서 필요 이상의 커널옵션들이 선택되었을 경우에 발생하며 “커널이미지가 너무 크다”라는 에러메시지입니다.

 

“zdisk"방법은 커널 컴파일수행과 함께 커널 이미지를 플로피 디스크로 복사를 하게 됩니다. 컴파일된 커널이미지를 디스켓으로 복사해 넣은 후에 이 디스켓으로 부팅하여 정상적인 부팅이 가능한가를 확인하 후에 원래의 커널이미지와 교체하기 위한 방법으로 사용되며 보다 안전한 커널컴파일을 위한 방법이라고 할 수 있다.

 

“make zlilo"는 커널이미지를 생성한 후에 생성된 커널이미지를 복사하고 lilo까지 수행하는간편한 방법이라고 이해하면 된다.

위에 설명과 같이 현재 커널 이미지를 생성하는 컴파일 방법에는 몇가지 있지만 위에 말한 드린바 같이 우리는 “make bzImage"라는 방법을 사용하낟. 현재 커널 이미지를 생성하기 위한 방법중 가장 많이 사용되는 방법이다. 단, 자원(CPU, DISKl, MEMORY 등)의 낭비를 줄이고 아주 작은 커널이미지를 원할 경우에는 ”make bzImage"보다는 "make zImage"방법으로 컴파일을 하실 수도 있습니다. 어떤 방법으로 커널 이미지를 생성하느냐는 여러분들의 시스템 상황을 고려하여 선택하시면 됩니다.

 

커널 컴파일이 성공적으로 수행이되면 /usr/src/linux/arch/i386/boot 디렉토리에 bzImage라는 파일이 생성이 되는데 이것이 바로 커널이미지 파일입니다. 이 커널이미지파일(bzImage)을 /boot 디렉토리로 복사를 한 후에 리눅스 로더(Linux Loader) 설정파일 (/etc/grub.conf, 또는 /boot/grubgrub.conf)을 수정하여 부팅할 수 있도록 설정하게 될 것입니다.

 

make install -난 생략

 

그리고 make install인데, 이것은 make zImage나 bzImage 를 통해 생성된 커널 이미지를 설치하는 것입니다. 이 명령에 의해 커널이 설치(install) 되는 곳은 /boot 입니다. 이곳에 vmlinuz-x.x.x-xx형식으로 저장되고, Symbolic link로 vmlinuz -* vmlinuz-x.x.x-xx가 생성됩니다.

 

make modules

 

그 다음에 모듈 컴파일입니다 이 것은 커널에서 사용할 모듈을 컴파일 하는 과정입니다.

(주의:modules에서 's'를 빼먹지 마세요...물론 빼먹으면 컴파일이 안되지만.. ^^;;)

흔히들 이것은 make zlilo다음에 실행한다고 생각하기 쉬운데 make dep;make clean 이후에 실행가능한 것입니다 make modules는 make dep에서 얻어지는 의존성 정보를 가지고

모듈을 컴파일 하는 것이기 때문입니다.

경우에 따라서는 모듈 컴파일 타임이 커널 컴파일 타임보다 길어질 수 있습니다. (일반적으로는 더 길지요... ^^;;)

커널 모듈은 “커널컴파일 옵션설정”단계에서 커널모듈로 선택하였던 기능들에 대한 모듈파일 생성작업을 해야한다는 것입니다. 이 작업은 "make modules"를 실행하면 됩니다. 커널컴파일을 처음하는 사람은 "make bzImage" 명령후에는 모듈파일을 생성해 내기 위하여 반드시 “make modules"를 수행해야 한다고 생각하시면 됩니다. 커널컴파일 전체 과정에서 이 ”make modules"작업 시간이 가장 오래 걸리므로 “make modules"를 실행하신 후에 잠시 쉬시는 것도 좋습니다. 필자의 경우는 약 1시간 sajrp 이 작업이 소요되었습니다. 이 작업은 커널이 사용할 무수히 많은 모듈파일들을 생성해 내는 산고의 고통과 같은 작업입니다. 저는 커널모듈을 컨러 자식들이라 생각하기에 이런 표현을 사용하는대 조금 과장되었지만 정말 오래 쉬길 바랍니다.

여기서 컴파일 후에 생성되는 모듈 파일을 들을 목적파일의 형태로써 뒤에서 작업하게될 “make modules_install" 실행으로 ”lib/modules/커널버전/kernel"디렉토리로 복사하기 위한 파일들입니다. 이렇게 생성된 파일들을 새로 생성된 커널이 사용할 커널모듈파일로서 필요시에 메모리에 적재되어 사용될 수 있도록 하기 위함입니다.

 

make modules_install

 

make modules_install은 짐작하시는 바와 같이 컴파일 완료된 모듈들을 설치(!)하는 것입니다 (주의:여기서도 modules_install에서 's'를 빼먹지 마세요..)

그러나 이 과정에서 기존에 있던 모듈을 삭제하지 않고 그냥 그 위에 덮어쓰기 하기 때문에 종종 문제가 됩니다 그래서 make modules_install 이전에 /lib/modules/x.x.x-xx

디렉토리를 삭제해 주셔야 합니다. 여기서 x.x.x-xx는 커널의 버전을 의미합니다.

이 숫자는 /usr/src/linux 가 링크된 디렉토리명에서 확인할 수 있습니다.

예를 들어 ls -l /usr/src/linux 했을때 'linux -* linux-2.2.10'이면 /lib/modules에도 2.2.10으로 디렉토리가 생기는 것이죠. (정리하면 모듈 컴파일및 설치는 아래와 같이 하시면 되겠죠.. 'make modules;rm -fr /lib/modules/x.x.x-xx;make modules_install')

 

make install

  이것을 하면 수동으로 해야하는 많은 작업들을 자동으로 해준다.

lilo설정

 

이 부분은 lilo사용자에 한하는 부분인데요. 우선 make zlilo(또은 bzlilo)를 사용하신 경우와 make zImage;make install

하신 경우가 다릅니다. 뭐가 다르냐면, 전자의 경우 커널 이미지가 /vmlinuz에 설치가 되고요 후자의 경우는 커널의 이미지가 /boot/vmlinuz에 설치가 되기 때문입니다

lilo설정화일(보통은 /etc/lilo.conf)을 보시면 아래와 같은 항목이 있는데,

 

image=/boot/vmlinuz

label=linux

root=/dev/hda8

read-only

 

여기서 zlilo를 사용하셨다면 'image=/vmlinuz'라고 하셔야 하고요

zImage와 install을 사용하셨다면 'image='/boot/vmlinuz'라고 하셔야 합니다

저 같은 경우는 그냥 귀찮아서 위와 같이 설정하고요.

make zImage방식으로 컴파일 할때는 'make zImage;make install'

이라고 하고요 make zlilo의 방식으로 컴파일 할때는

'make zlilo;make install' 이라고 합니다 ^^;;;;;

즉 'make zlilo;make install'이라고 하면 커널 이미지가 /vmlinuz와 /boot/vmlinuz 모두에 설치가 되는 겁니다 ^^;;;;;;

 

물론 lilo설정뒤에 프롬프트 상에서 'lilo'라고 한번 실행시켜주셔야합니다

 

!!주의 사항!!

 

그리고 주의 사항(!!)은 위의 모든 과정은 리눅스 소스가 설치된상태에서 해야 한다는 것(1)과 /usr/src/linux에서 해야 한다는 것(2)입니다 그리고, 커널 컴파일과 모듈 컴파일 중간에 실행을 중단하지 마십시요(3). 정말이지 잘못 했다가는 커널 컴파일이 아에 안되버리는 수가 생깁니다 소스에 손상이 가는 경우가 있나봅니다...

 

!!확인!!

그리고, 끝으로 커널이 잘 설치 되었는지 확인하기 위해서 ls -l /boot 를 확인해 보시기 바랍니다. /boot/vmlinuz과 이것이 링크된 파일이요..... 날짜와 시간이 지금이 맞는지...

그러면 설치가 되었음을 확인할 수 있구요

 

!!에러 확인!!

 

그리고 참고로 커널이나 모듈을 컴파일 할때 에러가 나는 경우가 있는데 이것은 어떻게 확인하냐믄요.. make zlilo나 make zImage 또는 bzImage 실행이 끝난뒤를 살펴 보시면 ***ERROR 뭐 이런식으로 눈에 뜨이게 표현됩니다... 그러니 이 메시지를 놓치지 않기 위해서라도 커널 컴파일시에

# make dep;make clean;make zlilo;make modules;make modules_install;make instal

l;reboot

이런식으로 일사천리로 쓰시면 안되겠지요..(물론 순서는 위의 것이 맞습니다 ^^)

저 같은 경우는 우선

# cd /usr/src/linux;make xconfig

# make dep;make clean

하구나서요

# make zlilo

를 실행시킴과 동시에 창 하나를 더 뛰워서

# make modules 를 실행시키고 어디 딴데가서 책 좀 보다 옵니다 ^^

그러고 나면 두경우에 에러가 났는지 안났는지 확인할 수 있지요..

그렇게 확인이 되었으면

# make modules_install;make install;reboot

를 합니다...

(참고: at now 라는 명령을 쓰면 컴파일 과정이 고스란히 저장이 되어서

메일로 저장됩니다만... 본 글과는 좀 거리가 있는 내용이라 생략합니다

다른 분의 글을 참고 하세요...)

 

!!리부팅~!!

 

 

그리고 리부팅 시키면 커널의 압축이 풀리고 커널이 로딩 됩니다 그 뒤에 모듈이 로딩 되기 전에요 "Finding modules dependance..." 를 하지요 앞에서 말씀 드린 모듈들의 의존성 정보를 작성하고요

(depmod -a라는 명령입니다)

그 의존성 정보를 (화일은 /lib/modules/x.x.x-xx/modules.dep) 파일에 업데이트를 수행합니다 혹시 여기서 에러가 발생한다면. 커널과 모듈 설치 하시고 그냥 리부팅 하지 마시고요

직접 아래와 같이 해보세요

# cd /lib/modules/x.x.x-xx

# depmod -a

라고 해보세요...

여기서 에러가 안나면 저처럼 나옵니다

[ root@mind 2.2.10]# pwd

/lib/modules/2.2.10

[ root@mind 2.2.10]# depmod -a

[ root@mind 2.2.10]#

 

에러나 가면 커널 설정을(make xconfig에서요..) 다시......

------

위 글은 커널 2.4 의 경우이다. 2.6 버전도 크게 문제는 없겟으나...

2.6 버전에서는  make dep / make clean/ make bzImage / make moudules 를  통합하여 make 로 되어 있다.

make 이후에 make modules_install     

initrd

# cd /usr/src/linux/arch/i386
# mkinitrd /boot/initrd-2.6.15.7.img 2.6.15.7
(/boot 디렉토리에 initrd 이미지 생성)



부팅 환경 설정

<grub 부트로더>
# cd /usr/src/linux/
# cp ./arch/i386/boot/bzImage /boot/vmlinuz-2.6.20.10
# cp System.map /boot/System.map-2.6.20.10
( /boot 디렉토리에 부팅에 필요한 이미지와 파일 준비)

# cd /boot
# vi grub/grub.conf

    root (hd0,1)
    kernel /boot/vmlinuz-2.6.20.10 ro root=LABEL=/
    initrd /boot/initrd-2.6.20.10.img

'linux' 카테고리의 다른 글

모듈의 상호참조  (0) 2010.06.03
모듈에 대해 알아야 할것들  (0) 2010.06.03
Hello 커널 모듈 작성 예제  (0) 2010.06.02
모듈 개발.  (0) 2010.06.01
운영체제 커널 분류에대해...  (0) 2010.06.01
/usr/lib/python2.4/site-packages/_sqlitecache.so: undefined symbol: g_assert_warning  (0) 2010.04.22
Git 1.6.1 설치  (0) 2010.04.22
AttributeError: CHECKSUM_VALUE  (0) 2010.04.22
gtk 설치 중 오류  (0) 2010.04.20
GTK - GUI - GLADE 튜토리얼  (0) 2010.04.20