- 1 소개
- 2 준비
- 3 소스 다운로드
- 4 소스 압축 풀기
- 5 커널 설정하기
- 6 커널 빌드하기
- 6.1 make-kpkg
- 6.2 --append-to-version
- 6.3 --revision
- 6.4 커널 팩키지 이름
- 6.5 fakeroot
- 7 커널 이미지 팩키지 설치하기
- 8 최종 정리
- 8.1 커널 홀드
- 8.2 심볼릭 링크 제거
- 8.3 커널 백업하기
- 8.4 부팅 디스크 만들기
- 8.5 다음 커널 만들기
- 8.6 이전 설정 사용하기
- 9 점검해야 할 사항들
- 10 링크
P.S. 1
KernelPatchHowTo에 가시면 커널에 성능 패치를 적용하는 것과 추천 커널 옵션 등이 추가된 문서가 있습니다. 관심 있으신 분은 둘러보세요. 이 문서를 읽으신 후에 보는 것이 더 좋을지도 모르겠습니다.
P.S. 2 원문에는 커널 2.6.8이었지만 현재(2006년 1월25일) 우분투 최신 안정버젼 커널은 2.6.12.10이므로 이하 2.6.12.10로 표시하겠습니다.
원문 :
https://wiki.ubuntu.com/KernelHowto번역 : handrake (
http://ubuntu.or.kr/wiki.php/handrake )
처음 하는 번역이라 아직 많이 미숙합니다. 부족한 점이 있어도 이해 부탁드립니다. 오타나 잘못된 번역이 보이면 기탄없이 고치거나 코멘트 달아주세요

리눅스 커널은 우분투 운영체제의 핵심입니다. 우분투에서 제공하는 커널에는 유저가 필요한 모든 드라이버가 들어 있습니다. 하지만 만약 커널의 일부를 살짝 바꾸거나 어떠한 이유로 커널 전체를 컴파일해야 하는 일이 있을 경우에는 이
?HowTo가 도움이 될 수 있을 것입니다.
좀더 간단(하지만 같은 내용을 담고 있는)한 문서는
여기에서 찾을 수 있습니다.
커널을 빌드하기 위해서는 다음의 팩키지들이 필요합니다 build-essential fakeroot kernel-package
bash:~$ sudo apt-get install build-essential fakeroot kernel-package

어떤 사람들은 gcc-3.4를 설치한 뒤에만 (커널을) 컴파일을 하기도 합니다. (3.4가 커널 컴파일이 좀 더 잘된다는 말인거 같습니다.)
커널은 /usr/src/ 디렉토리에 빌드되기 때문에 유저는 src 그룹에 속해 있어야 합니다. (fakeroot나 sudo등을 사용하면 그냥 되는듯 합니다.)
bash:~$ sudo adduser my_username src Adding user my_username to group src... Done.
( my_username은 자기 이름으로 바꿔주는 정도의 센스는 필요하겠죠?

)
로그아웃했다가 다시 로그인을 하거나 su를 사용합니다.
bash:~$ su my_username bash:~$ groups my_username src audio adm dialout cdrom floppy video plugdev lpadmin
보이는 그룹들 중에 src이 있어야 합니다.
3 소스 다운로드 #
원하는 커널 소스를 다음과 같이 고릅니다. (역자주: kernel.org 등에서 다운받은 커널도 물론 됩니다. 하지만 이전 커널에서는 되던 몇몇 기능이 지원되지 않을 수 있습니다. 제 경우에는 2.6.15로 올리면 이상하게 잘 되던 wireless가 안되더군요. 1월 26일 : 밑에 wireless에 대한 해결방안을 적어놓았습니다.)
bash:~$ apt-cache search source 2.6

퀴즈: 똑같은 커널 소스가 어떤 때는 kernel-source-2.6.5일때도 linux-source-2.6.8.1일때도 있는데요, 그 이유는 무엇일까요?
정답: 리눅스 커널이 새로운 버젼 넘버링을 사용하기 때문입니다. 자세한 정보는
여기에서 확인할 수 있습니다.
kernel-source는 데비안용이고 linux-source는 우분투용이기 때문에 가능한한 linux-source를 사용하는 것이 좋습니다. 데비안 팩키지의 의존성 문제가 완전히 해결된게 아니므로 "uninstalled package kernel-source"와 같은 경고가 나올 수 있으나, 무시해도 큰 문제는 없습니다 -- Bronson
(역자주 : 이 정보는 좀 오래된 것 같습니다. 전 이런 경고를 한번도 본 적이 없거든요.)
커널 소스를 다음의 명령어로 다운로드 받습니다.
bash:~$ sudo apt-get install linux-source

libncurses-dev와 libqt3-dev를 설치할 것을 추천합니다. 왜냐하면 libncurses-dev는 menuconfig를 하는데 필요하고 libqt3-dev는 xconfig를 하는데 필요하기 때문입니다. 이 중 적어도 하나는 설치합니다 (밑에 보면 자세히 이유가 나옵니다)
이제 소스가 /usr/src에 다운로드 돼있을 것입니다.
4 소스 압축 풀기 #
이 문서에서는 현재 최신 커널인 2.6.12.10 버젼을 예로 들어 설명하겠습니다.
bash:~$ cd /usr/src bash:/usr/src$ ls -l linux-source-2.6.12.10.tar.bz2
만약 이전의 커널 소스가 linux에 설치되어 있다면 지웁니다.
bash:/usr/src$ rm linux

만약 linux에 이전 소스가 있다면 바로 압축을 풀지 않는게 좋습니다. 새 커널 소스가 이전 소스를 덮어쓰게 된다면 컴파일이 안될 가능성이 높기 때문입니다.
그리고 다음과 같이 압축을 풉니다.
bash:/usr/src$ tar xjvf linux-source-2.6.12.10.tar.bz2

여기서는 sudo를 사용하지 않는게 좋습니다.

소스가 .bz2로 압축되어 있으면 xjvf로 풀고 .gz로 일 경우엔 xzvf로 풉니다.
linux 디렉토리로 링크를 겁니다.
bash:/usr/src$ ln -s linux-source-2.6.12.10 linux
모든 것이 제자리에 있는지 확인합니다. 다음과 같은 화면이 보여야 합니다.
bash:/usr/src$ ls linux@ linux-source-2.6.12.10/ linux-source-2.6.12.10.tar.bz2
5 커널 설정하기 #
커널을 설정하는데는 여러가지 방법이 있지만 여기서는 xconfig를 사용하도록 하겠습니다. 우선 /usr/src/linux 디렉토리로 이동한 후 다음의 명령들을 실행합니다.
$ cd /usr/src bash:/usr/src/$ cd linux-2.6.12.10 bash:/usr/src/linux-2.6.12.10
$ cp /boot/config-`uname --kernel-release` ./.config bash:/usr/src/linux-2.6.12.10
$ cd /usr/src/linux bash:/usr/src/linux
$ make xconfig
만약 X를 사용하지 않거나 마우스를 쓰지 않고 싶으면 다음과 같이 합니다.
bash:/usr/src/linux$ make menuconfig

경고: 적어도 bus, disk 그리고 root 파일 시스템 드라이버는 커널에 정적(statically)으로 컴파일 되어야 합니다. 그렇지 않을 경우 부팅이 되지 않습니다.
KernelBuildpackageHowto에서는 재설정이 필요없는 커널 컴파일에 대해 설명하고 있으니 관심 있으신 분은 방문해 보시기 바랍니다.
6 커널 빌드하기 #
6.1 make-kpkg #
커널을 빌드하기 위해서는 "make-kpkg"를 실행해야 합니다. make-kpkg는 쉘 스크립트로, 자동으로 "make dep; make clean; make bzImage; make modules"를 순서대로 실행해 줍니다. 몇분 정도 시간을 들여 make-kpkg 매뉴얼을 읽어 보십시오. make-kpkg 명령어는 꽤 복잡해서 처음에는 거부감이 느껴질 수도 있습니다. make-kpkg의 기본 문법은 다음과 같습니다.
bash:/usr/src$ make-kpkg <options> <target>
여기서 <target>은 커널 이미지가 될 것입니다. 옵션 중에서는 제일 중요한 "--append-to-version"과 "--revision"에 대해서 알아보도록 하겠습니다.
6.2 --append-to-version #
첫번째 옵션은 커널 버젼에 원하는 문자를 더할 수 있게 해줍니다. 영어 알파벳이나, "+"와 "."은 사용할 수 있으나 "_"은 사용할 수 없습니다.
다음은 필자의 리눅스 커널입니다.
bash:/usr/src$ /usr/src/$ uname -a Linux Handrake 2.6.12-10-386 #1 Mon Jan 16 17:18:08 UTC 2006 i686 GNU/Linux

--append-to-version을 쓸 때에는 데비안 커널에서 자주 사용되는 "-686", "-K7", "-sparc"와 같은 것은 피하는게 좋습니다.
커널 모듈들은 /lib/modules 안의 디렉토리에 존재합니다. 그러므로 새로운 이름의 커널 이미지를 설치할 때마다 패키지 인스톨러는 /lib/modules에 새 모듈 디렉토리(커널 이름을 일부 포함한)를 생성시킬 것입니다.
이 말은 --append-to-version을 사용하면 다른 이름으로 커널 이미지를 빌드할 수 있을 뿐만 아니라 새 커널 모듈들이 /lib/modules 안에 존재하는 다른 커널 모듈들과 충돌하는 것을 막아준다는 말입니다.

만약 이미 있는 커널과 같은 이름으로 커널을 설치한다면(같은 버젼에 --append-to-version으로 같은 이름으로 해주었을 때), 새 커널은 이전 것을 덮어쓰게 됩니다. 여기서 그만두라는 경고가 나오는데 그만두는게 좋습니다. --append-to-version으로 다른 이름을 설정한 뒤 빌드합니다.
6.3 --revision #
또다른 make-kpkg 옵션은 "--revision"인데, 이 옵션은 커널 이름이 아닌 데비안 팩키지의 이름을 변경할 수 있게 해줍니다. --append-to-version처럼 "+"와 "."는 가능하나 "_"는 사용이 불가능합니다. --revision 뒤에 아무 것도 지정해 주지 않으면 make-kpkg는 자동으로 "10.00.Custom"을 붙입니다.
다만 여기서 주의할 점은 --revision에 다른 값을 지정해 주었다고 해서 같은 이름의 커널 간의 충돌이 방지되는 것은 아니라는 것입니다. 이 옵션은 단지 유저에게 두 커널이 완전히 같지 않다는 것을 알려주는 것 뿐으로 흔히 같은 커널을 작은 변화만으로 다시 컴파일하거나 할 때 사용됩니다.
6.4 커널 팩키지 이름 #
데비안 커널 이미지 파일명은 다음의 형식을 지닙니다.
kernel-image-(kernel-version)(--append-to-version)_(--revision)_(architecture).deb
(커널) 팩키지 이름은 첫번째 밑줄 "_" 전의 문자열과 일치합니다.
bash:/usr/src$ ls kernel-image-2.6.12.10.181004_10.00.Custom_i386.deb
이제는 왜 make-kpkg 옵션에 밑줄을 쓸 수 없는지 알게 되었을 (팩키지 이름을 다르게 할 수 있으므로) 것입니다.
개인적으로는 매번 커널 컴파일을 할 때마다 --append-to-version으로 다른 값을 주고 make-kpkg가 지정하는 기본 revision을 사용하는걸 추천합니다. 필자에겐 날짜가 조합된 값이면 충분하다고 생각되나 다르게 하고 싶으면 그렇게 해도 큰 상관은 없습니다.

make-kpkg의 두 옵션들이 뭐가 다른지 잘 이해가 가지 않거나 위에 추천한 대로 옵션을 주지 않고 싶으면 /usr/share/doc/kernel-package/README.gz 을 읽어보십시오. (쉬운 방법은 "zless README.gz"으로 보는 것입니다.) make-kpkg와 데비안 팩키지들에 전체적으로 좀더 익숙해 질 때까지는 그것들에 대한 사람들의 취향 같은것에는 신경쓰지 않는게 좋습니다. (이건 확실치 않네요. 좀더 좋은 의견 있으시면 고치거나 코멘트를 달아주세요)
6.5 fakeroot #
src 그룹에 자기 계정을 추가 시켜놓았다면 대부분의 커널 팩키지 작업은 일반 유저 권한만으로 가능합니다. 하지만 커널 패키지의 몇몇 파일들(커널이나 커널 모듈들)은 루트 권한으로 만들고 돌리는게 좋습니다.
fakeroot를 사용하면 make-kpkg를 일반 유저 권한으로 시작하고 대부분의 작업을 마치는 것이 가능합니다. 맨 끝부분에 가서 fakeroot는 루트 환경을 흉내내 커널 이미지 팩키지를 만들게 됩니다.
make-kpkg 매뉴얼은 fakeroot를 이용하는 한 방법을 제시해 줍니다; 이 문서에서는 fakeroot를 make-kpkg 앞에 직접 입력하여 다음과 같이 간단하게 처리하도록 하겠습니다.
fakeroot make-kpkg <options> <target>
드디어, 여기까지 왔습니다. 이젠 커널 이미지를 만들 준비가 된 것입니다.
bash:/usr/src/linux $ fakeroot make-kpkg clean
한 다음, 다음을 실행합니다.
bash:/usr/src/linux $ fakeroot make-kpkg --append-to-version=.181004 kernel_image --initrd binary
이제는 컴퓨터가 컴파일을 마치는걸 기다리는 일만 남았습니다. 컴퓨터가 열심히 일하는 동안 잠시 다른 일을 하고 오세요.
7 커널 이미지 팩키지 설치하기 #
커널 이미지를 빌드했으면 이제 커널과 커널 모듈을 포함한 커널 이미지 팩키지를 설치합니다. 먼저 빌드가 제대로 되었는지 /usr/src 디렉토리로 가서 확인해봅니다.
bash:/usr/src/linux$ cd ..
bash:/usr/src$ ls kernel-image-2.6.12.10.181004_10.00.Custom_i386.deb
linux@ linux-source-2.6.12.10/ linux-source-2.6.12.10.tar.bz2
제대로 되어있는 것을 확인할 수 있습니다. 여기서 눈여겨 볼 점은 --append-to-version으로 지정해준 커널 이름이 팩키지 파일명의 일부가 되었다는 점입니다.
커널과 커널 모듈을 설치하기 위해서는 다음과 같이 합니다.
bash:/usr/src$ sudo dpkg -i kernel-image-2.6.12.10.181004_10.00.Custom_i386.deb
커널 이미지 팩키지를 디스크로부터 설치하려면 (데비안 아카이브에서 설치와는 달리) 파일명을 정확히 써줘야 합니다. 물론 탭으로 자동완성 기능을 쓸 수도 있습니다.
모든 것이 잘 풀렸으면 남은건 리부팅하는 것뿐입니다. 만약 새로 만든 커널로 부팅이 안된다면, 이전 커널을 사용하거나 부팅 디스크를 넣고 재시작합니다. 커널 설정으로 다시 가서 이것저것 바꾼 다음 다시 시도해 봅니다.