ubuntu에서 커널 패키지화 하기
리눅스 2006. 6. 23. 23:31
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 )
처음 하는 번역이라 아직 많이 미숙합니다. 부족한 점이 있어도 이해 부탁드립니다. 오타나 잘못된 번역이 보이면 기탄없이 고치거나 코멘트 달아주세요
![^^ ^^](http://www.ubuntu.or.kr/ubuntu/imgs/smile/%5E%5E.gif)
[edit]
1 소개 #
리눅스 커널은 우분투 운영체제의 핵심입니다. 우분투에서 제공하는 커널에는 유저가 필요한 모든 드라이버가 들어 있습니다. 하지만 만약 커널의 일부를 살짝 바꾸거나 어떠한 이유로 커널 전체를 컴파일해야 하는 일이 있을 경우에는 이 ?HowTo가 도움이 될 수 있을 것입니다.
좀더 간단(하지만 같은 내용을 담고 있는)한 문서는
![[https]](http://www.ubuntu.or.kr/ubuntu/imgs/https.png)
[edit]
2 준비 #
커널을 빌드하기 위해서는 다음의 팩키지들이 필요합니다 build-essential fakeroot kernel-package
bash:~$ sudo apt-get install build-essential fakeroot kernel-package
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
커널은 /usr/src/ 디렉토리에 빌드되기 때문에 유저는 src 그룹에 속해 있어야 합니다. (fakeroot나 sudo등을 사용하면 그냥 되는듯 합니다.)
bash:~$ sudo adduser my_username src Adding user my_username to group src... Done.( my_username은 자기 이름으로 바꿔주는 정도의 센스는 필요하겠죠?
![^^ ^^](http://www.ubuntu.or.kr/ubuntu/imgs/smile/%5E%5E.gif)
로그아웃했다가 다시 로그인을 하거나 su를 사용합니다.
bash:~$ su my_username bash:~$ groups my_username src audio adm dialout cdrom floppy video plugdev lpadmin보이는 그룹들 중에 src이 있어야 합니다.
[edit]
3 소스 다운로드 #
원하는 커널 소스를 다음과 같이 고릅니다. (역자주: kernel.org 등에서 다운받은 커널도 물론 됩니다. 하지만 이전 커널에서는 되던 몇몇 기능이 지원되지 않을 수 있습니다. 제 경우에는 2.6.15로 올리면 이상하게 잘 되던 wireless가 안되더군요. 1월 26일 : 밑에 wireless에 대한 해결방안을 적어놓았습니다.)
bash:~$ apt-cache search source 2.6
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
정답: 리눅스 커널이 새로운 버젼 넘버링을 사용하기 때문입니다. 자세한 정보는
![[http]](http://www.ubuntu.or.kr/ubuntu/imgs/http.png)
kernel-source는 데비안용이고 linux-source는 우분투용이기 때문에 가능한한 linux-source를 사용하는 것이 좋습니다. 데비안 팩키지의 의존성 문제가 완전히 해결된게 아니므로 "uninstalled package kernel-source"와 같은 경고가 나올 수 있으나, 무시해도 큰 문제는 없습니다 -- Bronson
(역자주 : 이 정보는 좀 오래된 것 같습니다. 전 이런 경고를 한번도 본 적이 없거든요.)
커널 소스를 다음의 명령어로 다운로드 받습니다.
bash:~$ sudo apt-get install linux-source
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
이제 소스가 /usr/src에 다운로드 돼있을 것입니다.
[edit]
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
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
그리고 다음과 같이 압축을 풉니다.
bash:/usr/src$ tar xjvf linux-source-2.6.12.10.tar.bz2
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
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
[edit]
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만약 X를 사용하지 않거나 마우스를 쓰지 않고 싶으면 다음과 같이 합니다.
$ 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
bash:/usr/src/linux$ make menuconfig
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
![[https]](http://www.ubuntu.or.kr/ubuntu/imgs/https.png)
[edit]
6 커널 빌드하기 #
[edit]
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"에 대해서 알아보도록 하겠습니다.
[edit]
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
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
커널 모듈들은 /lib/modules 안의 디렉토리에 존재합니다. 그러므로 새로운 이름의 커널 이미지를 설치할 때마다 패키지 인스톨러는 /lib/modules에 새 모듈 디렉토리(커널 이름을 일부 포함한)를 생성시킬 것입니다.
이 말은 --append-to-version을 사용하면 다른 이름으로 커널 이미지를 빌드할 수 있을 뿐만 아니라 새 커널 모듈들이 /lib/modules 안에 존재하는 다른 커널 모듈들과 충돌하는 것을 막아준다는 말입니다.
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
[edit]
6.3 --revision #
또다른 make-kpkg 옵션은 "--revision"인데, 이 옵션은 커널 이름이 아닌 데비안 팩키지의 이름을 변경할 수 있게 해줍니다. --append-to-version처럼 "+"와 "."는 가능하나 "_"는 사용이 불가능합니다. --revision 뒤에 아무 것도 지정해 주지 않으면 make-kpkg는 자동으로 "10.00.Custom"을 붙입니다.
다만 여기서 주의할 점은 --revision에 다른 값을 지정해 주었다고 해서 같은 이름의 커널 간의 충돌이 방지되는 것은 아니라는 것입니다. 이 옵션은 단지 유저에게 두 커널이 완전히 같지 않다는 것을 알려주는 것 뿐으로 흔히 같은 커널을 작은 변화만으로 다시 컴파일하거나 할 때 사용됩니다.
[edit]
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을 사용하는걸 추천합니다. 필자에겐 날짜가 조합된 값이면 충분하다고 생각되나 다르게 하고 싶으면 그렇게 해도 큰 상관은 없습니다.
![<! / /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
[edit]
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이제는 컴퓨터가 컴파일을 마치는걸 기다리는 일만 남았습니다. 컴퓨터가 열심히 일하는 동안 잠시 다른 일을 하고 오세요.
[edit]
7 커널 이미지 팩키지 설치하기 #
커널 이미지를 빌드했으면 이제 커널과 커널 모듈을 포함한 커널 이미지 팩키지를 설치합니다. 먼저 빌드가 제대로 되었는지 /usr/src 디렉토리로 가서 확인해봅니다.
bash:/usr/src/linux$ cd ..제대로 되어있는 것을 확인할 수 있습니다. 여기서 눈여겨 볼 점은 --append-to-version으로 지정해준 커널 이름이 팩키지 파일명의 일부가 되었다는 점입니다.
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
커널과 커널 모듈을 설치하기 위해서는 다음과 같이 합니다.
bash:/usr/src$ sudo dpkg -i kernel-image-2.6.12.10.181004_10.00.Custom_i386.deb커널 이미지 팩키지를 디스크로부터 설치하려면 (데비안 아카이브에서 설치와는 달리) 파일명을 정확히 써줘야 합니다. 물론 탭으로 자동완성 기능을 쓸 수도 있습니다.
모든 것이 잘 풀렸으면 남은건 리부팅하는 것뿐입니다. 만약 새로 만든 커널로 부팅이 안된다면, 이전 커널을 사용하거나 부팅 디스크를 넣고 재시작합니다. 커널 설정으로 다시 가서 이것저것 바꾼 다음 다시 시도해 봅니다.
[edit]
8 최종 정리 #
[edit]
8.1 커널 홀드 #
--append-to-version을 사용했다면 apt-get로 커널 업그레이드를 하는데 큰 문제가 없습니다. 그렇지만 영 불안하다면 다음과 같은 방법으로 좀 더 확실히 해둘 수도 있습니다.
bash:~$ echo "kernel-image-2.6.12.10.181004 hold" | sudo dpkg --set-selections물론 커널 이름은 자기것으로 바꿔줘야 합니다. dpkg가 알고 있는 팩키지( 인스톨된 팩키지나 아카이브 리스트에 있는 것들 )를 가리키려면 파일명을 전부 써주지 않고 팩키지 이름만을 씁니다. "|" 문자는 Shift-로 쓸 수 있습니다. 그러면 팩키지가 홀드가 되어있는지 확인합니다.
bash:~$ dpkg --get-selections | grep kernel-image kernel-image-2.6.12.10.181004_10.00.Custom_i386.deb hold
![<! /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
[edit]
8.2 심볼릭 링크 제거 #
다음으로 할 일은 /usr/src 디렉토리에 만들어 놓은 심볼릭 링크를 제거하는 일입니다. 여기에는 다음과 같은 몇가지 이유가 따릅니다.
1. 다음번에 데비안 아카이브가 아닌 곳에서 커널을 직접 다운받고 압축을 풀 때 이전 커널 소스 디렉토리를 덮어쓸 위험이 있습니다.
2. 비록 데비안 아카이브에서 커널 소스를 받고 압축을 다른 곳에 푼다고 하더라도 "linux" 심볼릭 링크가 예전 소스에 걸려 있는것을 잊고 그냥 컴파일 할 가능성이 꽤나 높습니다.
3. 패치나 다른 소스 코드를 특정한 소스 트리에 포함 시키고자 할 때 엉망이 되어 버릴수도 있습니다. 하지만 심볼릭 링크를 제거해 주면 이러한 것을 막을수 있죠.
심볼릭 링크를 제거하려면 다음과 같이 합니다.
bash:~$ rm /usr/src/linux
[edit]
8.3 커널 백업하기 #
꼭 필요한 작업은 아니지만 만들어놓은 맞춤형 커널(.deb로 되어있는 파일)을 백업해 놓는 것이 좋습니다. 안전한 곳으로 복사 해놓습니다.
![<! /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
[edit]
8.4 부팅 디스크 만들기 #
방금 설치한 커널용으로 부팅 디스켓을 또 하나 만듭니다. 이전 부팅 디스켓을 덮어 쓰기보단 새 디스켓을 쓰기를 추천합니다; 현재의 커널이 안정적으로 작동하는지 시간을 두고 볼 필요가 있기 때문입니다. 시스템을 망쳤을 때 부팅 디스켓이 빛을 발할 것합니다.
bash:/usr/src# cd /boot bash:/boot# mkboot /boot/vmlinuz-2.4.18.030320
[edit]
8.5 다음 커널 만들기 #
만약 새로운 사운드 카드를 사거나 깜박 잊고 빠뜨렸던 기능을 추가하고자 할때는 커널 설정만 다시 해주면 됩니다. "fakeroot make-kpkg clean"을 해준 다음 --append-to-version에 다른 값을 주고 새로 빌드합니다. 대충 다음과 같은 순서를 따릅니다.
bash:~$ cd /usr/src bash:/usr/src$ ln -s linux-source-2.6.12.10 linux
bash:/usr/src$ cd linux
bash:/usr/src/linux$ make xconfig (커널 재설정)
bash:/usr/src/linux$ fakeroot make-kpkg clean (뭔가 많이 지울 것입니다.)
bash:/usr/src/linux$ fakeroot make-kpkg --append-to-version=.181004 kernel_image --initrd binary
(화면 가득히 뭔가가 나올 것입니다.)
[edit]
8.6 이전 설정 사용하기 #
맞충형 커널을 설치하면 커널 설정은 자동으로 /boot/config-x.y.z로 복사됩니다. 만약을 위해 백업 (되도록이면 여러 군데로) 해놓습니다.
옵션들의 미로를 뚫고 원하는 하드웨어와 기능들을 모두 지원하는 커널을 만들어 놓았는데 오늘 새 버젼의 커널이 나온다면 당연히 또 업그레이드를 하고 싶을 것입니다. 이럴 때 커널 설정을 처음부터 다시 해야 할까요? 그렇지 않습니다.
커널 소스를 다운로드 받고 압축을 푼 다음 심볼릭 링크를 겁니다. 그리고 /usr/src/linux로 이동한 다음 백업해 놓은 설정 파일을 복사하고 "make oldconfig"를 실행합니다.
bash:/usr/src/linux$ cp /boot/config-2.4.18.030320 .config새 커널 옵션에 대해 몇가지 물어볼 것입니다. 보통은 모든 질문에 "no"로 대답하는 것이 안전합니다; 관심있는 옵션이 있으면 미리 표시해 놓습니다.
bash:/usr/src/linux$ make oldconfig
![<! /> <!>](http://www.ubuntu.or.kr/ubuntu/imgs/smile/attention.gif)
자기만의 설정으로 최신 안정버젼의 커널을 빌드합니다.
fakeroot make-kpkg clean
[edit]
9 점검해야 할 사항들 #
- 부팅 디스켓을 만듭니다.
- 필요한 팩키지 인스톨
- build-essential fakeroot kernel-package
- build-essential fakeroot kernel-package
- 소스 트리 설정
- 자신을 src 그룹에 추가하고 로그아웃, 로그인으로 다시 들어옵니다. 그룹 설정이 잘 되었나 한번 확인해봅니다.
- 전에 걸어 두었던 심볼릭 링크를 제거합니다.
- 소스 압축을 팝니다.
- 새로 심볼릭 링크를 겁니다.
- 자신을 src 그룹에 추가하고 로그아웃, 로그인으로 다시 들어옵니다. 그룹 설정이 잘 되었나 한번 확인해봅니다.
- 커널 설정
- 이전 설정 파일을 쓰려면 cp /boot/config-x.y.z .config
- 다음중 하나를 실행합니다. make oldconfig, make xconfig, make menuconfig
- 나중을 위해 .config 파일을 백업 해놓습니다.
- 이전 설정 파일을 쓰려면 cp /boot/config-x.y.z .config
- 커널 이미지 팩키지 빌드
- fakeroot make-kpkg clean
- fakeroot make-kpkg --append-to-version=alpha+numeric.but.no.underscore kernel_image --initrd binary
- fakeroot make-kpkg clean
- 커널 이미지 팩키지 설치
- dpkg -i kernel-image-x.y.z.yy.mm.dd_10.00.Custom_i386.deb
- 리부팅
- dpkg -i kernel-image-x.y.z.yy.mm.dd_10.00.Custom_i386.deb
- 팩키지를 홀드한 다음 echo "kernel-image-x.y.z.yymmdd hold" | dpkg --set-selections로 확인합니다.
- 심볼릭 링크를 제거합니다.
- 커널 이미지를 백업합니다.
- 새 부팅 디스켓을 만듭니다.
[edit]
10 링크 #
다음은 커널을 빌드하는 또다른 방법들에 관한 링크입니다.
http://www.gurtlush.org.uk/article.php?story=20040522233716364
http://www.desktop-linux.net/debkernel.htm
http://newbiedoc.sourceforge.net/system/kernel-pkg.html
P.S. 1 역시 첫 번역이라 그런지 여기저기 마음에 안드는 부분들이 많네요. 앞으로 차차 고쳐나가겠습니다. -handrake
P.S. 2 이상하게 최신 커널인 2.6.15로는 무선 인터넷이 잘 안되네요. -handrake
P.S. 3 무선 인터넷이 안되는 문제는 ipw2200 드라이버 버젼이 2.4가 아니라서 그렇다고 합니다. http://bbs.kldp.org/viewtopic.php?t=69639
http://ubuntu.or.kr/rubybbs/index.php?bid=ubuntu&id=370&page=1
여기서 보고 2.4 버젼을 받아서 해보니 문제없이 되었습니다. 주의할점은 드라이버 파일 이름 마지막에 커널 이름을 덧붙여 줘야 한다는 점입니다. /lib/hotplug/firmware를 보시면 어떻게 되어 있는지 자세히 보실 수 있습니다. -handrake
'리눅스' 카테고리의 다른 글
로지텍 mx510 버튼 사용하기(2) (0) | 2006.06.24 |
---|---|
로지텍 mx510 버튼 사용하기 (0) | 2006.06.24 |
ubuntu에 automatix 설치하기 (0) | 2006.06.24 |
불여시 관련 다운로드 프로그램 - d4x (0) | 2006.06.24 |
ubuntu에서 고정폭 폰트가 넓게 벌어져 나오는 문제 해결 (0) | 2006.06.24 |