오늘은 임베디드 시스템에서 작은 용량의 램디스크에 많이 쓰이는 Busybox를 크로스 컴파일하는 방법을 소개합니다.

http://www.busybox.net/downloads/


비지박스를 위해서 내려 받아서 압축을 해제합니다.

cd  busybox-1.23.1/


busybox-1.23.1$ ls
applets                 console-tools  libbb            printutils
applets_sh              coreutils      libpwdgrp        procps
arch                    debianutils    LICENSE          README
archival                docs           loginutils       runit
AUTHORS                 e2fsprogs      mailutils        scripts
busybox                 editors        Makefile         selinux
busybox.links           examples       Makefile.custom  shell
busybox_unstripped      findutils      Makefile.flags   sysklogd
busybox_unstripped.map  include        Makefile.help    testsuite
busybox_unstripped.out  init           miscutils        TODO
Config.in               _install       modutils         TODO_unicode
configs                 INSTALL        networking       util-linux

먼저 커널처럼 menuconfig를 통해 기본 옵션을 지정합니다.

여기서는 크로스 컴파일이기 때문에 툴체인과 실행할 보드의 아키텍쳐를 지정합니다.
툴체인은 코드벤치를 활용하였습니다. 다른 ARM 툴체인이 있으면 사용가능합니다.
툴체인이 정해졌다면 CROSS_COMPILE 인자로 make와 함께 넘겨줍니다.
ARCH=arm이고 arm=ARM으로 치환되도록 옵션을 아래와 같이 할 수 있겠습니다.

$  make ARCH=arm arm=ARM CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig

커널처럼 설정 메뉴가 뜨면 Busybox Settings -> Build Options -> Build Busybox as a static binary로만 설정한다.
이렇게 하면 라이브러리가 없어도 보드에서 실행됩니다. 라이브러리 의존성을 없애려고 한다면 반드시 지정합니다.

$  make ARCH=arm arm=ARM CROSS_COMPILE=arm-none-linux-gnueabi- clean

클린 후에 아래 처럼 본격적으로 빌드를 시작합니다.


$ make ARCH=arm arm=ARM CROSS_COMPILE=arm-none-linux-gnueabi-

빌드가 끝나면 아래와 같이 설치하시면 됩니다.


$ make ARCH=arm arm=ARM CROSS_COMPILE=arm-none-linux-gnueabi- install

설치가 끝나면 같은 디렉토리에 _install이라는 디렉토리가 있는데 여기에 생긴 파일들을 복사해서

램디스크를 만들 때 함께 패키지를 만들면 작은 용량으로 필요한 리눅스 유틸리티는 모두 사용가능합니다.


busybox-1.23.1$ cd _install/
_install$ ls
bin  linuxrc  sbin  usr
_install$ cd bin/
bin$ ls
ash       df             gzip      makemime    pipe_progress  sleep
base64    dmesg          hostname  mkdir       printenv       stat
busybox   dnsdomainname  hush      mknod       ps             stty
cat       dumpkmap       ionice    mktemp      pwd            su
catv      echo           iostat    more        reformime      sync
chattr    ed             ipcalc    mount       rev            tar
chgrp     egrep          kbd_mode  mountpoint  rm             touch
chmod     false          kill      mpstat      rmdir          true
chown     fatattr        linux32   mt          rpm            umount
conspy    fdflush        linux64   mv          run-parts      uname
cp        fgrep          ln        netstat     scriptreplay   usleep
cpio      fsync          login     nice        sed            vi
cttyhack  getopt         ls        pidof       setarch        watch
date      grep           lsattr    ping        setserial      zcat
dd        gunzip         lzop      ping6       sh