1.2. 커널 소스 설치하기

이 장에서는 Tar-Ball(tar로 묶은 다음 gzip으로 압축한 패키지) 형태의 소스를 다운받아 적절한 곳에 풀어 놓고, 기초 환경을 구성하는 방법을 설명합니다.

1.2.1. 새 커널을 위한 기본 도구

새 커널을 컴파일하기 위해 업데이트가 필요한 라이브러리나 프로그램이 있는지 확인하여 필요하다면 새로 설치합니다. 그러나 모든 도구들이 반드시 필요한 것은 아닙니다. 예를 들어 pcmcia-cs는 pcmcia장비가 없는 시스템(랩탑이 아닌 대부분)에서는 설치하지 않아도 됩니다.

여러분이 새 커널 소스를 /usr/src아래 설치하고 linux라는 이름으로 링크해 두었다면, 관련된 문서는 /usr/src/linux/Documentation/Changes입니다.

아래는 각 도구마다 최소한의 버전(2.4.19 커널을 위한)과 확인하는 방법입니다. 예를 들어 Gnu C의 버전을 확인할 때에는 "gcc --version"이라는 명령을 사용합니다.

---------------+---------------+--------------------------------------
패키지         |  최소버전     |  확인하는 방법 
---------------+---------------+--------------------------------------
Gnu C          |  2.95.3       |  # gcc --version 
Gnu make       |  3.77         |  # make --version 
binutils       |  2.9.1.0.25   |  # ld -v 
util-linux     |  2.10o        |  # fdformat --version 
modutils       |  2.4.2        |  # insmod -V 
jfsutils       |  1.0.12       |  # fsck.jfs -V
e2fsprogs      |  1.25         |  # tune2fs 
reiserfsprogs  |  3.x.1b       |  # reiserfsck 2>&1|grep reiserfsprogs 
pcmcia-cs      |  3.1.21       |  # cardmgr -V 
PPP            |  2.4.0        |  # pppd --version 
isdn4k-utils   |  3.1pre1      |  # isdnctrl 2>&1|grep version 
iptables       |  1.2.6a       |  # iptables -V
---------------+---------------+--------------------------------------

아래는 도구들을 구하는 인터넷 위치입니다. 파일 이름이나 버전 번호는 조금씩 달라질 수도 있습니다:

1.2.2. 기본 도구 설치하기

새 커널과 모듈 설정에 쓰이는 도구들을 인터넷으로부터 가져왔다면 압축을 풀고 컴파일해 넣습니다. 예를 들어 /usr/local/src/utils/util-linux-2.10s.tar.gz를 설치한다면:

1. 먼저 적당한 위치에 압축을 풀어놓습니다.

# cd /usr/src
# tar xvzf /usr/local/src/utils/util-linux-2.10s.tar.gz

2. 아마 util-linux-2.10s라는 이름으로 새로운 디렉토리가 만들어지고 그 안에 소스 파일들이 놓일 것입니다.

# cd util-linux-2.10s

3. 시스템 정보를 수집해서 컴파일을 위한 기초환경을 구성합니다.

# ./configure

4. 3에서 생성한 Makefile등 설정파일을 이용해 컴파일하고 설치합니다.

# make;make install

1.2.3. 커널 소스 풀기

일반적으로 커널 소스는 /usr/src 디렉토리 아래 설치합니다. /usr/src 아래에는 실제 헤더, 커널이 설치된 디렉토리와 그 링크가 있습니다. 이전 커널이 들어있는 디렉토리에 대한 링크를 삭제하고(우선은 링크만 지웁니다) 새 커널 소스가 설치된 디렉토리를 linux라는 이름으로 다시 링크합니다. bzip2로 압축된 커널은 tar xvjf 커널패키지.tar.bz2 명령을 사용합니다 (이전 버전 tar는 xvIf 옵션을 사용합니다)

# cd /usr/src
# rm -f linux
# mkdir linux-2.4.19
# tar xvzf linux-2.4.19.tar.gz linux-2.4.19
# ln -s linux-2.4.19 linux

RPM(다른 머신에서 미리 컴파일된 바이너리 패키지)이나 dpkg, 혹은 Tar-Ball 형태의 바이너리를 설치하지 않고, 소스코드를 컴파일해야 한다면 /usr/src/linux아래 코드들을 참고합니다.

1.2.4. 커널 패치

패치파일은 diff 유틸리티를 이용하여 커널의 일부분을 수정합니다. 그러므로 최신 커널 전체를 내려받았다면 패치할 필요 없습니다. 패치해야할 버전이 너무 많다면, 커널 소스 전체를 다시 받는 것이 유리할 수도 있습니다.

패치파일은 빠르게 갱신되며 새로운 패치파일은 이전 패치에 대한 정보를 포함하지 않으므로 패치레벨은 순서대로 모두 적용해야만 합니다. 예를 들어 커널 2.4.16에서 커널 2.4.19로 업그레이드하기 위해서는 patch-2.4.17.gz, patch-2.4.19.gz 모두를 순서대로 적용해야 합니다. 아래에 예가 있습니다.

옵션 가운데 p0는 패치파일에 들어있는 경로에 대한 상대적인 위치를 뜻합니다. 예를 들어 패치파일 안에 패치할 대상이 들어 있는 디렉토리와 대상 파일을 "/u/howard/src/blurfl/blurfl.c"이라고 설정했다면 -p0는 "/u/howard/src/blurfl/blurfl.c", -p1은 "u/howard/src/blurfl/blurfl.c", -p4는 "blurfl/blurfl.c"가 됩니다.

# cd /usr/src
# ls

linux linux-2.4.16 patch-2.4.17.gz patch-2.4.19.gz

# gzip -cd patch-2.4.17.gz | patch -p0
# gzip -cd patch-2.4.19.gz | patch -p0

많은 패치 작업은 셸의 for 명령을 이용해 자동화할 수 있습니다:

# for LeveL in 17 18 19 ; do
> gzip -cd patch-2.2.${LeveL}.gz | patch -p0
> done
#

/usr/src/linux/scripts 디렉토리에는 여러 단계의 패치 작업을 자동으로 실행하는 셸 스크립트 patch-kernel이 있습니다. patch-kernel은 /usr/src 아래에 있는 커널 패치파일들과 커널 소스의 버전과 비교하여 순서에 따라 패치를 적용합니다.

# cd /usr/src
# ls
linux linux-2.4.16 patch-2.4.17.gz patch-2.4.19.gz
# ./linux/scripts/patch-kernel

패치가 성공했다면 패치 대상이 된 파일의 원본은 이름끝에 .orig를 붙여 백업됩니다. 패치 과정에서 문제가 생겨 실패했다면 실패한 파일 이름 뒤에 .rej를 붙인 파일을 만듭니다. 실패했다면 *.rej파일을 살펴보고 바른 방법으로 패치 작업을 다시 수행합니다.

# find /usr/src/linux/ -name "*.rej"

*.rej 파일을 찾을 수 없고 패치가 성공했다면 *.orig파일을 삭제합니다.

# find /usr/src/linux/ -name "*.orig" -exec rm -f {} \;

패치된 커널 소스 디렉토리 이름을 패치레벨 번호로 바꾸고 링크를 다시 설정합니다.

# cd /usr/src
# rm -f linux
# ln -s linux-2.4.13 linux

1.2.5. 한글 패치

최근 버전 커널에서는 한글 코드페이지와 Locale이 들어 있어 따로 패치하지 않아도 한글로 된 파일 이름 등을 사용할 수 있습니다.

1.2.6. make mrproper

이전에 설정한 정보를 지우거나 새로운 커널 소스를 가져다 컴파일 할 때에는 이 명령을 먼저 사용해야 합니다. make mrproper 명령은 이전 커널을 컴파일할 때 만들어진 오브젝트 파일(*.o)과 의존성 설정, 컴파일 환경 설정값, 버전 정보 등 새로 시작하는 컴파일에 영향을 주는 이전 정보들을 삭제합니다.

이전에 설정된 컴파일환경을 재사용한다면 이 과정을 건너뜁니다.

# cd /usr/src/linux
# make mrproper