리눅스및안드로이드에서사용되는명령어집합체 Toybox 공개 SW 개발자 Lab 오픈소스프론티어 3 기이창환
임베디드디바이스개발시커널로리눅스를많이사용하는데, 그때그커널과함께리눅스명령어도필요하게된다. 모든명령어를지원하기위해서는다수의개별적인패키지들이필요하다. 한프로젝트에서그많은명령어를한번에지원해준다면자원제약적인임베디드환경에서공간효율성이극대화될것이다. 상대적으로경량화된리눅스명령어세트로 busybox(gpl) 가유명하고, 임베디드업계에서많이사용되고있다. 기능은그보다조금적지만, 좀더자유로운 BSD라이센스를사용하는 Toybox에대해알아보고자한다. [ 목차 ] 1 개요 2 타프로젝트에서도입 3 국내기여자 4 실행해보기 5 저장소 6 사용언어 7 소스코드다운로드및빌드방법 8 패치전달하기 9 외부의존성 10 커뮤니티토론방식 1 개요리눅스배포판에는많은리눅스명령어들이기본으로탑재되어있으며, 대부분의명령어는 GPL 라이센스를따른다. 아주기본이되는명령어들은 GNU 코어유틸리티 (GNU coreutils) 프로젝트에있는명령어 (ls, cp, mkdir 등 ) 들이사용되며, 그외의명령어들의경우각각별도의프로젝트들이진행되고있다. 그러나의존성과바이너리크기등의문제로임베디드환경에서는상대적으로무겁고같이포팅 (porting) 되어야하는이런프로젝트들이많은경우부담스러운것이사실이다. 그래서이런대부분의명령을가볍고간단하게지원하고싶은요구때문에 busybox라는프로젝트가생겨났고유명해졌다. 하지만이프로젝트또한 GPL 라이센스를사용하고있으므로배포시엄격하게소스코드가공개되어야하는의무를지고있다. 그래서비교적최근에시작하는프로젝트의경우도입검토시피하게되는요소이기도했다. 그래서 GPL보다가벼운 BSD라이센스여서소스코드공개가자유로운임베디드용리눅스명령어집합체프로젝트가생기게되었는데, 이것이바로 Toybox프로젝트 (https://landley.net/toybox) 이다.
[ 그림 1] Toybox 프로젝트로고 [ 그림 1] 은프로젝트로고로실제로벽에다콜라캔을 Rob Landley 본인이직접쌓아서찍은것이 다. 코카콜라제로 (0) 와펩시원 (1) 을이진표기로사용하여프로젝트이름인 toybox 의각알파벳을 8bit ASCII 코드로나타냈으며맨아래제로만있는줄은 NULL(0) 처리로표시되었다. 2 타프로젝트에서도입 2006년부터시작한이프로젝트는비교적최근에유명한프로젝트에도입되고있는데, 그대표적인프로젝트가 Android Open Source Project( 이하 AOSP) 와 Tizen이다. 프로젝트에대한통제권을강화하기위해될수있으면 GPL을피하는프로젝트에서많이채택되는추세인데, 구글의경우 Android 프로젝트메이저버전업을할때진행중인모든사항을미리공개하지않고정식릴리즈가된이후에코드를공유한다. 이경우 GPL을사용하는경우라면진행중인경우라도베타버전바이너리를배포할때에도코드가공개되어야하나 GPL을사용하지않는것은공개의무가없으므로소스공개에대해통제를할수있는장점이있어코드공개에대한시기를통제할수있다. 3 국내기여자국내에는이프로젝트에삼성전자엔지니어들이일부참여하고있는데, 그이유는삼성전자가참여하고있는 Tizen 프로젝트가 Toybox를리눅스명령어로채택하고있어국내삼성전자엔지니어들이 Toybox 코드에기여하고있다.
4 실행해보기 안드로이드 6.0 마시멜로버전이후부터이프로젝트가도입되어사용되고있으며, 해당이상버전 의안드로이드단말을가지고있으면이프로젝트명령어를사용해볼수있다. [ 그림 2] AOSP 의 Toybox 저장소페이지 (https://android.googlesource.com/platform/external/toybox) 현재안드로이드 7.0 Nougat 버전에서지원되는 toybox 명령어는 [ 그림 3] 과같다. [ 그림 3] Nexus 9 Android 7.0 Nougat 버전의 ADB shell 에서 toybox 실행결과 Android SDK를설치하면 ADB가설치되는데, ADB shell에서위의명령어를입력하면확인할수있다. 현재만들어진모든명령어가안드로이드에서사용되지않으면, 구글엔지니어인 Elliot Hughes 가하나씩추가해넣고있으며, 안드로이드용개발로드맵도별도로존재한다. Tizen을 OS로사용하는단말인삼성전자의기어시리즈에서도 Android ADB와유사한 SDB를통해해당프로젝트가사용되고있는것을확인할수있다. 일반리눅스머신에서사용해보기위해아래와같이이미빌드된실행파일을가져와서실행해볼
수있다. $ wget https://landley.net/toybox/bin/toybox-x86_64 $ chmod +x toybox-x86_64 $./toybox-x86_64 5 저장소메인테이너인롭랜들리의개인저장소에서 Mercurial로코드가관리되고있다가 Github로저장소를옮기면서현재 git으로코드관리를하고있으며, 그저장소의위치는 https://github.com/landley/toybox.git 이다. 그리고약 1주에서 2주간격으로이저장소에서소스코드를가져와서 AOSP 저장소 (https://android.googlesource.com/platform/external/toybox/) 에구글엔지니어가반영하고있다. 그래서안드로이드에서발견된 Toybox버그패치의경우원저장소에반영해야안드로이드에도같이자연스럽게반영이된다. 6 사용언어 역사와전통을자랑하며 Linux Kernel 의개발언어인 C 프로그래밍언어로만들어져있다. 7 소스코드다운로드및빌드방법 $ git clone https://github.com/landley/toybox.git $ make defconfig $ make $./toybox
[ 그림 4] 디폴트빌드시지원되는 Toybox 명령어 [ 그림 4] 의결과는 defconfig 옵션으로디폴트빌드를할경우빌드된바이너리가지원하는명령어셋인데, 현재안드로이드 7.0 Nougat 버전과조금다름을알수있다. 디폴트빌드를할경우 toys/pending에있는명령어들은빌드가되지않는데, 이것은외부에서전달되고메인테이너가좀더수정이필요하다고판단되는것들을관리하는디렉토리여서디폴트빌드에포함되지않는다. 그래서빌드에러나발생하거나경고가많이나오는것을볼수있다. 빌드에러가발생할경우적절하게빌드오류를수정하여패치도할수있다. $ make allyesconfig 이옵션으로빌드를할경우디폴트빌드와달리 toys/pending에있는명령어까지모두포함해서빌드가가능하다. 만약새로운명령어를넣어서빌드를할경우이 pending 디렉토리에넣고빌드해서소스코드를넘기고나중에메인테이너가완성도가높다고판단되면적절한디렉토리로옮겨서관리된다. [ 그림 5] 는위의디폴트빌드에포함된명령어뿐만아니라 toys/example, toys/pending에포함된명령어까지빌드된결과이다.
[ 그림 5] 전체빌드시지원되는 Toybox 명령어 $ make distclean 빌드로인해생긴오브젝트파일들을없애주는옵션이다. 이전빌드시생성된파일들이다음빌드 에영향을주는경우가많이발생하니빌드전에항상클린후에빌드하는것이좋다. 8 패치전달하기만약에러가발견되거나문서작업등으로인해수정내역을보내기위해서는 Github의 Pull Request를보내어반영을요청하여반영될수도있으나, 공식적으로는패치파일을메일로보내는것으로명시하고있다. 패치파일을만드는방법은아래와같다. $ git format-patch -1 $HASH 위 -1은커밋수를지정하는것인데만약 2개이상의커밋을보내야할경우라면각각의파일로패치파일을만들어보내는것을권장한다. 그리고 $HASH는커밋해쉬값을넣어주면된다. 9 외부의존성 이프로젝트는다른프로젝트의의존성을완전히없애고자노력을하고있지만, 일반적인기능지원 을위해외부라이브러리를쓰는경우가발생하고있다. md5sum 명령이나 wget 의 HTTPS 기능을
지원하기위해암호화기능과관련해서 openssl 을가져다쓰고있는데, 이것을직접프로젝트내에 서구현하여사용하려면많은시간과노력이들기때문에직접구현하지않고사용하고있다. 10 커뮤니티토론방식 [ 그림 6] 메일저장소 아주구시대적이기는하나메일링리스트와 IRC를통해의견교환과커뮤니티소통을하고있다. 사실 Github가이런기능들을아주손쉽게제공해주고있으나메인테이너가잘활용하지않아사용되지않는다. [ 그림 6] Github 이슈에글을작성할경우메인테이터가메일링리스트로공유하고답변도메일링리스트와 Github를통해응답한다.