본문 바로가기
Linux

리눅스 커널 바꾸기와 컴파일

by 레이루이 2008. 5. 27.
반응형


커널 바꾸기와 컴파일

 여러분은 도스나 윈도우를 쓰면서 왜 486이나 펜티엄 또는 펜티엄 프로가 다른 능력을 가진 시스템임에도 불구하고 같은 환경을 써야 하는지 의문을 가져 보시지는 않았습니까? 486과 펜티엄 프로가 같은 환경의 운영체제를 쓴다는 것은 합당하지 않습니다. 여기서 커널 컴파일의 의미가 보이는 것입니다.

 커널 컴파일은 커널에 원하는 기능을 부여하고 불필요한 부분을 제거해서 시스템을 자신에게 최적화 되게 만들어 주는 작업입니다. 그러므로 기본적으로자신의 하드웨어에 대해서 기본적인 사항은 알아야 합니다.

그럼 이제부터  커널에 대해 알아보도록 하겠습니다.

이 글의 순서는 다음과 같습니다.

*****************순 서*****************

1. 커널 버젼 번호의 의미
2. 내 리눅스의 커널 버젼 알아보기
3. 커널 받아오기전 잠깐~! 주의사항
4. 커널 바꾸기 (소스 받아오기, 패치화일 받아오기)
5. 커널 컴파일 하기            
  1) 커널 컴파일 준비(링크점검)                      
  2) 커널 설정(Configure)
  3) 커널 컴파일 하기                    
6. 리부팅 하기          
************************************************

1. 커널 버젼의 의미
===================

 커널 버젼은 버젼 번호와 패치 레벨 두가지로 구성되어 있다.

 예를 들어 커널 버젼이 2.0.27 이라면 버젼은 2.0 이며 패치레벨은 27 이다  또한 리눅스 커널 버젼 번호는 독특한 규칙을 갖는데 앞의 예에서 2.0 의 두 부분중 앞에 놓인 2는 주 버젼번호이고, 뒤에 놓인 0은 부버젼 번호라 할 수 있다. 여기서 독특한 의미를 갖는게 두번째 놓인 부버젼 번호이다(예에서 0)  부버젼 번호는 짝수와 홀수로 구분하며 홀수는 개발중인 개발버젼을 의미하고 짝수는 공식적인 안정 버젼을 의미한다. 예를 들자면 2.0.27은 두번째 번호가  짝수이니 안정버젼이며, 2.1.30은 두번째 번호가 홀수이므로 개발버젼이다.
일반적으로 안정 버젼을 사용하는게 좋다.
마지막으로 세번째 번호는 패치 레벨로써, 얼만큼 수정이 되었나를 말해주는 번호이다. 2.0.30은 2.0.0 에서 무려 30번이나 패치가 이루어진 커널인 셈이다

2. 내 리눅스 커널 버젼 알아보기
===============================
부팅시 커널 버젼이 보이지만 커널 버젼을 알아내는 명령은 uname -a 이다.
eun-young:~$ uname -a
   Linux eun-young 2.0.30 #1 Sun Jul 6 05:47:55 KST 1997 i586  


3. 커널 받아오기전 잠깐~! 주의사항
==================================

  만약 지금 자신의 커널이 2.0.0 인데 2.0.27로 커널을 바꾸고 싶다고 가정을 하고 시작하자. 그럼 패치화일 patch-2.0.27.gz 을 받아오면 되느냐.....

 절대 아니다. patch-2.0.27.gz 이라는 패치화일은 2.0.26에서 2.0.27로 커널을 바꿀때만 필요한 화일이다. 왜냐하면 패치화일이라는 것이 바로 인접한 커널 소스간의 차이점만을 지정한 화일이기 때문이다.

  그러므로 2.0.0에서 2.0.27로 커널을 바꾸는 방법엔 두가지가 있을 수 있다 하나는, 완전한 커널 소스인 linux-2.0.27.tar.gz 을 몽땅 가져와 (거의 6메가) 설치하는 것이고...............

 두번째는, patch-2.0.1.gz 에서부터 patch-2.0.2.gz patch-2.0.3.gz...........

 patch-2.0.27.gz 까지 27개의 패치 화일을 몽땅 다 받아다가 차례대로 패치를 하는 방법이다. 즉, 2.0.0에서 2.0.1로 패치후 2.0.1에서 2.0.2 로 패치...

이런 과정을 순서대로 반복하면 되는 것이다.


4. 커널 바꾸기 (소스 받아오기, 패치화일 받아오기)

=================================================

1) 완전한 소스화일 받아오기

  커널을 바꿀려면 우선 소스를 받아오는 일부터 해야 할 것이다. 보통 커널 소스는 linux-2.0.XX.tar.gz 이라는 형식의 길다란 이름을 가지고 있다.

 허나 나우누리나 하이텔 등의 통신망에서는 도스의 파일명 제한으로 tar.gz 이 아닌 tgz 이라는 형식으로 압축되어 올라와 있을 것이다.    

  자.......linux-2.0.27.tgz 이라는커널 소스를 받아왔다..

 그럼 어떻게 설치할 것인가.

우선 이 작업은 /usr/src 에서 이루어 진다. 그러므로 커널 소스를 이  디렉토리로 옮기는게 우선일 것이다.

eun-young:~# mv linux-2.0.27.tgz /usr/src

그리고 이제 /usr/src 로 이동해 예전의 커널이 링크된 것과 커널을 조심스럽게  지우자.

  eun-young:~# cd /usr/src
  eun-young:/usr/src# rm linux
  eun-young:/usr/src# rm -rf linux-2.0.0

  자 이제 압축을 풀자.

  eun-young:/usr/src# tar xvfz linux-2.0.27.tgz

  이렇게 해주면 linux 라는 디렉토리가 생기면서 풀린다


2) 패치화일 받아오기

  위에서 말한 리눅스 커널 소스는 압축이 6메가에 달하며 압축을 풀면 20메가가 넘는 분량이다. 리눅스 커널 개발 속도는 빠르기 때문에 커널을 2.0.27로 바꾸는 순간 Ftp 사이트에는 2.0.28 이 올라와 있는 경우가 있다. 그럼 2.0.27 로 커널을 올린지가 얼마 안 되었는데 또 6메가나 되는 2.0.28 소스를 다시 받아와야 하는가  매번 소스를 받아 커널을 올리는 일은 무의미하다.

 사실 마지박 번호의 변화는 패치래밸만 바뀐 것이므로 소스 전체를 받아다 할  필요 없이 patch-2.0.XX.gz 이라는 형식의 패치 화일만 받아다 패치하면 된다.

 그럼 패치화일을 받아다 2.0.27 이라는 커널에서 2.0.28 로 어떻게 변화시키나?  우선 2.0.28의 패치화일인 patch-2.0.28.gz 을 받아와서 이것을 /usr/src 라는 디렉토리로 이동 시킨다.

eun-young:~# mv patch-2.0.28.gz /usr/src

그리고는 /usr/src 로 이동해 다음과 같이 해준다

eun-young:~# cd /usr/src
eun-young:/usr/src# gzip -cd patch-2.0.28.gz | patch -p0

이렇게 패치를 하는 동안에 예전의 화일은 XX~또는 XXX.orig 라는 이름으로 백업이 되는데 이 화일들을 지우고 싶다면 다음과 같이 한다.

eun-young:/usr/src/linux# find . -name "*.orig" -exec rm -rf {} \;

또한 패치가 실패할 때는 XXX# 또는 XXX.rej 라는 화일들이 생기므로 주의해서 보기 바란다. 이는 대부분 패치 명령이 잘못 되었거나 버전이 맞지 않아서 일 것이다.

 이런것을 일일히 하기 힘들때 좀더 편의성을 추구하기 위해 나온것이 스크립트 이다. 이런 복잡하고 번거로운 과정들은 쉽게 하기 위해 Nick Holloway 라는 사람이 patch-kernel 스크립트를 만들었다. 패치해야 항 화일이 상당히 많은 경우에는 /usr/src/linux/scripts 디렉토리에 패치화일들을 모조리 넣고서 patch-kernel 스크립트를 실행 시키면 자동으로 모든 과정을 해준다.

eun-young:/usr/src/linux/scripts# sh patch-kernel


5. 커널 컴파일 하기
===================

1) 커널 컴파일 준비(링크점검)

커널 컴파일에서 가장 많이 실수하는 부분이 소스를 잘못 설치 했거나 바로 이 링크 점검을 하지 않아서 이다. 커널 소스에 대한 링크는 헤더화일이 있는 /usr/include 에 해 줘야 한다.

다음과 같이 히면 링크가 된다.

eun-young:~# cd /usr/include

eun-young:/usr/include# rm -rf asm linux scsi

eun-young:/usr/include# ln -s /usr/src/linux/include/asm-i386 asm  eun-young:/usr/include# ln -s /usr/src/linux/include/linux linux  eun-young:/usr/include# ln -s /usr/src/linux/include/scsi scsi

  자, 이 다음으로 할 일은 다음과 같이 커널 컴파일은 완전히 깨끗히 하기 위해  오래된 .o 화일과 의존관계 설정을 지워줘야 한다.

eun-young:~# cd /usr/src/linux
eun-young:/usr/src/linux# make mrproper

이제 커널이 깨끗히 설치 되었다.


 2) 커널 설정(Configure)

여기서 부터가 실질적으로 셋팅을 해주는 부분이다.
설정 방법의 대표적인 세가지는 다음과 같다.

# make config
# make menuconfig
# make xconfig

여기서 가장 썰렁한 것이 make config 이고(^^;),  make menuconfig 는 make config 과 마찬가치로 텍스트 기반이나, 커널 설정별로 나눠져 있어 셋팅이 더 수월하다. 그리고 맨 마지막의 make xconfig 는 엑스 윈도우 기반의 설정으로 마우스 클릭으로 설정할 수 있는 초보에게 권하는 설정 법이다.

그럼 여기서 초보에게 적합한 make xconfig 으로 설정을 시작해 보자 커널 컴파일은 위에서와 마찬가지로 /usr/src/linux 에서 이루어 진다.

다음과 같이 해보자.

eun-young:~# cd /usr/src/linux
eun-young:/usr/src/linux# make xconfig

이러면 창이 하나 뜰 것이다.

그 창 버튼을 마우스로 클릭해 가면서 자신에게 맞는 시스템으로 설정을 하는 것이다. 설정에는 Y/M/N 이 있는데 여기서 M 은 모듈로 설정하는 것이다.

세세한 셋팅에 관해서는 각자의 시스템이 다르므로 설명을 생략 하겠다.

여기서 자기 시스템에 대한 하드웨어 지식이 필요한 것이다.


3) 커널 컴파일 하기

설정이 다 됐으면....그걸로 끝난게 아니다.

다음의 과정을 꼭 해줘야 한다.

eun-young:/usr/src/linux# make dep
eun-young:/usr/src/linux# make clean
eun-young:/usr/src/linux# make zlilo <----리로 설정자에게 필요하다.
eun-young:/usr/src/linux# make modules
eun-young:/usr/src/linux# make modules_install

여기서 위와 같이 일일히 해야 하느냐...........아니다.

한줄에 간단히쓸 수 있다. 구분은 ";" 이다. 아래의 예와 위의 내용은 같은  내용이다.

eun-young:/usr/src/linux# make dep ; make clean ; make zlilo ;  make modules ; make modules_install

이러면 시스템에 따라 다르겠지만 몇십분 후 컴파일이 완료된다.

여기서 위의 의미들을 짚고 넘어가겠다.

make zlilo 는 현재 리로가 설치 되어 있을때 간단히 리로의 작업을 자동으로 해주기 위해서 하는 것이며 리부팅시 새로운 커널로 부팅된다.

make zlmage 는 압축커널 이미지를 만들때 사용된다, 또한 부트 디스크를 만들고 싶다면 A: 드라이브에 디스켓을 넣고 make zdisk 라 하면 된다. (루트화일 시스템이나 리로가 없는 부트 디스크) make modules 와 make modules_install 은 커널 셋팅시 M 으로 선택한 부분이 있을시(즉, 모듈로 셋팅한게 있을시) 하는 것이다.


6. 리부팅 하기
===============

자......이제 리부팅을 하면 새로운 커널이 멋지게 뜰 것이다.
커널 컴파일은 직접 부딪혀 바야 안다 ^^;; 얼마나 어려운 것인지...
그리고 README 문서는 리눅스의 길이니 꼬옥 읽어 보도록 한다.

[출처] 한국리눅스유저그룹[LUG] : http://www.lug.or.kr/home/bbs/board.php?bo_table=server&wr_id=21

반응형