2007년 5월 25일 금요일

Custom kernel 빌드하기

이 부분이 다른 어떤 OS에서도(같은 계열인 FreeBSD, OpenBSD 도 포함) 맛볼수 없는 어찌보면 디자인한 분의 경외심까지 일으키는 부분입니다. 보통 Linux에서 맨 처음 임베디드보드에 개발을 한다고 하면 Target machine인 임베디드보드는 단지 실행환경만 갖춘 컴퓨터이고 Host machine(보통 x86 계열의 PC)에 Cross compiler를 설치해서 소스를 컴파일해서 결과물로 나온 실행파일을 Target machine에 전송하여 실행이 제대로 되는지 확인하는 방법을 이용합니다. 뭐 사실 CF Card에 NetBSD를 설치했으니 compiler가 설치되어 있어서 직접 컴파일도 할수 있습니다. 참 좋은 세상이죠^^ 하지만 kernel build와 같이 많은 시간을 잡아먹는 작업을 Target machine에서 직접한다는 것은 조금은 바보 같은 짓일겁니다. 그런데 Linux에서 Cross compiler 설치하는 작업이 NetBSD에서는 없습니다. 엄밀하게는 존재하겠지만 이것 역시 compile 작업을 통해서 임시로 설치되게 됩니다. 즉, Cross compiler(NetBSD에서는 tool-chain 이라고 합니다.) 역시 컴파일 단계를 거치게 됩니다. 재미있죠. 어쩌면 이것 역시 바보같은 짓 아니냐 할지 모르지만 NetBSD가 얼마나 많은 플랫폼에 포팅이 되어있는지를 안다면 너무나 편리합니다. Linux라고 한다면 Target machine이 서로 다른 CPU를 가진 보드라고 한다면 아마도 Host machine을 각 임베디드 보드 개수만큼 마련해서 Cross compiler를 설치해 두어야 할겁니다. 하지만 NetBSD는 해당 Target machine에 해당하는 tool-chain을 미리컴파일 해두면 그것으로 족합니다. 내용이 너무 장황하게 다른쪽으로 빠지는 것 같아 이만 줄이고 실제 어떻게 진행되는지 출력내용을 가지고 한번 보겠습니다.

저는 편의상 vmware를 이용해서 NetBSD 3.1을 설치해서 Host machine으로 사용하고 있습니다.

1st. tool-chain 만들기
----------------------
netbsd: {91} ./build.sh -m evbarm tools
===> build.sh command: ./build.sh -m evbarm tools
===> build.sh started: Fri May 11 19:23:40 KST 2007
===> No nonexistent/bin/nbmake, needs building.
===> Bootstrapping nbmake
checking for sh... /bin/sh
checking for gcc... cc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for executable suffix...
checking for object suffix... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking how to run the C preprocessor... cc -E
.........
===> Tools built to /usr/src/tooldir.NetBSD-3.1-i386
===> build.sh started: Fri May 11 19:23:40 KST 2007
===> build.sh ended: Fri May 11 19:46:06 KST 2007
===> Summary of results:
build.sh command: ./build.sh -m evbarm tools
build.sh started: Fri May 11 19:23:40 KST 2007
No nonexistent/bin/nbmake, needs building.
Bootstrapping nbmake
MACHINE: evbarm
MACHINE_ARCH: arm
TOOLDIR path: /usr/src/tooldir.NetBSD-3.1-i386
DESTDIR path: /usr/src/destdir.evbarm
RELEASEDIR path: /usr/src/releasedir
Created /usr/src/tooldir.NetBSD-3.1-i386/bin/nbmake
makewrapper: /usr/src/tooldir.NetBSD-3.1-i386/bin/nbmake-evbarm
Updated /usr/src/tooldir.NetBSD-3.1-i386/bin/nbmake-evbarm
Tools built to /usr/src/tooldir.NetBSD-3.1-i386
build.sh started: Fri May 11 19:23:40 KST 2007
build.sh ended: Fri May 11 19:46:06 KST 2007

시작, 끝나는 시간을 보면 알겠지만 조금 시간이 걸립니다. 뭐 이걸 가지고 딴지 건다면 뭐라 할말은 없습니다.

2nd. kernel 설정하기
---------------------
/usr/src/sys/arch/evbarm/conf 에 있는 걸 이용해서 설정 파일 만들기 여기서는 기본적으로 있는 TS7200_INSTALL 이용하겠습니다.

3rd. kernel 빌드
-----------------
netbsd: {92} ./build.sh -u -m evbarm kernel=TS7200_INSTALL
.......
===> Kernels built from TS7200_INSTALL:
/usr/src/sys/arch/evbarm/compile/obj/TS7200_INSTALL/netbsd
===> build.sh started: Fri May 11 20:03:09 KST 2007
===> build.sh ended: Fri May 11 20:11:19 KST 2007
===> Summary of results:
build.sh command: ./build.sh -u -m evbarm kernel=TS7200_INSTALL
build.sh started: Fri May 11 20:03:09 KST 2007
No nonexistent/bin/nbmake, needs building.
Bootstrapping nbmake
MACHINE: evbarm
MACHINE_ARCH: arm
TOOLDIR path: /usr/src/tooldir.NetBSD-3.1-i386
DESTDIR path: /usr/src/destdir.evbarm
RELEASEDIR path: /usr/src/releasedir
Created /usr/src/tooldir.NetBSD-3.1-i386/bin/nbmake
makewrapper: /usr/src/tooldir.NetBSD-3.1-i386/bin/nbmake-evbarm
Updated /usr/src/tooldir.NetBSD-3.1-i386/bin/nbmake-evbarm
Building kernel without building new tools
Building kernel: TS7200_INSTALL
Build directory: /usr/src/sys/arch/evbarm/compile/obj/TS7200_INSTALL
Kernels built from TS7200_INSTALL:
/usr/src/sys/arch/evbarm/compile/obj/TS7200_INSTALL/netbsd
build.sh started: Fri May 11 20:03:09 KST 2007

tool-chain 빌드시간보다는 적게 걸렸네요^^

4th. 빌드한 kernel 확인하기
-----------------------------
netbsd: {99} pwd
/usr/obj/sys/arch/evbarm/compile/TS7200_INSTALL
netbsd: {100} ls -al net*
-rwxr-xr-x 1 pjy users 6514722 May 11 20:11 netbsd
-rwxr-xr-x 1 pjy users 6514727 May 11 20:11 netbsd-epe0
-rwxr-xr-x 1 pjy users 6002992 May 11 20:11 netbsd-epe0.bin
-rwxr-xr-x 1 pjy users 6514726 May 11 20:11 netbsd-sd0
-rwxr-xr-x 1 pjy users 6002992 May 11 20:11 netbsd-sd0.bin
-rwxr-xr-x 1 pjy users 6514726 May 11 20:11 netbsd-wd0
-rwxr-xr-x 1 pjy users 6002992 May 11 20:11 netbsd-wd0.bin
-rwxr-xr-x 1 pjy users 6002992 May 11 20:11 netbsd.bin

Jesse Off 씨께서 요렇게 다양한 kernel build물이 나오게끔 설정파일을 만들어 두었습니다. 이건 앞에서의 설정 파일만 조금 보더라도 금방 이해가 갈 겁니다. 그런데 아직 .bin으로 끝나는 것과 아닌것과의 차이를 잘 모르겠네요. CF Card Mount 용 이미지는 netbsd-wd0.bin 이고 CF Card로의 NetBSD 설치에 사용되는 이미지는 netbsd.bin 입니다. 원하는 이미지를 이제 tftp 서버에 위치해두고 Redboot를 이용해서 Kernel을 로드하여 기동하면 다음과 비슷한 메시지가 나오게 됩니다.

RedBoot> go
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.

NetBSD 3.1 (TS7200_INSTALL) #0: Fri May 11 20:11:11 KST 2007
pjy@netbsd.myhome:/usr/obj/sys/arch/evbarm/compile/TS7200_INSTALL

로그인후 uname 명령으로도 알수 있구요.


마지막으로 한가지 더 이야기하자면 지금까지 언급한 kernel 빌드 단계가 굳이 임베디드를 위한 cross-compile 환경이 아닌 native 환경에서도 동일하다는 사실. 놀랍죠~ NetBSD의 "Clean Design" 이라는 문구가 단지 말이 아닌 실체로 느껴지는 순간이기도 하죠.

댓글 없음: