커널 컴파일

한국 데비안 사용자 모임
둘러보기로 가기 검색하러 가기
제목 : 커널 컴파일
난이도 : 중급
작성자 : redneval
라이선스 : GFDL
처음 작성일자 : 2009년 6월


목적

데비안에서 리눅스 커널을 컴파일하는 방법에 대해서 알아봅니다.


사전준비

최신 커널 설치

먼저 sid 저장소를 추가해줍시다. 다음 명령어로 /etc/apt/sources.list 파일을 열어서,

sudo gedit /etc/apt/sources.list

다음을 추가해줍니다.

deb http://http.us.debian.org/debian sid main contrib non-free

이제 sid 저장소에 있는 커널을 설치해줍시다.

sudo apt-get update
sudo apt-get install linux-image-2.6-686

현재(2009년 6월)는 linux-image-2.6.29-2-686 꾸러미가 설치됩니다.

어떤 버전의 커널이 설치될지는 sid 저장소에 어떠한 버전의 커널이 있느냐에 따라 다릅니다.


꾸러미 이름의 2.6.29 는 커널 버전을 의미합니다.

2 는 (리눅스 커널의 꾸러미를 관리하고 있는) Debian Kernel Team 이 두번째로 업데이트한 것라는 것을 나타내고,

686은 컴퓨터 종류(Architecture)를 나타냅니다. 참고로, 대부분의 PC 는 686 에 해당됩니다.


이제부터 일반화된 설명을 하기 위해서, 커널 버전은 2.[X].[Y] 라고 나타내고, 업데이트 번호는 [Z] 라고 나타내겠습니다.

그러므로, linux-image-2.6.29-2-686 는 이제 linux-image-2.[X].[Y]-[Z]-686 이라고 나타내는 식입니다.

앞으로의 설명에서 나오는 모든 [X], [Y], [Z] 는 해당되는 숫자로 바꿔서 이해해야합니다.


커널 설치가 끝났으면 재부팅해봅시다.

sudo reboot


부팅시에 커널 선택 화면(Grub)이 나타나는데,

방금 설치한 `Debian GNU/Linux, kernel 2.[X].[Y]-[Z]-686' 를 선택하여 부팅합니다.


설치 확인

먼저 부팅이 잘 되었나 확인합니다.

이제 uname -r 명령어로 현재 사용 중인 커널의 버전을 확인해봅시다.

redneval@Horus:~$ uname -r
2.[X].[Y]-[Z]-686


부팅 과정에서 중요한 파일들은 /boot 에 위치합니다.

redneval@Horus:~$ ls /boot | grep 2\.[X]\.[Y]
System.map-2.[X].[Y]-[Z]-686
config-2.[X].[Y]-[Z]-686
initrd.img-2.[X].[Y]-[Z]-686
vmlinuz-2.[X].[Y]-[Z]-686

네 개의 파일이 있는지 확인하면 됩니다.

이 중에서 config-2.[X].[Y]-[Z]-686 은 커널 컴파일 옵션이 저장된 파일입니다.

뒤에서 커널을 컴파일할 때 사용할 것입니다.


커널 선택 화면(Grub)의 설정 파일인 /boot/grub/menu.lst 도 구경해봅시다.

redneval@Horus:~$ cat /boot/grub/menu.lst | grep Debian
title		Debian GNU/Linux, kernel 2.[X].[Y]-[Z]-686
title		Debian GNU/Linux, kernel 2.[X].[Y]-[Z]-686 (single-user mode)


기타 필요한 꾸러미 설치

커널을 컴파일하기 위해서 필요한 몇 가지 꾸러미를 설치합니다.

sudo apt-get build-dep linux-2.[X]
sudo apt-get install build-essential fakeroot procps


커널 컴파일 준비

커널 컴파일하기 위한 작업용 디렉터리를 새로 만들고, 그 곳으로 이동합시다.

예를 들면, 다음과 같이 합니다.

mkdir ~/kernel-compile
cd ~/kernel-compile


이번에는 커널의 소스 코드를 받습니다.

sudo apt-get install linux-source-2.[X].[Y]
cp /usr/src/linux-source-2.[X].[Y].tar.bz2  .
tar xvfj linux-source-2.[X].[Y].tar.bz2
cd linux-source-2.[X].[Y]


< 참고 (선택사항) >

만약 컴퓨터의 CPU의 코어가 여러 개라면 다음과 같은 설정을 하는 것이 유리할 수 있습니다.

하지만 커널 컴파일 경험이 없는 사용자라면 이 부분은 그냥 넘어가는 것이 좋습니다.

어쨌거나 설정하기 위해서는, /etc/kernel-pkg.conf 에 다음 한 줄을 추가합니다. (참고 : man kernel-pkg.conf)

CONCURRENCY_LEVEL = 2

듀얼코어라면 2 로 하고, 쿼드코어라면 4 로 설정하면 됩니다.


커널 컴파일 옵션 설정 준비

kernel 2.[X].[Y]-[Z]-686 의 커널 컴파일 옵션 파일을 복사해옵시다.

cp /boot/config-2.[X].[Y]-[Z]-686 .config

그 다음은 커널 컴파일 옵션 설정하는 단계입니다.

커널 컴파일 옵션을 설정하기 위한 방법에는 make xconfig 와 make menuconfig 가 있습니다.

명령어 의존성을 해결하기 위한 명령어
make xconfig sudo apt-get install libqt3-mt-dev
make menuconfig sudo apt-get install ncurses-dev


둘 중에서 make xconfig 를 사용할 것을 추천합니다.

그러므로 libqt3-mt-dev 꾸러미가 설치안되었다면 다음과 같이 설치해주고,

sudo apt-get install libqt3-mt-dev

make xconfig 명령어를 실행하여 커널 컴파일 옵션 설정 프로그램을 실행합니다.

make xconfig


커널 컴파일 옵션 설정하기

이 부분이 가장 중요한 단계입니다.

이 단계에서 커널 컴파일 옵션을 잘못 설정하게 되면, 부팅이 안되거나 기능이 잘 동작하지 않는 커널이 생성될 수도 있습니다.

그러므로 잘 모르겠으면 옵션을 건드리지 않고 그냥 넘어가도록 합시다.


컴파일 및 꾸러미 생성

설정이 끝났으면 이제 컴파일하는 단계입니다.

데비안에서는 커널 꾸러미를 자동으로 생성해주는 make-kpkg 라는 프로그램이 있습니다.

(참고로, make-kpkg 는 kernel-package 꾸러미에 포함돼있습니다.)

다음 명령어를 입력하면 됩니다. 참고로 컴퓨터의 사양에 따라 1시간이상 걸리기도 합니다.

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom --revision=1.0 kernel_image kernel_headers

--append-to-version 옵션을 주면 꾸러미의 이름을 약간 바꿀 수 있고,

--revision 옵션으로 꾸러미의 버전을 바꿀 수 있습니다.

위와 같이 하면 linux-image-2.[X].[Y]-custom 과 linux-headers-2.[X].[Y]-custom 의 두 개의 꾸러미가 생성되며 꾸러미의 버전은 1.0 이 됩니다.


설치 및 확인

이제 생성된 꾸러미를 설치합니다.

cd ..
sudo dpkg -i linux-image-2.[X].[Y]-custom_1.0_i386.deb linux-headers-2.[X].[Y]-custom_1.0_i386.deb

재부팅하여 커널이 잘 동작하는지 확인합시다.

커널 버전도 확인해봅시다.

redneval@Horus:~$ uname -r
2.[X].[Y]-[Z]-custom


마무리

맨 처음에 추가해줬던 sid 저장소를 빼주는 것도 잊지 맙시다. /etc/apt/sources.list 를 열어서,

sudo gedit /etc/apt/sources.list

다음 부분은 지워줍시다.

deb http://ftp.us.debian.org/debian/ sid main