최신 커널(3.x)에서의 컴파일 방법에 대해서 다룬다.
커널 컴파일은 리눅스 환경이라면 배포판에 상관없이 동일하게 해볼 수 있다. 참고로 여기서는 데비안(debian)에서의 커널 컴파일을 설명하겠다.
고민거리
커널컴파일의 목적은 자신의 시스템에 최적화된 커널을 만들어 좀 더 쾌적한 컴퓨팅환경을 만드는데 있다. 처음 커널 컴파일을 주저하게 되는 가장 큰 이유는 커널 컴파일을 하다가 발생하는 문제점 때문이다.
커널 옵션들이 워낙에 방대하기 때문에 꼭 필요한 항목들을 조목조목 알고 있으면 상관없겠지만, 나 같은 일반 사용자 같은 경우 처음 설치했을 때와 같은 옵션으로만 컴파일되도 사용하는데 큰 지장은 없다.
여기서는 최대한 안정적이고 간편하게 커널 업데이트 가능한 방법을 중심으로 설명한다.
이미 설치된 커널 옵션 확인하기
커널 컴파일이라는 것은 어찌보면, 매운 간단할 수도 매우 어려울 수도 있다. 커널 옵션만 하더라도 수 없이 많고 이 중에 실제 나에게 필요한 옵션을 선택하는 것도 쉽지 않은 일이다. 그래서 가장 보편적으로 사용되는 커널 옵션을 지정하여 컴파일하도록 한다.
일반적으로 맨처음 리눅스를 설치할 때 복사되는 커널이 가장 보편적이라고 할 수 있겠다. 설치되는 PC 의 모든 사양을 커버해야하기 때문이다. 그래서 이 커널이 컴파일되었을 당시의 설정 파일을 가지고 컴파일을 시작한다.
데비안의 경우, /boot 디렉토리에 보면, 'config-' 으로 시작하는 파일들이 있다. 이 파일이 앞서 말한 커널 설정을 담고 있는 파일이다.
앞으로 컴파일할 커널의 옵션의 기준은 바로 이 파일로 할 것이다. 참고로 현재 설치된 데비안 6.0 의 경우, 기본적으로 2.6.32-5-686 의 커널 버전을 사용한다.
# uname -a Linux fat81 2.6.32-5-686 #1 SMP Sun Sep 23 09:49:36 UTC 2012 i686 GNU/Linux
최신 커널을 선택할 때 유의할 점
현재(2012년 11월) 가장 최신 커널은 3.6.7 이다. 버전 숫자 상으로만 봐도 많은 차이가 있다.
여기서 한가지 고백을 하자면, 처음에 이 커널로 컴파일을 했었다. 물론 커널 옵션은 기존 커널(2.6.32-5-686)에서 사용했던 설정파일을 참조해서 말이다.
컴파일은 잘됐고, 모든 디바이스 드라이버들도 올라왔다.
그런데 Wi-Fi 가 안되는 문제가 발생했다. 인터페이스(wlan0)도 생기고 했는데, 접속명령어를 실행시 실패하는 오류가 발생했다.
# iwconfig wlan0 essid linux Error for wireless request "Set ESSID" (8B1A) : SET failed on device wlan0 ; Operation not supported.
Wi-Fi 드라이버만 따로 빌드를 해서 돌려보기도 하고, 명령어만 별도로 빌드해보기도 했지만, 해결되지 않았다. 심지어 최신 커널이 아닌 3.x 대의 다른 커널을 사용해봤지만 결과는 같았다.
마지막으로 해본 것이 데비안 소스 리스트에 있는 커널을 사용해보는 것이었다. 먼저 소스리스트(/etc/apt/sources.list) 에 다음을 추가해야 한다.
... deb http://backports.debian.org/debian-backports squeeze-backports main ...
이후 업데이트를 하고(apt-get update), 최신 커널이미지가 있는지 확인해보자!
#apt-cache pkgnames linux linux-headers-3.2.0-0.bpo.4-common-rt linux-headers-2.6.32-5-common-xen linux-image-3.2.0-0.bpo.3-486 linuxvnc linuxdcpp linux-headers-2.6.32-5-common-openvz linux-tools linux-headers-2.6.32-5-xen-686 linux-headers-2.6-686-bigmem linux-headers-2.6.32-5-486 linux-headers-2.6-486 linux-image-2.6.32-5-486 linux-image-3.6.5 linux-image-3.6.7 linux-image-2.6.32-5-xen-686 linux-headers-2.6.32-5-686 linux-headers-2.6-686 linux-image-2.6.32-5-686 linux-image-2.6-vserver-686-bigmem linux-image-3.2.0-0.bpo.3-rt-686-pae linux-image-amd64 linux-image-3.2.0-0.bpo.3-686-pae-dbg linux-headers-3.2.0-0.bpo.4-all linux-doc-2.6.32 linux-headers-3.2.0-0.bpo.3-486 linux-headers-3.2.0-0.bpo.3-amd64 ...
가장 최신으로 보이는 커널이 linux-image-3.2.0-0.bpo.3-686-pae 였다. 이를 설치한다.
#apt-get -t squeeze-backports install linux-image-3.2.0-0.bpo.3-686-pae firmware-linux-free
설치 후에는 Wi-Fi 가 정상동작하는 것을 확인했다. 설치 후에 /boot 디렉토리에 config-3.2.0-0.bpo.3-686-pae 파일이 보인다. 이를 앞서 시도했던 3.6.7 커널에 넣고 컴파일 했다. 결과는 정상 동작했다.
지금와서 생각해보면, 2.x → 3.x 로 바뀌면서 커널옵션들도 바뀐 것 같다. 이를 통해 최신 커널을 사용하고 싶다면, 가장 가까운 커널의 설정 파일을 참조하는 것이 가장 좋은 방법이다.
커널 소스 컴파일 및 설치
앞에서 설명한 것은 패키지(apt)에 등록된 커널 이미지를 설치한 방법이라면, 이제 소개할 방법은 직접 커널 소스 파일을 컴파일하여 설치하는 방법이다.
설치에 앞서 필요한 프로그램들을 설치해야 한다.
#apt-get install kernel-package #apt-get install libncurses-dev
커널 컴파일 절차는 아래와 같다.
#tar xf linux-3.6.7.tar -C /usr/src #cd /usr/src #ln -s /usr/src/linux-3.6.7 linux #cp /boot/config-2.6.32 /usr/src/linux/.config #make menuconfig // .config 파일 읽어들이기 #make-kpkg --initrd --revision=386 kernel_image modules_image // 컴파일과 deb 파일 만들기 또는 #make-kpkg --initrd --revision=386 kernel_image kernel_headers linux_source modules_image // 커널 헤더, 커널소스도 만드려면
성공적으로 컴파일 되었다면, deb 파일을 볼 수 있다.
#cd .. #dpkg -i linux-image-3.6.7_386_i386.deb
FAQ
커널 컴파일 도중에 lguest.c:37:18: error: zlib.h: No such file or directory 에러가 발생한다면
#apt-get install zlib1g-dev libssl-dev
위의 패키지를 설치한다.