데비안에서 커널 컴파일을 하는 방법에 대해서 기술하고 있다. 현재 커널의 버전은 2.6.x 를 넘어서 달려가고 있다.
2.2 대 커널을 사용한지가 엊그게 같은데, 커널 버전을 보면서 시간이 빠르다는 것을 실감한다. 2.2 → 2.4 → 2.6 각각의 커널 버전대가 바뀌면서 달라진 것들이 많이 있지만, 나 같은 End 유저들은 피부에 와 닿지 않는다.
그중에 가장 피부에 와 닿는 것이 있다면, 바로 커널 컴파일하는 명령어이다. 필자의 기억에 2.2 와 2.4 에서는 명령어가 동일했다. 하지만 2.6 에 들어오면서 달라졌다. 기존의 End 유저들에게는 조금은 피곤한(?) 일이 되었지만, 실상 알고 보면 End 유저들을 위해서 좀더 다양한 옵션들일 추가 되었음을 알 수 있다.
예전만 해도, 커널 컴파일이라는 것은 왠만큼 리눅스에 대해서 아는 사람이 아니면 감히 접근할 수 없는 그 무엇이었다. 2000년도만 해도, '나 커널 컴파일 해봤어!' 라고 하면 왠지모를 뿌듯함 같은 것이 있었다. 하지만, 지금은 약간의 거짓말을 보태서 초등학생도 할 수 있는 정도까지 왔다. 그만큼 리눅스가 쉬워지고, 사용자 편의성을 고려했기 때문이다.
각 배포판들을 보면, 좀 더 구체적으로 알 수 있다.
아마도 국내에서 가장 많은 점유율을 가지고 있는 대표적인 배포판이다. up2date 라는 서비스 데몬을 통해서 마우스 클릭만으로 커널 컴파일이 가능하다.
데비안 계열의 배포판으로서, 개인적으로 윈도우만큼 쉽다고 생각한다. 시냅틱 이라는 독자적인 서비스를 이용해서 역시 마우스 클릭만으로 커널 컴파일이 가능하다.
설치와 사용하기 가장 어려운 배포판으로 정평이 나있는 젠투의 경우는 앞에서 설명한 배포판들보다는 어렵지만, 나름대로는 genkernel 이라는 프로그램을 사용해서 손쉽게 커널 컴파일을 할 수 있도록 도와준다.
데비안 역시, make-kpkg 라는 패키지를 이용해서 손쉽게 커널 컴파일을 할 수 있도록 도와준다.
이 문서의 [데비안에서 커널 컴파일하기] 이기 때문에 데비안에서 make-kpkg 를 이용해서 커널 컴파일 하는 방법을 알아본다. 커널은 배포판의 제한을 받지 않기 때문에, 앞에서 설명한 배포판에서 제공하는 서비스 프로그램들을 사용하지 않아도 컴파일하는데는 아무런 지장이 없다. 단지 여기서는 편리성을 고려했기 때문에 사용하는 것이다.
먼저 make-kpkg 와 libncurses-dev 를 설치해야 한다. libncurses-dev 는 menuconfig 사용시 필요한 라이브러리이다.
#apt-get install kernel-package #apt-get install libncurses
이제 필요한 커널을 다운로드 받는다. http 나 ftp 로 따로 받아도 상관이 없지만, apt-get 을 이용해서 받을 수도 있다.
#apt-cache pkgnames kernel-source // 현재 사용가능한 커널 버전이 출력된다. 이중 선택하면 된다. #apt-get install kernel-source-2.6.8
/usr/src 아래에 다운로드한다. 압축을 풀고 심볼릭 링크를 걸어준다.
#cd /usr/src #tar xzvf kernel-source-2.6.8.tar.gz #ln -s kernel-source-2.6.8 linux
이제 본격적인 커널 컴파일에 들어가자!
#cd /usr/src/linux #make mrproper #make-kpkg clean #cp /boot/config-2.6.8-2-386 /usr/src/linux/.config // 기존의 바닐라 커널의 옵션을 사용한다. #make menuconfig #make-kpkg binary-arch
컴파일이 완료하면, /usr/src 아래에 kernel-headers-2.6.8_i386.deb 와 kernel-image-2.6.8_i386.deb 이 생성되었을 것이다. 이를 설치한다.
#dpkg -i kernel-headers-2.6.8_i386.deb #dpkg -i kernel-image-2.6.8_i386.deb // 이 부분에서 /lib/modules 아래에 모듈들이 복사된다
설치하면, 친절하게도(?) grub.conf 파일에 자동으로 등록된다. 이것으로 끝이 아니다. 이 상태에서 재부팅을 한다면, 반드시 커널 패닉이 발생할 것이다. 문제는 모듈이 제대로 Loading 안되기 때문이다.
#cd /lib/modules/ #mkinitrd -o /boot/initrd-fat-1.0.img 2.6.8-2-386
만일, 여기서 mkinitrd 라는 명령어가 없다는 메세지가 뜬다면,
#apt-get install initrd-tools
위와 같이 설치한다.
실행후에 /boot 아래에 initrd-fat-1.0.img 파일이 생성되었을 것이다.
#file initrd-fat-1.0.img initrd-1.0.img: Linux Compressed ROM File System data, little endian size 4317184 version #2 sorted_dirs CRC 0x5b9c7260, edition 0, 2473 blocks, 310 files
이 파일을 보면 ROM 파일임을 알 수 있다.
#vi /boot/grub/menu.lst
이제 이 파일을 grub 설정파일에 등록시키면 된다.
title Debian GNU/Linux, kernel 2.6.8-2-386 root (hd0,2) kernel /vmlinuz-2.6.8-2-386 root=/dev/hda6 ro vga=0x317 initrd /initrd-1.0.img // 바로 이부분을 추가!! 여기서는 /boot 디렉토리가 / 라는 점에 주의한다 savedefault boot
같은 버전의 커널을 컴파일하다보면, 나중에 혼란이 올수 가 있다
이때에는 각각의 커널이미지와 헤더에 리버전을 주면 나중에 혼란을 막을 수 있다.
#make-kpkg --revision=10.10 binary-arch
같은 커널을 여러번의 컴파일을 통하여, 복수개의 커널이미지와 커널헤더를 생성할 경우 모듈들이 복수의 개가 만들어지지 않는 문제가 있었다. 이런 경우에는 깨끗이 예전에 만든 바이너리 파일들을 다른 곳으로 백업한 후에, 모두 삭제하고 다시 컴파일 하는 방법을 사용했다.