반응형
Device Driver를 공부하려고 하다가 linux kernel source가 필요해서 커널소스 받는 법을 찾아보았다.
일단 내가 쓰고있는 커널 버전을 알아야 할것 같다.
#uname -r 이라고 하면 커널 버전이 나온다.
그리고 우분투니까 apt-get 으로 커널 소스를 받아야 하는데
# apt-cache search linux-source-* 라고 하면 나온다.
그리고
#apt-get install linux-source-<버전번호>(위에서 검색했던 버전 번호)
를 치면 다운이 시작된다.
소스를 다 받으면
/usr/src/디렉토리 안에 파일이 있다.
나는 linux-source-2.6.28.tar.bz2 파일을 받았는데
이것을
#tar xjf linux-source-2.6.28.tar.bz2 로 풀면 소스가 있다.


출처 : http://floor.textcube.com/42

Kernel 만들기

가끔씩 사람들은 자신에 맞는 추가적인 어떤것? 들이 들어가거나 동적으로 하드웨어의 드라이버가 커널에 장착될수 있도록 최적화된 커널을 필요로 할때가 있습니다. 말이 괜스레 어려워 지네요.. 번역을 하려니까.. 흠..

어쨋거나 자신이 사용하는 커널을 이럴경우 좀 만져줘야 할때가 있는데 아래의 내용은 이럴때 참고가 되는 내용이랍니다.
이 내용은 Debian 계열의 리눅스에서 Kernel 2.6.x 버전에 적용될수 있는 내용이니까 참고하세요..

먼저 해 둘것들..
컴파일러와 각종 필요한 도구들 설치

우선 아래의 프로그램들이 설치되어 있어야 합니다.

build-essential

kernel-package

libncurses5-dev (ncurses 를 기반으로 하는 화면에서 설정하기 위한것) 혹은
libgtk2.0-dev libglib2.0-dev libglade2-dev (GTK 기반 화면에서 설정하려면 설치해야 할것) 혹은
libqt3-mt-dev (Qt 기반 화면에서 설정하려면 필요한것 Universe 저장소에 있을것임..).

커널소스 다운받기
이미 몇몇의 패치를 포함하고 있는 Ubuntu-Kernel 의 소스는 apt 라던가 Synaptic 이라는 프로그램을 통해 패키지 형태로 다운 받아질 수 있습니다. linux-source-x.x.x 라는 이름으로 이 패키지 이름이 되어 있을거구요.. 기왕이면 현재 사용하고 있는 커널의 버전과 동일하면 좋을겁니다.. 현재 커널 버전은 콘솔에서 아래의 명령으로 알수 있습니다.

uname -r

커널 패치 다운받기(옵션항목..)

커널을 패치하려는 사람들은 보통 자기가 뭘하려고 하는지 알고 있거나 어떤 패치가 필요한지 알고 있는 사람이겠지요? 필요한 패치가 패키지 저장소에 이미 있다면 좋을텐데요.. 어떤 패치들은 Universe 저장소에 있고 이럴경우 패치 버전을 신경써서 잘 봐서 선택하시면 된답니다. 흠.. 뭐 저같은 초보가 이게 뭔지 알수는 없지만..언젠가 이런걸 제대로 알날이 오겠지요... 일단 커널도 하나의 프로그램이다보니.. 적절한 이유에 의해 특별한 코드를 더 집어넣거나 고친것이 아닐까 생각해 봅니다...

커널 소스 압축풀고 소스가 있는 곳으로 가기.
커널 소스를 다운 받으면 아마 tar.bz2 압축형태로 /usr/src 디렉토리에 저장되어 있을겁니다. 그리고 이 위치로 가야겠지요..

아래의 과정은 root 권한으로 한 콘솔에서 시행되어야 합니다.
root 터미날을 열고 하시는게 좋을듯.. (왜 저에게는 루트 터미날을 여는 아이콘이 그놈에 기본적으로 없을까요.. 보통은 그놈의 프로그램-보조 프로그램-root 터미날 이렇게 있다고 하는데...흠.. ).

sudo tar -xjvf linux-source-<버전번호>
cd linux-source-<버전번호>

(옵션항목) : 커널 패치하기..
Synaptic같은 패키지 관리 프로그램으로 커널 패치를 위해 패치를 다운 받으셨다면 아마 usr/src/kernel-patches/diffs 디렉토리 아래에 저장되어 있을겁니다..
아마 gz- 나 혹은 bz2- 압축으로 Diff-파일로 되어 있는 경우가 많다네요..(*.diff.gz 나 *.diff.bz2 같은 파일이름이죠..). 어쨋거나 요놈들은 아래의 명령으로 패치한답니다..

zcat /usr/src/kernel-patches/diffs/<패치 디렉토리>/<패치 파일이름> | sudo patch -p1

bz2-압축일경우 gunzip 을 bunzip2 으로 바꿉니다.

커널 설정하기

커널 설정값들은 .config 파일에 저장되어집니다. 이미 설치된 커널의 설정값들을 보면 참고가 어느정도 되겠지요..아래 명령으로 현재의 디렉토리에 이미 설치된 커널의 설정값 파일을 복사해둡니다.

sudo cp /boot/config-<Kernelversion> .config

힌트:
지금 독자들의 컴에서 돌아가고 있는 커널의 설정값들은 /proc 디렉토리에 있는 압축된 파일에서 가져올수도 있다네요..유분투의 기본 커널에서는 이게 활성화 되지 않아서 여기서 가져오는게 되지 않을텐데 스스로 컴파일한 경우 이게 활성화 되어서 여기서 가져올수 있을거랍니다.. 지금 돌아가고 있는 커널이 스스로 컴파일 한 커널인 경우 암튼 아래의 명령으로 지금 돌아가고 있는 커널의 설정값을 가져올수도 있다고 합니다.

sudo zcat /proc/config.gz > .config

그리고 아래의 명령

sudo make defconfig

이걸로 아주 기본적이면서 최소의 설정을 가진 기본 최소 설정값을 만들어 낼수도 있답니다. 물론 그다음에 이 값들을 조금 수정해줘야 겠지만요.. 이 경우 ext2 나 ext3 같은 파일시스템하에서만 요렇게 할수 있다네요.. 다른 파일시스템에서는 이렇게 하지 말라는것 같은데.. 왜 그런지는 고수님들의 댓글을 기대해봅니다. 아님 제가 번역을 엉터리로 했을수도...

암튼.. 이제 개인적인 설정을 할 차례입니다. 아까 처음에 언급한대로 어떤 화면에서 설정하기로 했느냐에 따라(위에서 이것에 따라서 각각 다른 패키지-프로그램-들을 설치했었지요.. ) 아래의 명령들중 하나를 실행해줍니다.

sudo make menuconfig
(ncurses경우), 혹은

sudo make gconfig
(GTK의 경우), 혹은

sudo make xconfig
(Qt의 경우)

이제 행운을 빕니다. 잘 설정해 보시길.. 구체적인 설정값들에 대해서는 뭐..
각자 웹을 뒤져서 알아보시길.. 개인적으로 참..저도 궁금합니다. 뭘 의미하는건지.. 쩝.. 이런게 한글로 메뉴얼 같이 되어 있으면 좋을텐데..

만약 새로운 커널버전이 또 나와서 새로운 커널버전으로 옮기고 싶다면 예전 커널 디렉토리에 있는 .config파일을 이제 새 커널 디렉토리로 복사합니다.. 그리고 새 커널 디렉토리로 우선 가셔서(cd 명령으로..)

sudo make oldconfig

명령을 실행합니다. 이렇게 하면 새로운 커널의 새로운 부분을 위한 설정값들만 고칠수 있게 사용자에게 물어보게 된다고 합니다. 요부분은 제가 잘 이해가 안됩니다.. 해봐야 알텐데..암튼.. 잘 아시는분은 좀 도와주세요..

커널 컴파일하기

위에서 개인적인 설정을 한 뒤에 이제 커널을 컴파일 해야 합니다.
아래의 명령으로 컴파일하면 나중에 컴파일된 커널을 손쉽게 설치할수 있도록 .deb 파일까지 한꺼번에 만들어 버릴수 있어서 아래의 명령으로 Debian 계열 리눅스는 커널을 컴파일하는게 좋답니다.(make-kpkg 명령으로 컴파일한걸 데이안 패키지로 만드는 것.)이건 kernel-image, kernel-headers, kernel-doc 과 kernel-source를 모두 포함하는것 같습니다..

sudo make-kpkg --initrd --revision i686ver1 binary

"i686ver1" 라고 표시된 부분은 적절히 자신이 편한 명칭을 바꿔 주시면 됩니다. 혹시나 이미 같은 이름의 파일이 있다면 동일한 이름이 되지 않도록 조심해야겠지요..

binary 라는 파라메터는 .deb 패키지의 생성시에 바이너리 파일로 만들라는 뜻입니다. 단지 커널 이미지 패키지만 만들려면 binary 라는 파라메터 대신 kernel_image 라고 써주면 됩니다. 더 추가적인 옵션을 보고싶으시다면
man make-kpkg 명령으로 쭉~ 읽어보시길..

혹시: "arch/i386/boot/bzImage" 파일이 없다는 에러가 난다면

sudo make clean bzImage && sudo make-kpkg --initrd kernel_image && sudo make && sudo make-kpkg --initrd binary
명령을 주세요..

initrd 파라메터에 대해: 자신의 하드웨어를 잘 알고 있다면 initrd 꼭 필요한건 아니랍니다.(initrd 라는게 뭔지 잘 몰라요.. 고수님들.. 좀 자세히 알려주세요..) 자신만의 커널 설정시에 미리 적절히 커널자체에 포함되도록 설정해서 컴파일해버리니까요.. 암튼.. 이런식으로 하드웨어 지원을 모두 기본 커널에 포함되게 해버리면 커널 설정할때 initrd 를 지원하지 않도록 설정합니다.그리고 하드웨어의 드라이버를 root-디스크(대부분 하드디스크를 위한 ATAPI / IDE 드라이버)에 항상 연결되게 해버리고 모듈로 설정하지는 않겠지요.. 그러니까.. 예를 들어 USB 마우스를 항상 사용하시는 분은 굳이 USB 를 모듈로 지원하게끔할 필요는 없다는 말입니다. 그냥 커널자체가 지원을 하도록 해버릴수도 있다는 말인데.. 뭐 .. 이런건 각자 좋을대로 하면될것 같습니다... 제생각엔 말이죠.. 혹시 외부 Firewire 디스크를 처음 부팅시에 연결하려면 Firewire 드라이버가 커널에 들어 있어야겠지요..

암튼.. 이럴경우는 아래명령을 사용합니다.

sudo make-kpkg binary

그리고 혹시 make-kpkg 명령으로 컴파일했다가 또 설정을 바꿔서 다시한번 make-kpkg 명령으로 컴파일 하려고 한다면 그전에 아래의 명령을 한번 실행하랍니다. 왜일까요??

sudo make

만일 커널이 나중에 또다시 패치되어야 한다면 기존에 있는 여러가지 잡다한 것들을 지우고 다시 재컴파일해야 할 필요가 있답니다. 이럴때에는

sudo make clean

명령으로 컴파일시에 생성되었던 잡다한것들을 깨끗이 지우랍니다.
만약 make-kpkg를 이용해서 컴파일 했었다면 아래의 명령으로 지워줍니다.

sudo make-kpkg clean

이래야 Stamp 파일(?)도 지워진답니다.

커널 설치

이제 컴파일되고 동시에 .deb 으로 패키지화된 커널을 아래의 명령으로 설치하는겁니다.

sudo dpkg -i ../kernel-image-<xxx>.deb

아래의 명령으로는

sudo dpkg -r kernel-image-<xxx>

기존에 설치된 커널을 삭제하는거랍니다.
근데 이렇게 삭제하는 명령은 만약 무슨일이 있을때 대안으로 부팅할수 있는 커널이 존재할때 삭제하랍니다. 혹시 지워버렸다가 뭐가 잘못되면 새롭게 만든커널 말고 예전의 커널이 필요할때가 있으니까요!

새롭게 부팅하고 새 커널 테스트하기

새롭게 부팅하면 새 커널이 부트매니져(Grub 같은..)의 리스트에 떡하니 올라와 있을거랍니다. 컴파일한걸 동시에 .deb 패키지로 만들어서 설치했기에 가능한 일인듯..

새롭게 만든 커널 크기 비교해보기

아래의 예처럼 /boot/vmlinuz 를 확인해보면 됩니다.

ls -lh /boot/vmlinuz-2.6.12 //새 Kernel
-rw-r--r-- 1 root root 1,1M 2005-12-29 12:14 /boot/vmlinuz-2.6.12

ls -lh /boot/vmlinuz-2.6.12-10-386 //예전 Kernel
-rw-r--r-- 1 root root 1,2M 2005-12-22 14:14 /boot/vmlinuz-2.6.12-10-386

위의 예에서는 새 커널이 0,1 MB 작아졌네요...

반응형

'Linux > Linux 일반' 카테고리의 다른 글

우분투 ubuntu 글꼴 적용 font 적용  (0) 2010.02.02
VirtualBox에서 게스트 확장 설치하기.  (0) 2009.11.13
vmware 삑 소리 끄기.  (1) 2009.10.09
Posted by Real_G