검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : How to Compile the Linux Kernel

  리눅스 초기에는 커널 컴파일이 거의 필수였습니다만 요즘 시대에는 특이한 상황이 아니라면 커널 컴파일을 직접 할 필요가 없습니다. 시스템을 극한으로 튜닝하거나 신기능의 베타 테스터를 자처하고 싶을 때나 필요합니다. 하지만 안 해도 되는 걸 해보는 삽질 정신이 리눅서의 기본이 아니겠습니까! 그래서 이번에는 커널 컴파일에 대해 알아보겠습니다. 참고로 왠만하면 이걸로 보는 이득보다는 시간이나 스트레스 적으로 손해보는 게 더 클테니 그건 미리 감수하시는 것이 좋을 겁니다.

  그리고 매우 중요한 한 가지. kernel.org의 커널 소스와 각종 배포판을 통해 얻을 수 있는 커널 소스는 버전이 같아도 같은 게 아닙니다. 대부분의 배포판에서는 자기들이 고치고 최적화한 커널을 올리기 때문입니다.

  먼저 커널을 '컴파일'해야 하기 때문에 컴파일러와 각종 라이브러리가 필요합니다. CentOS나 페도라 같은 경우에는 아래와 같은 커맨드를 통해 필요한 개발 도구를 모두 설치할 수 있습니다.
yum groupinstall "Development Tools"
yum install ncurses-devel
yum install qt-devel
yum install unifdef
  이제 커널 소스 파일을 받습니다. 그리고 압축된 소스 파일을 풀어넣을 디렉토리를 만듭니다. 보통은 /usr/src이나 /usr/src/kernels 디렉토리에 파일을 다운로드 받은 후 압축을 해제합니다. 그러면 커널 버전명으로 서브 디렉토리가 만들어지면서 그 안에 소스 파일들이 풀립니다. 참고로 커널 컴파일은 일반 유저의 권한만 필요하지만 설치를 할 때는 루트 권한이 필요하고 /usr 디렉토리를 조작할 때도 루트 권한이 필요하다는 것을 알아두시기 바랍니다. 일단 /usr/src 디렉토리에 커널 소스 압축 파일을 다운로드 받아 아래와 같이 압축을 해제합니다.
tar -xvfj linux-2.6.35.4.tar.bz2
  이제 커널에 어떤 기능을 넣을지, 어떤 것들을 모듈로 컴파일할지 정해야 합니다. 디렉토리 안으로 들어가서 'make config' 명령어로 환경 설정을 할 수 있는데 이건 뭐 한 번 잘못 고르면 뒤로도 못 가는 피곤한 방법이라 보통은 'make menuconfig'로 ncurses(위에서 'yum install ncurses-devel'로 설치)를 통해 콘솔에서 나름 GUI로 설정하거나 X윈도우를 사용할 경우 'make xconfig'로 qt(위에서 'yum install qt-devel'로 설치)를 통해 화려한(?) GUI 인터페이스로 설정할 수도 있습니다. 아직 실행은 하지 마세요.

  문제는 위의 명령어를 통해 이제부터 할 '설정'인데 커널 컴파일에서 가장 중요한 부분이지만 가장 조언할 방법이 없는 부분입니다 -_-; 자신의 머신에 맞는 항목을 '적절히' 고르면 됩니다. 참 쉽죠? -_-;; 무한의 문서 참조와 삽질이 필요한 부분입니다. 일단 상당한 수준의 숙련자가 아닌 이상 앵간하면 자신의 배포판이 사용하는 디폴트 설정 상태에서 설정을 시작하는 것이 좋은데 그러려면 자신의 배포판의 저장소에서 커널 소스를 받은 후 그 속에 있는 설정 파일을 복사해서 가져오면 됩니다. 소스는 CentOS의 경우 대충 아래처럼 받아 설치하면 됩니다. 버전은 최신 버전을 찾으면 되겠죠?
rpm -i http://mirror.centos.org/centos/5/updates/SRPMS/kernel-2.6.18-194.11.3.el5.src.rpm
  위 방법으로 설치하면 /usr/src/kernels 디렉토리 밑에 커널 버전명으로 디렉토리가 생깁니다. 디렉토리 안에 들어가보면 '.config' 파일이 있습니다. 이 파일을 아까 작업하던 디렉토리에 복사합니다. 이제 'make menuconfig'나 'make xconfig'를 실행해서 설정을 합니다. 'make config'는 무리니까 시도하지 마시고...이제 '적절히' 설정을 한 후 저장을 하고 나옵니다.

  이제 대망의(?) 컴파일 시간입니다. 'make' 명령어를 실행합니다. 한참(아마도 1시간 이상) 걸릴테니 다른 볼일이라도 봅시다. 물론 다른 컴퓨터에서요. CPU가 듀얼 코어 이상인 경우에는 더 빠르게 컴파일하는 방법이 있습니다. 'make -j#' 형식(#에는 CPU 코어의 숫자)으로 명령을 내리면 다수의 코어로 작업을 하여 컴파일을 빨리 끝낼 수 있습니다.

  컴파일이 끝나면 모듈과 커널을 설치(복사)하기 위해 아래의 명령어를 실행합니다. 참고로 루트 권한이 필요합니다.

make modules install
make install

  이제 grub.conf 파일을 확인합니다. 참으로 다행인 건 위의 'make install' 명령어로 새로 컴파일해서 복사한 커널이 grub.conf 파일에 적절히 적용된 상태라는 겁니다. 일단 아래의 샘플을 봅시다.
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.35.4)
        root (hd0,0)
        kernel /vmlinuz-2.6.35.4 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.35.4.img
title CentOS (2.6.18-194.11.3.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-194.11.3.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-194.11.3.el5.img
title CentOS (2.6.18-194.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-194.el5.img
  참고로 위의 항목 중 새로 추가된 것이 2번째에 있는 'CentOS (2.6.18-194.11.3.el5)' 항목입니다. 2번째 줄에 있는 'default=1'은 부팅 시 디폴트로 선택되는 커널을 가리키는데 주의할 점은 0이 첫 번째 항목이라는 겁니다. 그러므로 1이면 2번째 항목인 'CentOS (2.6.18-194.11.3.el5)' 항목을 가리키고 있는 겁니다. 기존의 커널과 새로 컴파일한 커널 중 디폴트로 지정할 커널을 선택합시다.

  원문 리플에 재미있는 트릭이 있는데 만약 원격에서 커널을 컴파일하고 설치해서 테스트를 하는 중일 경우 부팅에 실패하면 직접 머신에 가서 리붓을 하기 전까지 대책이 없게 됩니다. 이런 경우를 대비한 트릭인데 먼저 grub.conf 파일에서 'default' 값을 새로운 커널이 아닌 현재 커널로 설정합니다. 그리고 나서 아래처럼 grub 명령어를 실행한 후 다음 부팅 때 1번만 새로 컴파일한 커널로 부팅하도록 만듭니다.
# grub
grub> savedefault --default=0 --once
grub> quit
  당연히 'default=0' 부분의 0은 grub.conf 파일에 새로 추가된 커널 항목의 순번으로 적절히 고쳐서 적습니다. 그리고 나서 grub.conf 파일을 열고 새로 추가된 커널 항목에서 커널 이미지 파일을 지정하는 줄('kernel'로 시작하는 줄) 끝에 'panic=30'이라는 옵션을 추가합니다. 이러면 선택한 커널을 로딩하기 시작한 후 30초가 지나도 부팅이 완료되지 않을 경우 자동으로 리붓이 됩니다. 즉, 커널 패닉 등의 이유로 부팅에 실패해도 먹통인 채로 있지 않고 자동으로 리붓을 하게 되는 것이죠. 그런데 위에서 다음 1번만 새로운 커널로 부팅하도록 해놨으므로 문제가 생겨 리붓을 하게 되면 예전 커널을 로딩하여 정상 부팅이 되는 것이죠. 참 잔머리들이 좋은 것 같습니다.


2010/10/27 21:49 2010/10/27 21:49