10.6. 맞춤 커널 만들기

기성 커널에서는 지원되지 않는 하드웨어나 기능을 사용하고 싶거나 시스템 메모리를 더 효과적으로 활용하기 위하여 커널 메모리 공간을 줄이고 싶다면 새로운 맞춤 커널을 만들 필요가 있다.

커널을 업그레이드하는 과정은 필요로하는 모듈을 설정하고, 커널과 모듈을 컴파일하고 마지막으로 커널 이미지를 설치하는 과정으로 구성된다. 그런 다음 새로운 커널을 올리기 위하여 (두손 모아 빌면서!) 시스템을 재부팅한다. 이러한 과정에 대하여는 각 커널 패키지에 따라오는 ``README'' 파일에 들어있다. 더 자세한 자료는 ``Documentation/'' 디렉토리 아래에 들어 있다. 거기에 들어있는 파일 중에서 특별히 도움이 될만한 파일로는 ``Configure.help'' 파일이 있는데 이 파일에는 사용가능한 커널 컴파일 옵션과 모듈에 대한 상세한 정보가 들어있다.

다음의 예시 세션은 인텔 플랫폼에서 2.0.36 버전의 맞춤 커널을 만드는 과정을 보여준다. 대개 맞춤 커널을 만드는 것은 그냥 설정하고 컴파일하고 설치하는 과정에 지나지 않는다. 가끔은 (대개 새로운 하드웨어를 사용하려는 경우) 컴파일 하려는 커널이 지원하지 않는 하드웨러를 지원하기 위하여 추가의 드라이버 소프트웨어를 다운로드 받아야 한다.

맞춤 커널을 만드는 첫번째 단계는 RPM (이게 더 낫다) 또는 타르볼을 다운로드하여 커널 소스를 설치하는 것이다. 적절한 파일을 찾는 방법에 대하여는 10.4절 을 참조하시요.

그 다음은 ``rpm'' 유틸리티 (또는 상황에 따라서는 ``tar'') 를 사용하여 커널 소스와 헤더 파일을 설치한다. 예를 들어 2.0.36-3 커널 RPM 파일을 설치하려면:

rpm -Uvh kernel-source-2.0.36-3.i386.rpm kernel-headers-2.0.36-3.i386.rpm
rpm -Uvh kernel-ibcs-2.0.36-3.i386.rpm

(만약 노트북에서 리눅스를 실행시킨다면 전원 관리 기능을 제공하는 ``kernel-pcmcia-cs-2.0.36-3.i386.rpm'' 파일도 설치하여야 할 것이다.)

커널 파일을 설치하고 나면 새로운 소스 트리를 ``/usr/src/linux/'' 디렉토리에서 볼 수 있을 것이다.

그 다음 단계는 (만약 필요하다면) 추가의 드라이버 파일을 다운로드하고 새로운 커널 소스 트리에 설치한다. 예를 들어, Mylex DAC960 하드웨어 RAID 컨트롤러를 지원하는 기능을 추가하려면, http://www.dandelion.com/ 웹 사이트에서 드라이버 소프트웨어를 다운로드 한다. 불행히도 그런 드라이버 소프트웨어는 대개 타르볼로만 제공되므로 ``tar'' 유틸리티를 사용하여 설치하여야 한다. 예를 들면:

cd /usr/src/
tar zxvpf DAC960-2.0.0-Beta4.tar.gz

추가 드라이버 소프트웨에 따라오는 문서가 있다면 꼭 읽어보아야 한다. 예를 들어, DAC960 드라이버에는 ``README'' 파일이 있는데 이 파일에는 새로 다운로드 받은 파일이 어디에 놓여야 하며 어떻게 커널 패치를 적용하는지에 대한 설명이 들어있다:

mv README.DAC960 DAC960.[ch] /usr/src/linux/drivers/block
patch -p0 < DAC960.patch

다음 단계는 시스템의 심볼릭 링크가 새로운 커널 트리를 제대로 가리키고 있는지 확인하는 것이다. 사실 이 단계는 딱 한번 해주면 된다. 따라서 다음의 내용은 이전에 한번도 맞춤 커널을 컴파일 한 적이 없는 경우에만 해주면 된다:

mail:/usr/src# cd /usr/include
mail:/usr/include# rm -rf asm linux scsi
mail:/usr/include# ln -s /usr/src/linux/include/asm-i386 asm
mail:/usr/include# ln -s /usr/src/linux/include/linux linux
mail:/usr/include# ln -s /usr/src/linux/include/scsi scsi

참고: 주의: 위의 단계는 2.2.x 나 그 이상의 커널 버전에서는 이제 필요없어졌다.

다음 단계는 커널 셋팅을 설정하는 것이다. 이는 맞춤 커널을 만드는데 있어 가장 중요한 단계이다. 어떤 셋팅을 실수로 안쓰도록 하면 어떤 원하는 기능이나 필요로 하는 하드웨어를 지원하지 못하게 될 수 있다. 한편 필요없는 셋팅을 사용하도록 하면 쓸데없이 커널의 크기가 커져서 소중한 시스템 메모리를 낭비하게 된다 (물론 앞의 경우보다는 뒤의 경우가 차라리 낫긴하다).

커널을 제대로 컴파일하는 것인지를 확실히 하는 가장 좋은 방법은 어떤 기능을 필요로 하며 시스템에서 지원을 필요로 하는 하드웨어가 무엇인지를 정확히 아는 것이다. 맞춤 커널을 만드는 경험을 몇 번하고 나면 이 과정은 이제 "뻔할 뻔자"가 되어 별로 두렵지 않게 될 것이다!

다음과 같이 타이핑하면 설정 과정이 시작된다:

mail:/usr/include# cd /usr/src/linux
mail:/usr/src/linux# make mrproper
mail:/usr/src/linux# make menuconfig

(만약 X 윈도우 시스템을 사용하고 있다면 ``make menuconfig'' 대신에 ``make xconfig'' 라고 타이핑할 수 있다; X 윈도우 시스템이 어떻게 동작하는 지에 대한 자세한 정보는 5장 을 참조하시요.)

커널을 설정하려면 다양한 셋팅 중에서 필요로 하는 것들을 (쓸 수 있도록) 선택하고 필요로하지 않는 것들을 (쓰지 않도록) 선택을 꺼주면 된다. 지원기능을 커널에 만들어 넣을 수도 있고 모듈로 만들어서 필요에 따라 커널이 올렸다 내렸다하게 할 수도 있다. (스카시 드라이버처럼 시스템을 부팅하는데 필요한 기능을 모듈로 컴파일한다면 램디스크 이미지를 만들어야 한다. 그렇게 하지 않으면 아예 부팅이 되지 않는다. 이를 위해서는 ``mkinitrd'' 명령을 사용하여야 한다; 이 과정에 대하여는 아래에서 다루었다.)

설정을 하는 도중에 <Help> 를 선택하면 각 커널 옵션이 어디에 사용되는지에 대한 설명을 볼 수 있다.

커널 셋팅을 설정하고 나면 다음과 같은 명령을 타이핑하여 커널을 컴파일 한다:

mail:/usr/src/linux# make dep ; make clean
mail:/usr/src/linux# make bzImage
mail:/usr/src/linux# make modules

만약 이전에 갖고 있던 것과 같은 커널을 (이 예에서는 2.0.36-3) 다시 컴파일 하는 것이라서 기존의 모듈을 백업 디렉토리로 옮겨두고 싶으면 다음과 같은 명령을 타이핑하면 된다:

mail:/usr/src/linux# mv /lib/modules/2.0.36-3 /lib/modules/2.0.36-3-backup

새 모듈을 실제로 설치하기 위해서는 다음과 같이 타이핑하면 된다:

mail:/usr/src/linux# make modules_install

그 다음 단계는 커널을 ``/boot/'' 디렉토리로 복사하고 LILO 를 사용하여 부트 기록을 갱신함을써 새로운 커널을 인식시키는 것이다. 다음의 명령은 기존 커널의 백업본을 만들고 새로운 커널을 덮어서 복사하고 LILO 부트 레코드를 갱신하는 역할을 한다:

mail:/usr/src/linux# cd /boot
mail:/boot# cp vmlinuz vmlinuz.OLD
mail:/boot# cp /usr/src/linux/arch/i386/boot/bzImage vmlinuz-2.0.36
mail:/boot# /sbin/lilo

마지막으로, ``/etc/lilo.conf'' 파일을 편집하여 "이미지 (image)" 가 새로 만들어진 커널을 확실히 가리키도록 해준다. 그리고 백업 커널을 카리키는 섹션, 예컨대 "OldLinux" 를 만들어 준다. 예시 파일은 다음과 같다:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz
	label=Linux
	root=/dev/hdb1
	read-only
image=/boot/vmlinuz.OLD
	label=OldLinux
        read-only

백업 커널 정보를 이렇게 추가해두면 새로운 커널이 (장치가 제대로 인식되지 않는다거나 데몬이 제대로 시작되지 않는다거나 하는 식으로) 제대로 부팅되지 않을 경우 그냥 ``OldLinux'' 라고 타이핑하여 이전의 커널로 부팅한다음 문제를 조사해 볼 수 있다.

참고: 주의: 앞에서도 언급했듯이 부팅에 필요한 기능을 모듈로 컴파일하였다면 시스템을 부팅하기 위하여 초기 램디스크 이미지를 만들어야 한다. (커널을 그러한 초기 부트 이미지를 지원하도록 컴파일 해두어야 한다.)

초기 램디스크 이미지를 만들고 사용하는 과정은 다음과 같다:

이제 시스템을 내렸다가 새로운 커널로 부팅한다!

mail:/boot# /sbin/shutdown -r now

커널이 한번에 재대로 부팅되지 않더라도 허둥댈 필요는 없다. 리눅스를 설치할 때 만든 부트 디스크로 부터 부트를 하면 된다. 만약 이 디스클 갖고 있지 않다면 레드햇 씨디로부터 하나를 새로 만들 수도 있다. 부트 디스켓을 드라이브에 넣고 컴퓨터를 재부팅한 뒤 "boot:" 가 나타나면 다음과 같이 타이핑한다:

mount root=/dev/hda1

위의 명령은 당신의 "/" (root) 파티션이 /dev/hda1 에 있다는 것을 가정하고 있다.

그러면 리눅스는 정상적으로 부팅이 된다 (부트 디스크에 있는 커널을 사용하고 있으므로 이번 세션에서는 모든 서비스나 장치가 제대로 동작하지는 않지만). 그런다음 예전의 커널로 복구하고 LILO 부트 로더 정보를 다시 설정한 뒤에 (즉, ``mv /vmlinuz.old /vmlinuz ; /sbin/lilo'' 라고 한 뒤) 시스템을 내리고/재시작 시킨다. 그리고 나서 다른 옵션을 선택하여 커널을 다시 컴파일 한 뒤 재도전 한다.