수요일, 8월 13, 2008

페도라式 커널 빌드 2/2

이제부터가 커널 컴파일의 핵심과정이다. 바로 커널의 최적화를 위해 여러가지 옵션을 조정하는 일이다. 예를 들자면 내 시스템의 cpu가 core 2 duo라면 커널을 여기에 맞춰 컴파일할 수 있다. 배포판에 실린 386용 커널을 쓰면서 cpu 파워를 썩힐 이유가 없지 않는가?

make oldconfig
make menuconfig
다음과 같은 화면을 보게 될 것이다.

화면에서 설명하고 있는 대로 설정하고자 하는 옵션으로 이동한 다음 y(커널에 정적으로 포함), n(제외), m(모듈로 빌드)중 하나를 선택하면 된다. 대개의 경우 항상 필요한 옵션은 y, 그외에는 m을 선택해 주면 된다. 각각의 옵션에 대한 설명은 해당 옵션에서 ? 키를 누르면 볼 수 있다. 설정을 마치고 Exit를 선택하면 설정을 저장할 것인가 물어보는데 당근 yes다.


설정을 저장했으면 새로 바뀐 .config 파일을 컴파일시 반영이 될 수 있도록 다시 SOURCE 디렉토리로 복사해 줘야 한다. 그런데 복사하기 전 한가지 더 할 일이 있다. 적당한 에디터로 .config 파일을 열어서 제일 윗줄에 다음과 같이 자신의 아키택쳐를 써준다. 예를 들어 amd 64bit 시스템이라면
# x86_64
그 다음에 SOURCE디렉토리로 복사한다. 다시한번 <arch>에는 알맞은 아키텍쳐를 써 줘야 한다. SOURCE 디렉토리 내의 다른 config파일들의 이름을 참고한다.
cp .config ~/rpmbuild/SOURCES/config-<arch>

4) 커널 빌드
먼저 spec 파일이 있는 디렉토리로 이동한다.
cd ~/rpmbuild/SPECS
ls 해보면 kernel-<version>.spec 파일이 있을 것이다. 이 파일을 에디터로 열어 다음과 같은 라인을 찾는다.
#% define buildid .local
우리가 새로 빌드할 커널을 페도라의 공식 배포 커널과 구별하기 위해 이름을 적어 주는 부분이다. 만약 아예 이 라인을 손대지 않고 그대로 놔두면 페도라 배포판의 커널과 동일한 이름을 가지게
된다(예: kernel-버전번호-빌드번호-fc7). 제일 앞의 주석표시인 #를 지우고 .local대신 적당한 이름을 넣어 주면 된다. 물론 .local을 그대로 써도 된다. 한 가지 주의할 것은 새로운 이름을 지어주기로 결정하였다면 %와 d사이의 공백을 제거해 주야 한다는 것이다.

완성된 예는 다음과 같을 것이다.
%define buildid .dks
자, 이제 다 되었다. 커널을 만들어 보자.
rpmbuild -ba --target=<arch> kernel-<version>.spec
위에서와 마찬가지로 "--target=<arch>"는 생략가능하다. 빌드하는데 소요되는 시간은 시스템 사양에 따라 다르겠지만 cpu: AMD 올리언즈 3500+ 메모리: 1G 머신에서 약 40~50분 정도 걸렸다. 빌드 시간을 줄이는 팁이 있는데 --without 옵션을 써서 필요없는 부분을 제외해버리는 것이다. 예를 들어 아래와 같이 debuginfo 패키지와 xen 패키지는 생성되지 않도록 할 수 있다.
rpmbuild -bb --without debuginfo --without xen kernel-<version>.spec
debuginfo와 xen외에도 --without 옵션 값으로 쓸 수있는 것들은 debug, smp, pae, smp, kdump 등이 있다. 참고로 debug는 커널에서 디버깅 코드를 빼 버리는 것이고 debuginfo는 debuginfo라는 별도의 패키지를 생성하는 것이다.

5) 커널 설치
커널이 에러없이 빌드가 되면(대개 화면 마지막에 exit 0 라는 말이 나오면 정상적으로 빌드가 되었다고 보면 된다) ~/rpmbuild/RPMS/<arch>/ 밑에 kernel-<version>.<arch>.rpm, kernel-devel-<version>.<arch>.rpm, kernel-headers-<version>.<arch>.rpm 등의 패키지가 생성된다. --without-debuginfo옵션을 쓰지 않았다면 kernel-debuginfo 패키지도 볼 수 있을 것이다. 다음과 같이 커널을 설치한다. 다시한번 root 권한이 필요하다.
rpm -ivh /home/<사용자>/rpmbuild/RPMS/<arch>/kernel-<version>.<arch>.rpm --force
혹시나 커널이 잘못 빌드되었을 수도 있으니 업데이트 옵션(-U)을 쓰지말고 그냥 인스톨 옵션(-i)를 써야 한다. 그래야 옛날 커널을 지우지 않고 여차하면 옛날 커널로 부트할 수 있을 것이다. 위와 같이 설치하면 grub설정화일도 알아서 고쳐준다. reboot해서 새로운 커널이 잘 작동하는지 확인해 보자. 혹시나 비디오 드라이버가 맞지 않는다는 에러 메세지와 함께 새로운 드라이버을 설치하는 화면으로 진입할 수도 있다. 당황하지말고 no를 선택하여 빠져나오기 바란다. 그다음에 1. 사전 준비단계에서 받아 놓은 드라이버를 재설치 해주면 된다. 모든 것이 정상적으로 작동하는 것이 확인되면 kernel-devel과 kernel-headers패키지도 설치하면 끝이다. 아마 vmware를 쓰고 있다면 새로운 커널에 맞는 모듈을 재컴파일 해야 할텐데 그때 당장 devel패키지가 필요할 것이다.

References:
▪ Building a Kernel from the src RPM <http://fedoraproject.org/wiki/Docs/CustomKernel>
▪ How To Compile A Kernel - The Fedora Way <http://www.howtoforge.com/kernel_compilation_fedora>

0 Comment: