IT Japan

커널 컴파일 과정 본문

카테고리 없음

커널 컴파일 과정

swhwang 2016. 4. 10. 23:46
반응형

많은 분들이 커널 컴파일 방법을 그냥 한줄로 줄줄이 외워버리고 마는것 같습니다.

예를 들어

'cd /usr/src/linux;make mrproper;make xconfig'

'make dep;make clean;make zlilo;make modules;make modules_install; make install;reboot'

라고 쳐 넣고 커널 컴파일이 끝나기를 기다리곤 하지요...

하지만 각각이 뭘 의미 하는 건지 잘 모르고 그냥 줄줄이 외우고 있기만하신것 같더라구요...

그래서 제가 제 나름대로 각각의 설명을 해 보려고 합니다...

 

우선 그림(?)을 그려보면 이렇습니다

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

입니다. (그림이 좀 복잡하지요? ^^;;)

 

make mrproper

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

그러나, make mrproper는 저는 개인적으로 하지 마시기 바랍니다 ^^이걸 써야 하는 상황이라면 좀 더 커널 설정에 대해 자세히 아셔야 합니다커널 설정과 커널 컴파일시 생성되는 대부분의 화일을 초기화 시켜 버리는것입니다...

특히, 이것을 수행하게 되면,기존에 커널 설정해 놓은 정보도 모두 날라가 버리거든요....

 

make xconfig/menuconfig/config

그리고 xconfig는 아시겠지만 X에서 커널 설정을 하게 해주는 것이구요menuconfigncurses라는 라이브러리가 설치되어있고 X를 사용하지않고 설정을 할때 쓰는 방식이구요.

configXncurse도 없다 할때 쓰시면 됩니다...

세가지의 기능상 차이는 없고 그냥 사용자에게 보여지는 인터페이스가조금씩 다르지요...

이 글에서는 각 설정에 대해 말씀 드리지 않겠습니다

넘 길걸랑요.. 다른 자료를 찾아 오시구요. 그리고 자신의 하드웨어사양에 대해 자세히 아셔야 합니다

 

make dep;make clean

그리고, 그다음에 make dep이라는 것은 config 설정이 끝났으면그것을 실제 컴파일 과정에 들어가게 하기 위해서 여러가지 의존성 설정을하는 것입니다. 예를 들어

sb(사운드 블레스터 모듈) 이 뜨기 전에 sound라는 모듈이 떠야하고sound가 뜨기 전에 soundcore가 떠야 한다는 둥의 의존성입니다...

이 의존성은 make config 시에 정해 지는 것이구요 make dep이라는명령으로 실제로 적용시키는 것입니다

그다음에 make clean은 그냥 찌꺼기를 청소하는 것이라고만 아시면되겠구요

make zImage/make bzImage

그리고, make zImage가 있고, bzImage기능이 있는데

전자는 말 그대로 커널을 컴파일해서 이미지를 만드는 것입니다(저는 이 과정이 끝난뒤에 압축이 이루어 이는 것으로 알고 있습니다.

앞에 붙은 'z'가 압축을 의미한 것으로 알고 있습니다 이것은 /usr/src/linux/arch/i386/Makefile을 살펴 보면 'compressed: zImage'라는 항목으로 확인 할 수 있습니다.)그리고 후자는 b가 붙는데 커널의 이미지가 일정 크기 이상이 되면컴파일 방식이 바뀌어야 하는 모양입니다.

(여기서 bbig을 의미하는 거겠죠? ^^;)

그래서 커널 이미지가 큰 경우 이 방식으로 컴파일을 해야 합니다그러나 제 경험상 커널 컴파일에 대해 좀 노하우가 쌓이게되고컴파일을 잘하게 되시면 이것은 쓰지 않게 되실겁니다...

그렇다면 어떨때는 make zImage를 쓰고,어떨때는 make bzImage를 쓰는가???

이것은 make zImage를 수행한뒤에

맨 뒤에 에러메시지에 "make bzImage를 사용하십시요"라고 (물론 영어로)나온다면 make bzImage로 커널 컴파일을 다시하면 됩니다..

 

make zlilo/make bzlilo

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

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

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

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

make zlilomake zImage;make install;lilo간의 차이를 설명드리죠(정확히는 make zlilomake zImage뒤에

'mv /vmlinuz /vmlinuz.old;

mv /System.map /System.old;

cat zImage > /vmlinuz;

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

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

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

make install

그리고 make install인데, 이것은 make zImagebzImage 를 통해생성된 커널 이미지를 설치하는 것입니다.

이 명령에 의해 커널이 설치(install) 되는 곳은

/boot 입니다. 이곳에 vmlinuz-x.x.x-xx형식으로 저장되고,Symbolic linkvmlinuz -> vmlinuz-x.x.x-xx가 생성됩니다.

 

make modules

그 다음에 모듈 컴파일입니다

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

(주의:modules에서 's'를 빼먹지 마세요...

물론 빼먹으면 컴파일이 안되지만.. ^^;;)

흔히들 이것은 make zlilo다음에 실행한다고 생각하기 쉬운데make dep;make clean 이후에 실행가능한 것입니다

make modulesmake dep에서 얻어지는 의존성 정보를 가지고모듈을 컴파일 하는 것이기 때문입니다.

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

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')

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'라고 하셔야 하고요zImageinstall을 사용하셨다면

'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 zlilomake zImage 또는 bzImage실행이 끝난뒤를 살펴 보시면 ***ERROR 뭐 이런식으로 눈에 뜨이게표현됩니다...

그러니 이 메시지를 놓치지 않기 위해서라도

커널 컴파일시에

# make dep;make clean;make zlilo;make modules;make modules_install;make install;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에서요..) 다시 잘 해보시기 바랍니다이부분은 커널 설정과 모듈 관련 부분이므로 이 글에서는 생략합니다.

 

~~ 이제야 끝났군요...

저는 리눅스를 참 많이 다뤄 봤는데요, 제가 리눅스 다룬 시간의 절반 이상이이 커널 컴파일과의 시간이었습니다.

정말 알면 쉬울(?)지 몰라도, 모르면 정말 답답하지요...

예전에 커널을 직접 컴파일 해서 사용한다는 사실 자체가 놀라울때는'make dep;make clean.....'

하는 것이 꼭 무슨 주문 같더군요 ^^;;

그게 뭐하는 건지 궁금했는데,시원하게 설명해 주는 글을 본적이 없었습니다...

완전히 저는 몸으로 삽질반 노가다반으로 스스로 익혀 버렸는데흑흑.... 시간 아까버.. T.T

그때 누가 그런것좀 안 가르쳐주나.. 하고 기다렸는데

이렇게 제가 적게 될줄이야... ^^

 

커널 컴파일 잘하면 자신의 하드웨어 성능의 100%이상의 성능을 기대할 수있습니다. 다들 커널 컴파일에 성공하시기 바랍니다...

 

from 커널 컴파일 200회에 도전하는 리눅서 '쌀밥'... -_-;;

PS : 이 문서에 수정되어야 할 부분이 있으면 연락 주십시요...

PS : 개인적인 질문 메일은 사절입니다.

PS : 본 문서가 수정될때, 제목에 수정된 횟수를 적겠습니다.

반응형
Comments